VC2010对Excel的操作

 

1.         创建新的C++工程

创建基于对话框的MFC程序

2.         添加库、添加Excel类库

在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~

 

类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 11.0 Object Library<1.5>”在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~

 

可以看到,六个类被添加了进来。

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~

 

3.         修改头文件

分别将加进来的六个头文件上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注释掉。

4.         添加头文件

在stdAfx.h头文件中添加加进来的这几个头文件

#include "CApplication.h"

#include "CRange.h"

#include "CWorkbook.h"

#include "CWorkbooks.h"

#include "CWorksheet.h"

#include "CWorksheets.h"

5.         修改错误

编译,会出现两个错误:

…\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()”,这样就可以编译成功了。

6.         在对话框中添加一个编辑框,并为其关联一CEdit类型变量m_Path,添加“打开”按钮,实现打开一已经存在的Excel文件。并将路径显示在编辑框中。实现代码如下。

void CExportToExcelDlg::OnBnClickedButtonOpen()

{

     CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

              _T("EXCEL文件t(*.xls;*.xlsx)|*.xls;*.xlsx||"),AfxGetMainWnd());

     if(file.DoModal()==IDOK)

     {

              CString strPath=file.GetPathName();

              m_Path.SetWindowTextW(strPath);

              CApplication app;

              CWorkbook book;

              CWorkbooks books;

              if (!app.CreateDispatch(_T("Excel.Application")))

              {

                       MessageBox(_T("Error!Creat Excel Application Server Faile!"));

                       exit(1);

              }

              //books.AttachDispatch(app.get_Workbooks(),true);

              //book.AttachDispatch(books.Add(_variant_t(strPath)));

              books = app.get_Workbooks();                  

              book = books.Add(_variant_t(strPath));

 

              app.put_Visible(true);

 

              //结尾,释放

              book.ReleaseDispatch();  

              books.ReleaseDispatch();  

              app.ReleaseDispatch();

              app.Quit();

 

     }

}

 

7.         在对话框中添加“写入”按钮,实现新建一Excel文件(存在则覆盖),并向文件中写入数据。实现代码如下。

void CExportToExcelDlg::OnBnClickedButtonWrite()

{

     CString strFile = _T("D:\\WriteToExcelTest.xlsx");

 

     COleVariant

              covTrue((short)TRUE),

              covFalse((short)FALSE),

              covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);

 

     CApplication app;

     CWorkbook book;

     CWorkbooks books;

     CWorksheet sheet;

     CWorksheets sheets;

     CRange range;

     CFont font;

 

     if (!app.CreateDispatch(_T("Excel.Application")))

     {

              MessageBox(_T("Error!Creat Excel Application Server Faile!"));

     }

 

     books = app.get_Workbooks();

     //books.AttachDispatch(app.get_Workbooks());可代替上面一行

     book = books.Add(covOptional);

     //book.AttachDispatch(books.Add(covOptional),true); 可代替上面一行

     sheets=book.get_Worksheets();

     //sheets.AttachDispatch(book.get_Worksheets(),true); 可代替上面一行

     sheet = sheets.get_Item(COleVariant((short)1));

     //sheet.AttachDispatch(sheets.get_Item(_variant_t("sheet1")),true); 可代替上面一行

     //下面两行,是向A1中写入"Yeah!I can write data to excel!"

     range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("A1")));

     range.put_Value2(COleVariant(_T("Yeah!I can write data to excel!")));

    

     //下面是向第二行的前十个单元格中输入1到10,十个数字

     for(long i=1;i<11;i++)

              range.put_Item(_variant_t((long)2),_variant_t((long)i),_variant_t((long)i));

 

     //设置列宽

     range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("J1")));

     range.put_ColumnWidth(_variant_t((long)5));

 

     //显示表格

     app.put_Visible(TRUE);

 

     //保存

     book.SaveCopyAs(COleVariant(strFile));

     book.put_Saved(true);

 

     //结尾,释放

     book.ReleaseDispatch();  

     books.ReleaseDispatch();  

     app.ReleaseDispatch();

     app.Quit();

 

}

 

8.         在对话框中添加列表控件,并关联变量m_Grid,并设置显示为报表样式。在对话框中添加“写入列表”按钮,实现将对话框中已有的表写入到Excel中。实现代码如下。

在初始化函数中,先初始化列表。

//设置列表视图的扩展风格

         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,100,0);

         m_Grid.InsertColumn(1,_T("姓名"),LVCFMT_LEFT,100,1);

         m_Grid.InsertColumn(2,_T("所属部门"),LVCFMT_LEFT,100,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("宣传部"));

 

再编写按钮的响应函数

void CExportToExcelDlg::OnBnClickedButtonWritelist()

{

         // TODO: 在此添加控件通知处理程序代码

         CString strFile = _T("D:\\WriteListToExcelTest.xlsx");

 

         COleVariant

                   covTrue((short)TRUE),

                   covFalse((short)FALSE),

                   covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);

 

         CApplication app;

         CWorkbook book;

         CWorkbooks books;

         CWorksheet sheet;

         CWorksheets sheets;

         CRange range;

 

         if (!app.CreateDispatch(_T("Excel.Application")))

         {

                   MessageBox(_T("Error!Creat Excel Application Server Faile!"));

                   exit(1);

         }

         books = app.get_Workbooks();

         book = books.Add(covOptional);

         sheets = book.get_Worksheets();

         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++)

         {

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

                            }

                   }

         }

         //保存

         book.SaveCopyAs(COleVariant(strFile));

         book.put_Saved(true);

         app.put_Visible(true);

        

         //释放对象

         range.ReleaseDispatch();

         sheet.ReleaseDispatch();

         sheets.ReleaseDispatch();

         book.ReleaseDispatch();

         books.ReleaseDispatch();

         app.ReleaseDispatch();

         app.Quit();

 

}

最终结果如下。

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~

 

按【打开】按钮,出现打开对话框,可选择Excel打开。

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~

 

按【写入】按钮,打开Excel文件。

 

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~

 

按下【写入列表】,打开Excel文件。

[转]VC2010对Excel的操作 - mxy19832010 - 蓝色控~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值