MFC导出到Excel

https://blog.csdn.net/cai_niaocainiao/article/details/81606324

软件:vs2013
程序功能:将ListControl内容导出到Excel里
步骤:
第一步:创建基于对话框的MFC工程
第二步:添加库、添加Excel类库
在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 12.0 Object Library<1.6>”在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

但是有的接口里没东西,例如:

怎么办呢?不急。可以选“文件”,找到EXCEL.EXE的位置,来进行添加:(我的位置在:D:\office\Office14\EXCEL.EXE)

第三步:修改头文件
分别将加进来的六个头文件上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注释掉。

第四步:编译,修改错误
编译,会出现两个错误:

…\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足

…\crange.h(335): error C2059: 语法错误:“,”

双击错误提示,定位在错误行,

    VARIANT DialogBox()

    {

         VARIANT result;

         InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);

         return result;

    }

将该函数名“DialogBox()”前面加“_”下划线,即“_DialogBox()”,这样就可以编译成功了。

第五步:删除对话框内容,添加对应控件
1.在对话框中添加列表控件,关联变量m_Grid,并设置显示为报表样式:

打开工具箱选择List Control(列表控件),移到合适位置后,更改属性,鼠标右击选择“属性”,View-->Report,Border-->True

添加变量:类别Control,变量名m_Grid

2.在对话框中添加“导出”按钮

第六步:代码(可以直接将代码复制运行下)
添加头文件

#include "CWorkbook.h"                //管理单个工作表
#include "CWorkbooks.h"         //统管所有的工作簿
#include "CApplication.h"          //Excel应用程序类,管理我们打开的这整个Excel应用
#include "CRange.h"               //区域类,对EXcel的大部分操作都要和这个打招呼
#include "CWorksheet.h"            //工作薄中的单个工作表
#include "CWorksheets.h"            //统管当前工作簿中的所有工作表
在初始化函数中,先初始化列表(C导出到ExcleDlg::OnInitDialog)红框里为添加的代码位置

//设置列表视图的扩展风格
    m_Grid.SetExtendedStyle(LVS_EX_FLATSB            //扁平风格显示滚动
        | LVS_EX_FULLROWSELECT                       //允许整行选中
        | LVS_EX_HEADERDRAGDROP               //允许整列拖动
        | LVS_EX_ONECLICKACTIVATE                //单击选中项
        | LVS_EX_GRIDLINES                  //画出网格线
        );
    //设置表头
    m_Grid.InsertColumn(0, _T("编号"), LVCFMT_LEFT, 80, 0);
    m_Grid.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 80, 1);
    m_Grid.InsertColumn(2, _T("所属部门"), LVCFMT_LEFT, 80, 2);
 
    //向列表中插入数据
    int count = 0;
    m_Grid.InsertItem(count, _T("001"));//行
    m_Grid.SetItemText(count, 1, _T("张一"));
    m_Grid.SetItemText(count++, 2, _T("销售部"));
 
    m_Grid.InsertItem(count, _T("002"));
    m_Grid.SetItemText(count, 1, _T("张二"));
    m_Grid.SetItemText(count++, 2, _T("研发部"));
    m_Grid.InsertItem(count, _T("003"));
    m_Grid.SetItemText(count, 1, _T("张三"));
    m_Grid.SetItemText(count++, 2, _T("采购部"));
    m_Grid.InsertItem(count, _T("004"));
    m_Grid.SetItemText(count, 1, _T("张四"));
    m_Grid.SetItemText(count, 2, _T("宣传部"));
编写按钮的响应函数:
 

    CString strFile = _T("E:\\Test.xls");
    COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    CApplication app;
    CWorkbooks books;
    CWorkbook book;
    CWorksheets sheets;
    CWorksheet sheet;
    CRange range;
    CFont font;
    if (!app.CreateDispatch(_T("Excel.Application")))
    {
        MessageBox(_T("创建失败!"));
        return;
    }
 
    books = app.get_Workbooks();
    book = books.Add(covOptional);
    sheets = book.get_Worksheets();             //得到books
    sheet = sheets.get_Item(COleVariant((short)1));
    //得到全部Cells
    range.AttachDispatch(sheet.get_Cells());
    CString sText[] = { _T("编号"), _T("姓名"), _T("所属部门") };
    for (int setnum = 0; setnum < m_Grid.GetItemCount() + 1; setnum++)   //GetItemCount()列表的里面的条目数量, 横着的  行
    {
        for (int num = 0; num < 3; num++)
        {
            if (!setnum)
            {
                range.put_Item(_variant_t((long)(setnum + 1)), variant_t((long)(num + 1)),
                    _variant_t(sText[num]));
            }
            else
            {
                range.put_Item(_variant_t((long)(setnum + 1)), _variant_t((long)(num + 1)),
                    _variant_t(m_Grid.GetItemText(setnum - 1, num)));//GetItemText()获取第setnum-1行,num列的文本
            }
        }
    }
    //保存
    book.SaveCopyAs(COleVariant(strFile));  //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件
    book.put_Saved(true);   //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
    app.put_Visible(true);        //设置表可见性
 
    //释放对象
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    app.ReleaseDispatch();
    app.Quit();
最终结果如下:


按下导出按钮后


 

猜你喜欢

转载自blog.csdn.net/active2489595970/article/details/88639538