VS用OLE方式对Excel进行读写操作
来源:互联网 发布:卖鸽子的软件 编辑:程序博客网 时间:2024/06/07 21:39
OLE技术(Object Linking and Embedding,对象连接与嵌入)OLE是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM)。
一、Excel对象模型。
Application:代表应用程序本身。即Excel应用程序
Workbooks:是Workbook的集合,代表了工作薄。
Worksheets:是Worksheet的集合,是Workbook的子对象。
Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。
Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。
OLE方式优点:功能比较齐全,能实现绝大部分要求
OLE方式缺点:Excel OLE完整参考文档比较少,并且速度很慢
二、VS2010通过OLE技术与Excel进行操作。
1.项目——添加类——TypeLib的MFC类——Microsoft Excel 14.0 Object Library<1.7>——接口选择_Application,_Workbook,_Worksheet,Range,Workbooks,Worksheets
2.添加头文件,在stdafx.h包含头文件#include "CApplication.h"#include "CRange.h"#include "CWorkbook.h"#include "CWorkbooks.h"#include "CWorksheet.h"#include "CWorksheets.h"3.修改头文件,将上面6个头文件中下面一句话注释掉
//#import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace4.编译,会出现一个错误,错误指向下面代码
VARIANT DialogBox(){VARIANT result;InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);return result;}将函数DialogBox()前加下划线"_",编译通过。
5.实现打开文件并在编辑框中显示文件路径。
void CtestDlg::OnBnClickedButtonGet(){CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("all files(*.xls;*.xlsx)|*.xls;*.xlsx||"),AfxGetMainWnd());if(file.DoModal()==IDOK){CString strPath=file.GetPathName();SetDlgItemText(IDC_EDIT_ADDRESS,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();CFont font;}// TODO: 在此添加控件通知处理程序代码}6.实现列表框显示Excel已经写好的数据。注意:文件名和路径中不要有中文字符,否则查询不到。
<pre name="code" class="cpp">void CtestDlg::OnBnClickedButtonRead(){m_Grid.DeleteAllItems();CString strFile =_T("E:\EXCEL.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;CRange usedrange;if (!app.CreateDispatch(_T("Excel.Application"))){MessageBox(_T("Error!Creat Excel Application Server Faile!"));exit(1);}books = app.get_Workbooks();book = books.Add(_variant_t(strFile));sheets = book.get_Worksheets();sheet = sheets.get_Item(COleVariant((short)1));//得到全部Cells range.AttachDispatch(sheet.get_Cells()); usedrange.AttachDispatch(sheet.get_UsedRange());usedrange.get_Rows();int rows=usedrange.get_Count();usedrange.get_Columns();int columns=usedrange.get_Count();CString str;for (int setnum=usedrange.get_Row();setnum<rows;setnum++){for (int num=0;num<columns;num++){if(!num){str=range.get_Item(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)));m_Grid.InsertItem(setnum,_T(str));}else{str=range.get_Item(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)));m_Grid.SetItemText(setnum-1,num,str);}}}//保存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(); // TODO: 在此添加控件通知处理程序代码}6.向Excel中写入数据。
void CtestDlg::OnBnClickedButtonWrite(){CString strFile =_T( "E:\EXCEL.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("爱*LOVE")));CString st;st=range.get_Value2();MessageBox(st);//下面是向第二行的前十个单元格中输入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(); // TODO: 在此添加控件通知处理程序代码}7.将列表框的内容写入到Excel中。首先在初始化函数中进行初始化:
CDialogEx::OnInitDialog();//在这句之后添加//设置列表视图的扩展风格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("刘"));m_Grid.SetItemText(count,1,_T("1"));m_Grid.SetItemText(count++,2,_T("1"));m_Grid.InsertItem(count,_T("王"));m_Grid.SetItemText(count,1,_T("2"));m_Grid.SetItemText(count++,2,_T("2"));m_Grid.InsertItem(count,_T("李"));m_Grid.SetItemText(count,1,_T("3"));m_Grid.SetItemText(count++,2,_T("3"));m_Grid.InsertItem(count,_T("赵"));m_Grid.SetItemText(count,1,_T("4"));m_Grid.SetItemText(count,2,_T("4"));在按钮的响应函数中实现向Excel写入数据。
void CtestDlg::OnBnClickedButton2(){CString strFile =_T("E:\EXCEL.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(); // TODO: 在此添加控件通知处理程序代码}仍然不太完善,以后再补充吧。
0 0
- VS用OLE方式对Excel进行读写操作
- VC用OLE方式读写Excel
- VC用OLE方式读写Excel
- C++ 操作Excel-----用OLE读写
- 利用java对excel进行读写操作
- python中对Excel进行读写操作
- python中对Excel进行读写操作
- 使用Python对Excel进行读写操作
- POI对Excel进行读写操作
- C++读写EXCEL文件---ole 方式
- 用OLE操作Excel
- 用OLE操作Excel
- C# Excel ole文件读写操作类
- 使用VC++6.0 MFC OLE操作Excel 进行简单的读写
- 【Python】用python对excel进行读写
- BCB之OLE方式操作Excel
- [python]使用xlrd对Excel表格进行读写操作
- java-使用POI对Excel进行读写操作
- MySQL索引 查看、创建、删除
- Javascript_Note.6
- 详解C++右值引用
- Activity的启动模式
- 初学者如何创建 Git 仓库(使用 sourceTree)
- VS用OLE方式对Excel进行读写操作
- 垃圾收集器与内存分配策略
- nginx基本配置与参数说明---nginx的学习之路
- Android常用加密算法比较
- 创建并且获取图片沙盒路径
- Android-手势识别(自定义手势识别:四种自定义手势)
- Ubuntu 12.04 静态ip的设置方法
- VB6 获取内存、硬盘、CPU使用率信息
- 虚函数与虚继承