VS2010生成Excel报表
本文主要通过OLE/COM实现了对Excel表格的操作。当然了,还有解析Excel表格文件方法,通过OLE/COM的实现方法可以实现。
4年前曾用过VC++6.0生成Excel业务报表,代码完全移植进VS2010系统中却发现编译不通过。出现异常总结为两条:
1、 error2011:”Font”、”Struct”重定义
2、 “InvokeHelper”找不到标识符
说明:排查代码发现,C:\ProgramFiles\Microsoft Visual Studio 10.0\VC\include\comdef.h(312) : Font”
和 “d:\vs2010projects\vd_20151109\vd\excel.h(846): excel::Font”两者重复定义了。
解决方法是:使用namespace。namespace主要为避免Font定义冲突。所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙。
修改后的excel.h、excel.cpp及生成excel报表的XXX.cpp如下:
<1> excel.h:
//Machine generated IDispatch wrapper class(es) created with ClassWizard
///说明:excel.h封装了_Application、_Workbook、Workbooks、_Worksheet、Worksheets、Range、Font、
Window、Borders、Border、Interior这些类的方法的全部声明
//_Application wrapper class
namespaceexcel{//这里使用namespace
class _Application : publicCOleDispatchDriver{};
class _Workbook : publicCOleDispatchDriver{};
…………//此处省略多个方法的声明
class Interior : publicCOleDispatchDriver{};
}
<2> excel.cpp如下:
// Machine generated IDispatchwrapper class(es) created with ClassWizard
#pragma once
#include "stdafx.h"
#include "excel.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undefTHIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///说明:excel.cpp封装了_Application、_Workbook、Workbooks、_Worksheet、Worksheets、Range、Font、Window、Borders、Border、Interior这些类的全部方法
namespaceexcel{//注意namespace的使用
/
// _Application properties
/
// _Application operations
LPDISPATCH_Application::GetApplication()
{
LPDISPATCHresult;
InvokeHelper(0x94,DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result,NULL);
return result;
}
……………….//此处省略多个方法
LPDISPATCHInterior::GetGradient()
{
LPDISPATCHresult;
InvokeHelper(0xa55,DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result,NULL);
return result;
}
}
<3>:xxx.cpp头文件添加excel.h:
#include"excel.h"
using namespaceexcel;//主要为避免Font定义冲突。
主要响应代码为:
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
_Application ExcelApp;
Workbooks ZongheBooks;
_Workbook ZongheBook;
Worksheets ZongheSheets;
_Worksheet ZongheSheet;
Range ZongheRange;
//初始excel
if(!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}
ExcelApp.SetVisible(false);
ZongheBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
ZongheBook = ZongheBooks.Add(covOptional);
ZongheSheets.AttachDispatch(ZongheBook.GetWorksheets(),true);
ZongheSheet.AttachDispatch(ZongheSheets.GetItem(_variant_t((long)3)),TRUE);
ZongheSheet.Delete();
ZongheSheet.AttachDispatch(ZongheSheets.GetItem(_variant_t("sheet1")),true);
ZongheSheet.SetName("数据");
Window ActiveWindow;
ActiveWindow.AttachDispatch(ExcelApp.GetActiveWindow());
ActiveWindow.SetZoom(COleVariant((short)75));
//得到全部Cells,开始设置单元格内容
ZongheRange.AttachDispatch(ZongheSheet.GetCells(),true);
//ZongheRange.SetColumnWidth(_variant_t((long)12));
ZongheRange.SetRowHeight(_variant_t((long)18));
ZongheRange.SetHorizontalAlignment(_variant_t((long)-4108));
ZongheRange.SetVerticalAlignment(_variant_t((long)-4108));
//设置第 6 行内容,即各参数名称
ZongheRange.SetItem(_variant_t((long)6),_variant_t((long)1),_variant_t("ID"));
excel::Font Font1;
ZongheRange.AttachDispatch(ZongheSheet.GetRange(_variant_t("A6"),_variant_t("Y6")),TRUE);
Font1.AttachDispatch(ZongheRange.GetFont());
Font1.SetName(COleVariant("楷体"));
Font1.SetSize(_variant_t((long)14));
ZongheRange.AttachDispatch(ZongheSheet.GetCells(),true);//注意这里,每次想操作每一列的时候都要先得到全部cells
ZongheRange.AttachDispatch(ZongheRange.GetItem(_variant_t((long)6),vtMissing).pdispVal,true);
ZongheRange.AttachDispatch(ZongheSheet.GetRange(_variant_t("A6"),_variant_t("Y6")),TRUE);
ZongheRange.SetRowHeight(_variant_t((long)30));
//设置 第一行
ZongheRange.AttachDispatch(ZongheSheet.GetRange(_variant_t("A1"),_variant_t("J1")),TRUE);
ZongheRange.Merge(_variant_t((long)0));
Font1.AttachDispatch(ZongheRange.GetFont());
Font1.SetName(COleVariant("华文新魏"));
Font1.SetSize(_variant_t((long)28));
Font1.SetColorIndex(_variant_t((long)11));
ZongheRange.AttachDispatch(ZongheSheet.GetCells(),true);
ZongheRange.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("Excel数据报表"));
ZongheRange.AttachDispatch(ZongheSheet.GetCells(),true);
ZongheRange.AttachDispatch(ZongheRange.GetItem(_variant_t((long)1),vtMissing).pdispVal,true);
ZongheRange.SetHorizontalAlignment(_variant_t((long)-4108));
ZongheRange.SetRowHeight(_variant_t((long)39));
CString tcFileName1;
tcFileName1=ini.filePath+"\\excel\\";
ZongheSheets.AttachDispatch(ZongheBook.GetWorksheets(),true);
ZongheSheet.AttachDispatch(ZongheSheets.GetItem(_variant_t("数据")),true);
ZongheSheet.Activate();
CStringexcelfilename=tcFileName1+m_Data_View_List.GetItemText(selectrow,5)
+"_"+m_Data_View_List.GetItemText(selectrow,6)
+"_"+m_Data_View_List.GetItemText(selectrow,7)
+"_"+m_Data_View_List.GetItemText(selectrow,3)
+"_"+m_Data_View_List.GetItemText(selectrow,4).Left(23)+".xls";
//保存报表
ExcelApp.SetAlertBeforeOverwriting(false);
ExcelApp.SetDisplayAlerts(false);
try
{
ZongheSheet.SaveAs(excelfilename,
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing);
ExcelApp.SetVisible(true);
}
catch(_com_errore)///捕捉异常
{
}
//退出excel
//ExcelApp.Quit();
//ZongheBooks.Close();
//释放对象(很重要)
ZongheRange.ReleaseDispatch();
ZongheSheet.ReleaseDispatch();
ZongheSheets.ReleaseDispatch();
ZongheBook.ReleaseDispatch();
ZongheBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();