软件:vs2013
程序功能:将ListControl内容导出到Excle里
步骤:
第一步:创建基于对话框的MFC工程
第二步:添加库、添加Excle类库
在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“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();
最终结果如下:
按下导出按钮后