您的位置:首页 > 其它

在VC++中实现Excel数据的导出/导入

2011-05-21 10:38 711 查看
只是简单的把功能实现了,在导出大量数据的时候有明显的延迟,也只能先这样了,那有时间去优化啊,估计在使用了多线程等优化手段后速度会有大的改善。把这段代码放在自己的空间里,以后也许用的着。
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;
CString exeId;
CString exeName;
CString exeType;

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: