C++ 操作Excel

简介: 预期实现结果:C++可对Excel表精确进行某一行某一列的增加、修改、删除、查询数据预演环境:Window7+VS2013+office2013(32位)、2010(64位)、2007(64位)2003(64位)+WPS2016(位)预演方法:1、 ODBC方式访问2、 通过解析Excel表格文件3、 通过OLE/COM方式访问可行性分析:2003版本office办公软件创建Excel表的后缀.xls 而以后的高版本创建表后缀为.xlsx。

预期实现结果:

C++可对Excel表精确进行某一行某一列的增加、修改、删除、查询数据

预演环境:

Window7+VS2013+office2013(32位)、2010(64位)、2007(64位)2003(64位)+WPS2016(位)

预演方法:

1、 ODBC方式访问

2、 通过解析Excel表格文件

3、 通过OLE/COM方式访问

可行性分析:

2003版本office办公软件创建Excel表的后缀.xls 而以后的高版本创建表后缀为.xlsx。是用新的基于XML的压缩文件格式取代了其目前专有的默认文件格式,在传统的文件名扩展名后面添加了字母x(即.docx取代.doc、.xlsx取代.xls,等等),使其占用空间更小,可以向下兼容xls。

这样造成以前通过ODBC方式访问和通过解析Excel表格文件的方法代表无法解析高版本的xlsx文件,因此选择OLE/COM方式访问可以一劳永逸的解决所有的版本问题。**

OLE/COM方式访问步骤:

1. 新建MFC工程

2. 配置工程,添加组件类接口

导入OLE/COM组件的接口的步骤为:项目->类向导->添加类->类型库中的MFC类,先选择要导入的组件所在的路径,即Excel.exe所在的路径。导入接口中所用到类方法接口如下图所示:

这里写图片描述
这里写图片描述

3. 将各个导入的头文件“#import “C:\Program Files\Microsoft Office\Office12\EXCEL.EXE” no_namespace中部分注释掉。在:#include <、afxdisp.h>加入上面7个头文件文件

4.代码实现

  1. 在对话框Dlg.h定义接口变量

    CApplication app;
    CWorkbook book;
     CWorkbooks books;
    CWorksheet sheet;
    CWorksheets sheets;
    CRange range;
    CRange cols;
    LPDISPATCH lpDisp;
    
  2. 对话框中拖拽两个按钮,分别命名为导入和导出

  3. 实现导入导出的功能

    导入:

    void CCpp_ExcleDemoDlg::OnBnClickedButton1()
        {
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (!app.CreateDispatch(_T("Excel.Application")))
    {
        this->MessageBox(_T("无法创建Excel应用!"));
    }
        books = app.get_Workbooks();
        //打开Excel,其中pathname为Excel表的路径名  
        lpDisp = books.Open(_T("D:\\工作簿1.xlsx"), covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
        book.AttachDispatch(lpDisp);
        sheets = book.get_Worksheets();
        sheet = sheets.get_Item(COleVariant((short)1));
        //获得坐标为(A,1)的单元格 
        range = sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("A1")));
        //获得单元格的内容 
        COleVariant rValue;
        rValue = COleVariant(range.get_Value2());
        //转换成宽字符  
        rValue.ChangeType(VT_BSTR);
        //转换格式,并输出 
        this->MessageBox(CString(rValue.bstrVal));
        book.put_Saved(TRUE);
        app.Quit();
    }
    

导出:

    void CCpp_ExcleDemoDlg::OnBnClickedButton2()
    {
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
           if (!app.CreateDispatch(_T("Excel.Application")))
       {
            this->MessageBox(_T("无法创建Excel应用!"));

        }
     books = app.get_Workbooks();
    //打开Excel,其中pathname为Excel表的路径名  

         book = books.Add(covOptional);
    sheets = book.get_Worksheets();
    sheet = sheets.get_Item(COleVariant((short)1));  //获得坐标为(A,1)和(B,1)的两个单元格 
    range = sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("B1")));  //设置单元格类容为Hello Exce
     range.put_Value2(COleVariant(_T("Clear Excel Demo")));  //选择整列,并设置宽度为自适应 
    cols = range.get_EntireColumn();
    cols.AutoFit();

     //获得坐标为(C,2)单元格 
         range = sheet.get_Range(COleVariant(_T("C2")), COleVariant(_T("C2")));
    //设置公式“=RAND()*100000”
         range.put_Formula(COleVariant(_T("=RAND()*100000")));
     //设置数字格式为货币型  
         range.put_NumberFormat(COleVariant(_T("$0.00")));
     //选择整列,并设置宽度为自适应  
         cols = range.get_EntireColumn();
     cols.AutoFit();
    //显示Excel表
     app.put_Visible(TRUE);
     app.put_UserControl(TRUE);
    }

Demo代码功能概述:

Demo实现对某一行某一列数据进行读取、准确输入某一行某一列

OLE/COM方式编程注意事项

有错误error C2059双击error C2059,将VARIANT DialogBox()改成VARIANT _DialogBox()再次编译,则可以通过

附上Demo的下载地址http://download.csdn.net/detail/it_ds/9762897

相关文章
|
2月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
64 0
|
2月前
|
Java Apache
EasyPOI操作Excel从零入门
我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子)开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子,EasyPOI封装了Apache的POI技术,实现了基本的Excel导入、导出从此不再为Excel操作头疼~
329 2
EasyPOI操作Excel从零入门
|
2月前
|
存储 数据处理 索引
Python操作Excel常用方法汇总
Python操作Excel常用方法汇总
188 0
|
1月前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
2月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
71 0
|
6天前
|
C#
C#NPOI操作Excel详解
C#NPOI操作Excel详解
10 0
|
7天前
|
存储 安全 算法
【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]
【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]
15 1
|
16天前
|
数据挖掘 数据库连接 数据处理
精通Excel意味着熟练掌握基础及进阶操作
精通Excel意味着熟练掌握基础及进阶操作,如数据透视表、VBA编程和自定义公式。提升效率的技巧包括善用快捷键、自动化重复任务、巧用公式与函数(如SUM和VLOOKUP)、利用数据透视表分析数据、设置条件格式、建立数据库连接、编写自定义函数、创建数据图表、使用模板和进行分组汇总。这些方法能有效提升数据分析和处理能力,优化工作效率。
111 2
|
29天前
|
存储 C++
二叉树的操作(C++实现)
二叉树的操作(C++实现)
|
29天前
|
C++
有序链表的操作(底层c++实现)
有序链表的操作(底层c++实现)