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这六个就可以了。

可以看到,六个类被添加了进来。
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();
}
最终结果如下。

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

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

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

VC2010对Excel的操作的更多相关文章
- VS2010 MFC对Excel的操作
这是帮别人做项目遇到的一个问题,的那个是纠结了老长时间,本以为是一件很轻松的事... 首先,这里采用了OLE来对Excel进行操作,网上其实有大把的例子,虽然都可以运行,但是并不能满足项目要求,其实我 ...
- NPOI对Excel的操作(Sheet转DataTable、List<T>)
通过NPOI对Excel进行操作,这里主要是读取的操作.封装到ExcelHelper操作类中. 1 using System.Collections.Generic; 2 using NPOI.HSS ...
- php的Excel相关操作
1.需求 把数据库的数据输出excel格式 2.解决方案 利用phpexcel中的examples的01和07,对excel文件的读写 3.操作流程 a.https://github.com/PHPO ...
- java导入导出excel常用操作小结及简单示例
POI中常用设置EXCEL的操作小结: 操作excel如下 HSSFWorkbook wb = new HSSFWorkbook(); //创建一个webbook,对应一个Excel文件 HSSFS ...
- C# 几十万级数据导出Excel,及Excel各种操作
先上导出代码 /// <summary> /// 导出速度最快 /// </summary> /// <param name="list">&l ...
- 对Aspose.Cells Excel文件操作的扩展
工作中对Excel操作的需求很是常见,今天其他项目组的同事在进行Excel数据导入时,使用Aspose.Cells Excel 遇到了些问题. 刚好闲来不忙,回想自己用过的Excel文件操作,有NPO ...
- Java学习---Excel读写操作
1.1.1. 简介 Apache POI 使用Apache POI 完成Excel读写操作 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API ...
- Excel VBA入门(五)Excel对象操作
本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...
- 网页中NPIO对Excel的操作实例
上一节是在wpf中实现对excel的操作方法,这一节看看网页中如何封装实现对excel的上传导入和下载保存的. 看看效果图:
随机推荐
- exist的用法
http://blog.csdn.net/maladoufu/article/details/8194624 http://blog.csdn.net/xiwu1616/article/details ...
- 启动php-fpm报错:please specify user and group other than root
安装好PHP之后启动报错: 启动php-fpm报错:please specify user and group other than root, pool 'default 修改 php-fpm.co ...
- OC - 21.CALayer核心要点及实例解析
CALayer基础 CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制 ...
- Python Function Note
Python Function Note #汉诺塔问题Python实现 def my_move(n, a, b, c): if n == 1: print(a + ' --> ' + c) el ...
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- Firefox中Vimperator插件配置
具体配置什么,同学们可以网上看下善用佳软关于Vimperator的说明,在这里我列出两条我个人觉得最有用的命令 set nextpattern=\s*下一页|下一张|下一篇|下页|后页\s*,^\bn ...
- 我的vimrc配置
fankcoder@fankcoder:~$ cat ~/.vimrclet Tlist_Auto_Highlight_Tag=1 let Tlist_Auto_Open=1 let Tlist_Au ...
- jquery 的日期时间控件(年月日时分秒)
<!-- import package --> <script type="text/javascript" src="JS/jquery.js&quo ...
- MongoDB-GRIDFS大文件系统
gridfs 是一种在mongodb中存储大二进制文件的机制,使用gridfs的原因: 1.存储巨大的文件(视频图片). 2.利用GRIDFS可以简化需求. 3.GRIDFS 利用已经建立起来的复制以 ...
- display 属性
这里向大家描述一下HTML DOM display属性的定义和用法,HTML DOM display属性主要用来设置元素如何显示,比如当此属性值为none时,表示此元素不会被显示,而block则表示此 ...