VC2010操作Excel的方法

第一种方法是添加Microsoft的类库时,在注册表中可以直接找到类库


本文介绍VC2010环境如何实现EXCEL操作,介绍了详细步骤并给出了具体的程序代码。

1. 创建新的C++工程

创建基于对话框的MFC程序

 2. 添加库、添加Excel类库

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

类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 11.0 Object Library<1.5>”在接口列表框中选择需要的类,在此,我们选择

_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

VC2010操作Excel的方法_第1张图片

 

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

3. 修改头文件

分别将加进来的六个头文件上面的“#import "C:Program

FilesMicrosoft OfficeOFFICE11EXCEL.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, {
   CString strPath=file.GetPathName(); m_Path.SetWindowTextW(strPath); CApplication app; CWorkbook book; CWorkbooks books;
   if (!app.CreateDispatch(_T("Excel.Application"))) { }
   //books.AttachDispatch(app.get_Workbooks(),true);


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

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

if(file.DoModal()==IDOK)

} }

//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

CApplication app; CWorkbook book; CWorkbooks books; CWorksheet sheet; CWorksheets sheets; CRange range; CFont font;

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

books = app.get_Workbooks();

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

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

MessageBox(_T("Error!Creat Excel Application Server Faile!")); covTrue((short)TRUE), covFalse((short)FALSE),

covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

//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 = 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(); }

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

8. 在对话框中添加列表控件,并关联变量m_Grid,并设置显示为报表样式。在对话框中

添加“写入列表”按钮,实现将对话框中已有的表写入到Excel中。实现代码如下。 在初始化函数中,先初始化列表。

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

m_Grid.SetExtendedStyle(LVS_EX_FLATSB

|LVS_EX_FULLROWSELECT |LVS_EX_HEADERDRAGDROP |LVS_EX_GRIDLINES);

//扁平风格显示滚动条 //允许整行选中

//允许整列拖动 //单击选中项

//画出网格线

|LVS_EX_ONECLICKACTIVATE

//设置表头

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"))) { }

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("所属部门")};

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

for (int setnum=0;setnum<m_Grid.GetItemCount()+1;setnum++) { }

for (int num=0;num<3;num++) { if (!setnum) }

{ } else { }

range.put_Item(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)),

_variant_t(m_Grid.GetItemText(setnum-1,num)));

range.put_Item(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)),

_variant_t(sText[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();

}

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

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

 

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

VC2010操作Excel的方法_第2张图片

http://vcsos.com/Article/pageSource/140729/20140729221859.shtml


第二种方法,如果在注册表中没有office的类库,则直接在office的安装目录下添加类库

mfc操作excel方法一般有两种,一种是用odbc操作,另一种就是本文的加入excel类库操作

1.   
选择Menu-> View-> ClassWizade,打开ClassWizade窗口,在Automation中,选择Add Class-> From a type library,选择D:\Program Files\Microsoft Office\office\Excel.exe(D:\Program Files\Microsoft Office\是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,(个人一般是全部都加上,因为不知道哪个有啥用微笑)分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。   


2.InitInstance()里
  if(!AfxOleInit())
 {
  AfxMessageBox("初始化OLE出错!");
  return FALSE;
 }

 3.
在ExcelTestDlg.cpp文件的头部,#include "ExcelTestDlg.h "语句之下,

增加 :   
#include "Excel9.h "   (看你导入后生成头文件是啥,我之前导07 ,就是Excel.h)

4.

ExcelTestDlg.cpp文件中需要加的地方加上

[cpp]  view plain copy
  1.     _Application app;      
  2.     Workbooks books;  
  3.     _Workbook book;  
  4.     Worksheets sheets;  
  5.     _Worksheet sheet;  
  6.   
  7.     LPDISPATCH lpDisp;      
  8.   
  9.     Range range;  
  10.     Font font;  
  11.     Range cols;  
  12.     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);  
  13.       
  14.     if(!app.CreateDispatch("Excel.Application"))   
  15.     {  
  16.         AfxMessageBox("无法启动Excel服务器!");  
  17.         return;  
  18.     }  
  19.           
  20.         /  
  21.       
  22.     Range usedRange;  
  23.     usedRange.AttachDispatch(sheet.GetUsedRange());  
  24.     range.AttachDispatch(usedRange.GetRows());  
  25.     long iRowNum=range.GetCount();                   //已经使用的行数  
  26.       
  27. range.AttachDispatch(sheet.GetCells(),true);   //得到所有元素  
  28.     //******************  
  29.     CString a;  
  30.     a.Format("%d",iRowNum);  
  31. //  AfxMessageBox(a);  
  32.   
  33.         range.SetItem(COleVariant((long)(iRowNum+1)),COleVariant((long)1),COleVariant("fuck1"));  
  34.         range.SetItem(COleVariant((long)(iRowNum+1)),COleVariant((long)2),COleVariant("fuck1"));  
  35.         range.SetItem(COleVariant((long)(iRowNum+1)),COleVariant((long)3),COleVariant("fuck1"));  
  36.         range.SetItem(COleVariant((long)(iRowNum+1)),COleVariant((long)4),COleVariant("fuck1"));  
  37.   
  38.         book.Save();  
  39.   
  40.         book.Close(covOptional,COleVariant("C:\\\\1.xls"),covOptional);  
  41.  books.Close();        
  42.  app.Quit();   


我在c盘建了个1.xls

备注:使用vc6.0 excel 03没问题,使用excel 07 时也可以就是类导入的位置不一样,在D:\Program Files\Microsoft Office\Office12中,直接导excel.exe就行了,然后在c盘建个表格,保存为97-03兼容模式就ok了

5.

4中是写,读取时如下

 

[cpp]  view plain copy
  1. _Application app,pApp;  
  2. pApp.AttachDispatch(range.GetItem(COleVariant((long)(iRowNum)),COleVariant((long)(1))).pdispVal,true);  
  3. CString b;  
  4. b=pApp.GetValue();  
  5. AfxMessageBox(b);  
http://blog.sina.com.cn/s/blog_71265dc90101b3i7.html

你可能感兴趣的:(VC2010操作Excel的方法)