Vc++中实现Excel数据导入和导出
- 格式:docx
- 大小:18.46 KB
- 文档页数:3
只是简单的把功能实现了,在导出大量数据的时候有明显的延迟,也只能先这样了,那有时间去优化啊,估计在使用了多线程等优化手段后速度会有大的改善。把这段代码放在自己的空间里,以后也许用的着。
1、先在对话框中加入一个按钮,ID IDC_BUTTON_EXCEL Caption导出Excel。双击该按钮,增加成员函数void CMPIClientView::OnExcel()。
2、在BOOL MPIClient::InitInstance()中,dlg.DoModal();之前增加代码:
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
在return FALSE;语句前,加入:
CoUninitialize();
3、点View菜单中的ClassWizard(或按CTRL+W),选择Automation标签,点Add Class 并选择"From a type library"浏览并选择你希望自动化的对象库(例如,如果你自动化Microsoft Excel 2000,选择位于C:/Program Files/Microsoft Office/Office/Excel9.olb的Microsoft Excel 9.0对象库。如果你自动化Microsoft Excel 2002和Microsoft Office Excel 2003 ,对象库内含在Excel.exe中,Office 2002的Excel.exe默认位于C:/program
Files/Microsoft Office/Office10/Excel.exe, Office 2003的Excel.exe默认位于C:/program
Files/Microsoft Office/Office11/Excel.exe。选择合适的对象库后,点Open,在类确认列表中选择所有类(一般要用到_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range几个基本的类),点OK。提示:类确认对话框中的列表框里包含了Microsoft Excel类型库中的所有IDispatch接口(与类中一致)。在对话框下面可以看到命名为Excel8.cpp的执行文件,该文件包含了从COleDispatchDriver派生的封装类,头文件是Excel8.h(对于Excel 2002和Excel 2003,文件名为Excel.cpp和Excel.h)。
4、在ExcelTestDlg.cpp文件的头部,增加:
#include "comdef.h"
#include "Excel9.h"(或Excel8.h,Excel.h)
5、在void CMPIClientView::OnExcel()函数中增加如下代码:
int n = 2;
CStringexeId;
CStringexeName;
CStringexeType;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application ExcelApp;
Workbooks MPIBooks;
_Workbook MPIBook;
Worksheets MPISheets;
_Worksheet MPISheet;
Range MPIRange;
//创建Excel 2003服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("Create Excel service failure!");
return;
}
ExcelApp.SetVisible(false);
//利用模板文件建立新文档
MPIBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
MPIBook = MPIBooks.Add(covOptional);
//得到Worksheets
MPISheets.AttachDispatch(MPIBook.GetWorksheets(),true);
//得到sheet1
MPISheet.AttachDispatch(MPISheets.GetItem(_variant_t("sheet1")),true);
//得到全部Cells,此时,MPIRange是cells的集合
MPIRange.AttachDispatch(MPISheet.GetCells(),true);
MPIRange.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("工号")); MPIRange.SetItem(_variant_t((long)1),_variant_t((long)2),_variant_t("姓名")); MPIRange.SetItem(_variant_t((long)1),_variant_t((long)3),_variant_t("机型")); //设置列的宽度
MPIRange.SetColumnWidth(_variant_t((long)12));
while (n < i+2)
{
exeId = m_szDataList.GetItemText(n-2, 1);
exeName = m_szDataList.GetItemText(n-2, 2);
exeType = m_szDataList.GetItemText(n-2, 3);
MPIRange.SetItem(_variant_t((long)n),_variant_t((long)1),_variant_t(exeId));
MPIRange.SetItem(_variant_t((long)n),_variant_t((long)2),_variant_t(exeName)) ;
MPIRange.SetItem(_variant_t((long)n),_variant_t((long)3),_variant_t(exeType));
exeId = "";
exeName = "";
exeType = "";
n++;
}
ExcelApp.SetVisible(true);
ExcelApp.Quit();
MPIRange.ReleaseDispatch();
MPISheet.ReleaseDispatch();
MPISheets.ReleaseDispatch();
MPIBook.ReleaseDispatch();
MPIBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();