MFC 加载 EXCEL 并快速读取大量数据

MFC 加载 EXCEL 并快速读取大量数据MFC 加载 EXCEL 库可以查看 http t csdn cn U8TJU 这里主要记录一下读取 EXCEL 数据的方式 方式一 遍历所有单元格 不适用于大数据量 CApplication CWorkbooksbo CWorkbookboo CWorksheetss CWorksheetsh CRangerange CRangeoCurCe LPDISPATCHlp COleVariantv

 CApplication app1; CWorkbooks books; CWorkbook book; CWorksheets sheets; CWorksheet sheet; CRange range; CRange oCurCell; LPDISPATCH lpDisp; COleVariant vResult; //COleVariant类是对VARIANT结构的封装 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleSafeArray ole_safe_array_; if (S_OK != CoInitialize(NULL)){ 
    return -1; } if (!app1.CreateDispatch(_T("Excel.Application"), NULL)) { 
    MessageBox(NULL,_T("无法启动Excel服务器!"), _T("提示"), MB_ICONWARNING); return 0; } books.AttachDispatch(app1.get_Workbooks()); lpDisp = books.Open(pDlg->m_fileName, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); //得到Workbook (工作簿) book.AttachDispatch(lpDisp); //得到Worksheets (工作表) sheets.AttachDispatch(book.get_Worksheets()); //sheet = sheets.get_Item(COleVariant((short)1)); //得到当前活跃sheet  //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待  lpDisp = book.get_ActiveSheet(); sheet.AttachDispatch(lpDisp); // 获得使用的区域Range(区域) range.AttachDispatch(sheet.get_UsedRange(), TRUE); // 获得使用的行数 long lgUsedRowNum = 0; range.AttachDispatch(range.get_Rows(), TRUE); lgUsedRowNum = range.get_Count(); //获得使用的列数 long lgUsedColumnNum = 0; range.AttachDispatch(range.get_Columns(), TRUE); lgUsedColumnNum = range.get_Count(); //读出sheet的名称 CString strSheetName = sheet.get_Name(); //得到全部Cells,此时CurrRange是cells的集合 range.AttachDispatch(sheet.get_Cells(), TRUE); //遍历整个excel表格 for (int i = 0; i < lgUsedRowNum; i++)//遍历行 { 
    for (int j = 1; j <= lgUsedColumnNum; j++)//遍历列 { 
    oCurCell.AttachDispatch(range.get_Item(COleVariant((long)(i + 1)), COleVariant((long)j)).pdispVal, TRUE); VARIANT varMerge = oCurCell.get_MergeCells(); VARIANT varItemName = oCurCell.get_Text(); //-----------此处部分可自行修改,varItemName是每个单元格的内容 if (i != 0 && j == 1) { 
    pDlg->m_hospitalRecName.push_back(varItemName); } if (i !=0 && j == 2) { 
    pDlg->m_healthCareName.push_back(varItemName); } //----------- } } books.Close(); app1.Quit(); //释放对象  range.ReleaseDispatch(); oCurCell.ReleaseDispatch(); sheet.ReleaseDispatch(); sheets.ReleaseDispatch(); book.ReleaseDispatch(); books.Close(); books.ReleaseDispatch(); app1.Quit(); //此两条关闭代码顺序不能反,否则无法关闭 app1.ReleaseDispatch(); 

方式二:预先加载所有数据,通过遍历提供的封装数组来得到数据,大数量也速度也不慢(目前excel有9W多条数据,1-2秒就读完了)

 CApplication app1; CWorkbooks books; CWorkbook book; CWorksheets sheets; CWorksheet sheet; CRange range; CRange oCurCell; LPDISPATCH lpDisp; COleVariant vResult; //COleVariant类是对VARIANT结构的封装 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleSafeArray ole_safe_array_; if (S_OK != CoInitialize(NULL)){ 
    return -1; } if (!app1.CreateDispatch(_T("Excel.Application"), NULL)) { 
    MessageBox(NULL,_T("无法启动Excel服务器!"), _T("提示"), MB_ICONWARNING); return 0; } books.AttachDispatch(app1.get_Workbooks()); lpDisp = books.Open(pDlg->m_fileName, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); //得到Workbook (工作簿) book.AttachDispatch(lpDisp); //得到Worksheets (工作表) sheets.AttachDispatch(book.get_Worksheets()); //sheet = sheets.get_Item(COleVariant((short)1)); //得到当前活跃sheet  //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待  lpDisp = book.get_ActiveSheet(); sheet.AttachDispatch(lpDisp); // 获得使用的区域Range(区域) range.AttachDispatch(sheet.get_UsedRange(), TRUE); // 获得使用的行数 long lgUsedRowNum = 0; range.AttachDispatch(range.get_Rows(), TRUE); lgUsedRowNum = range.get_Count(); //获得使用的列数 long lgUsedColumnNum = 0; range.AttachDispatch(range.get_Columns(), TRUE); lgUsedColumnNum = range.get_Count(); VARIANT ret = range.get_Value2(); ole_safe_array_.Attach(ret); COleVariant vresult; long read_address[2]; VARIANT val; CString varItemName; //遍历整个excel表格 for (int i = 2; i <= lgUsedRowNum; i++)//遍历行 { 
    read_address[0] = i; for (int j = 1; j <= lgUsedColumnNum; j++)//遍历列 { 
    read_address[1] = j; ole_safe_array_.GetElement(read_address, &val); vresult = val; varItemName = vresult.bstrVal; if (i != 0 && j == 1) { 
    pDlg->m_hospitalRecName.push_back(varItemName); } if (i != 0 && j == 2) { 
    pDlg->m_healthCareName.push_back(varItemName); } } } books.Close(); app1.Quit(); //释放对象  range.ReleaseDispatch(); oCurCell.ReleaseDispatch(); sheet.ReleaseDispatch(); sheets.ReleaseDispatch(); book.ReleaseDispatch(); books.Close(); books.ReleaseDispatch(); app1.Quit(); //此两条关闭代码顺序不能反,否则无法关闭 app1.ReleaseDispatch(); 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230360.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月3日 上午11:01
下一篇 2026年3月3日 上午11:22


相关推荐

  • autoconf产生Makefile流程

    autoconf产生Makefile流程生成Makefile的流程。参考http://www.ibm.com/developerworks/cn/linux/l-makefile/首先进入project目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下:1)运行autoscan命令2)将configure.scan文件重命名为configure.

    2022年6月3日
    39
  • hi3516dv300芯片手册_hi3518ev300

    hi3516dv300芯片手册_hi3518ev300基于Hi3516DV300的嵌入式入门演练(上)基于Hi3516DV300的嵌入式入门演练(下)文章目录信息5常见外设操作5.1USB无线网卡5.1.1在内核中开启驱动支持5.1.2准备驱动需使用到的固件文件5.1.3使用wpa_supplicant连接到热点5.1.4使用hostapd将网卡作为AP5.2TF卡的挂载5.2.1手动挂载5.2.2使用mdev自动挂载设备5.2.3使用udev自动挂载设备6扩展演练6.1使用Buildroot构建根文件系统6.2理解设备树6.3

    2026年3月2日
    5
  • C++实践(四):C++实现AES-CMAC算法

    C++实践(四):C++实现AES-CMAC算法AES CMACAES CMAC 使用了高级加密标准作为组分 为了产生一个消息认证码 CMAC 需要一个密钥 消息 message 及消息的长度 length 作为输入 输出是消息认证码 AES CMAC 的核心是 CBC MAC 对于待加密消息 M 应用 CBC MAC 算法 在 CMAC 操作中有两种情况 如果输入消息长度等于 Block 的整数倍 最后的 BlockM n 需要先于 K1 异或再进行处理 如果输

    2026年3月19日
    2
  • YourPHP笔记

    YourPHP笔记

    2021年10月9日
    73
  • vue改写数组方法_vue数组添加和删除

    vue改写数组方法_vue数组添加和删除Vue将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:push()pop()shift()unshift()splice()sort()reverse()以上七个数组都会改变原数组,下面来分别讲解它们的区别:varlist=[3,4,5,6]1.push()向数组的尾部添加若干元素,并返回数组的新长度;list.push(7,8)…

    2025年11月21日
    5
  • 带你用最简单的方式获得小米完整root权限(无需刷第三方rom)

    带你用最简单的方式获得小米完整root权限(无需刷第三方rom)前提小米手机已经解锁并且刷入开发版 在安全中心打开 root 下载 adbadb 工具即 AndroidDebug Android 调试桥 用这个工具可以直接操作管理 android 模拟器或 android 设备 好了这不是今天的主要内容 链接在此 http adbshell com downloads 压缩包里面是这个样子解压 然后去 C Windows System32

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号