VS2010生成Excel报表

 

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值