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_namespace

4.编译,会出现一个错误,错误指向下面代码

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: 在此添加控件通知处理程序代码
}

仍然不太完善,以后再补充吧。

VS用OLE方式对Excel进行读写操作相关推荐

  1. python对excel进行读写操作

    python对excel进行读写操作 欢迎使用Markdown编辑器 一.安装库 1.安装xlrd模块 2.安装xlwt模块 2.安装openpyxl模块 补充(多个python版本) 二.使用介绍 ...

  2. python写表格_使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  3. excel调用python编程-使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  4. 使用Easyexcel对Excel进行读写操作

    1.概述 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:GitHub - alibaba/easy ...

  5. 利用python对Excel进行读写操作

    最近在写论文做实验的过程中,利用python自带的matplotlib库进行绘画,但是尝尝会出现在程序跑完后发现图片里面有一些小细节没有注意到,导致整个代码重新跑.代码重新跑短则几小时,长则就不好说了 ...

  6. python所有文件都能用文本方式打开_python 打开文件方式讲解、常用读写操作指令(全)以及读写常见问题...

    python读写方式 python的读写,在实际应用中还是很广泛的,有必要系统性的学习一下,以便于处理问题时的抉择和对现象的合理解释.例如,python用logging写入日志文件默认的读写方式是&q ...

  7. pythonexcel操作总结_python中常见关于Excel表格读写操作

    最近在写项目,刚好要运用到excel表格的一些读写,顺便总结一下我以前学过的几个关于表格的操作.在写项目中,经常会见到页面中数据导出到表格中,同时,也会有经常在表格中填写测试用例,然后获取数据来做自动 ...

  8. EasyExcel java实现excel简单读写操作(快速上手,复制粘贴即可)

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目. https://github.com/alibaba/easyexcel 一.导入maven坐标 Lombok可选,不导 ...

  9. OLE方式保存Excel文件

    #define PG OlePropertyGet #define PS OlePropertySet #define FN OleFunction #define PR OleProcedure t ...

最新文章

  1. 『Tarjan算法 无向图的双联通分量』
  2. 报名开启 | 李开复等AI大咖齐聚量子位MEET大会,邀你共探新形势下智能产业发展之路...
  3. MonoDevelop笔记
  4. 回溯法:批量作业调度
  5. Android游戏开发的入门实例
  6. mysql 安装 运维_MySQL自动化运维之安装篇
  7. Linux部署oracle11g,linux环境下部署Oracle11g
  8. 鸿蒙手机是个噱头,华为鸿蒙不是谈判噱头 必要时会应用手机当中!
  9. html ajax 双引号的问题
  10. 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
  11. ubuntu-Linux系统读取USB摄像头数据(uvc)
  12. 阿克曼函数求解(递归和非递归)
  13. android谷歌打印插件下载地址,谷歌浏览器打印插件(Print Plus)
  14. elasticsearch小记之—— unmapped_type的使用
  15. 【实现操作系统 02】FAT12 文件系统(摆脱术语用实际例子介绍)
  16. 制定科学学习计划的重要性
  17. 情人节送男生什么礼物好?2022情人节礼物推荐
  18. Python 导出微信电子相册中的照片
  19. [bzoj] 1597 土地购买 || 斜率优化dp
  20. 推荐系统学习笔记-FNN

热门文章

  1. 通用寄存器与标志位寄存器OF/DF/IF/TF/SF/ZF/AF/PF
  2. 十分钟了解K-means聚类
  3. 【日常Exception】第二十七回:Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\xAC\x8C\x97\xE7\x
  4. F分布概率密度函数的推导
  5. Python网络爬虫的概念和基本原理
  6. cad捕捉不到标注线上的点_CAD捕捉不到正在绘制的多段线上的点怎么办
  7. NameError: name 'mnist' is not defined
  8. phpStudy无法打开http://localhost/
  9. Matlab常用数学函数和数学运算符
  10. java2022-12-22