MFC打开已有的excel文件,并编辑,保存

问题1.创建excel文件并保存

载入excel API

vs 2010 --》project--》class wizard --》Add Class --》MFC Class From TypeLib --》File  如下图
program file --》Microsoft office --》office14--》Excel.exe 如下图:
在出现的接口列表中,选择_Applicatioin,_Workbook,_Worksheet,Worksheets,Workbooks,Range,让后生成对应的类文件,这些类文件就封装了调用excel的API函数,用通过编译还需要将其中的#import ....内容注释掉,并加上头文件#include <afxdisp.h>,如下图:

创建excel文件

如下代码:
       CWorkbooks books;CWorkbook book;CWorksheets sheets;CWorksheet sheet;CApplication app;CRange range;CRange cols;COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);if(!app.CreateDispatch("Excel.Application")){AfxMessageBox("无法创建excel应用",MB_OK|MB_ICONWARNING);return;}//excel是一个多文档的应用程序,下面的两行确定是哪一个视图books = app.get_Workbooks();book = books.Add(covOptional);//确定视图后得到视图中的全部的页,并确定具体是哪一页sheets = book.get_Worksheets();//得到该视图中的第一页sheet = sheets.get_Item(COleVariant((short)1));//保存时间if(m_isSaveTime){range = sheet.get_Range(COleVariant("A1"),COleVariant("A1"));CTime curTime = CTime::GetCurrentTime();CString strTime = curTime.Format("%Y-%m-%d  %H:%M:%S");range.put_Value2(COleVariant(strTime));}//得到当前编辑页发的A2单元range = sheet.get_Range(COleVariant("A2"),COleVariant("A2"));//让数字以字符串显示result1 = "\'"+result1;range.put_Value2(COleVariant(result1));range = sheet.get_Range(COleVariant("A3"),COleVariant("A3"));range.put_Value2(COleVariant(result2));//设置整列的宽度自适应cols = range.get_EntireColumn();cols.AutoFit();//保存数据book.SaveCopyAs(COleVariant(m_saveFilePath));book.put_Saved(TRUE);//释放对象cols.ReleaseDispatch();range.ReleaseDispatch();sheet.ReleaseDispatch();sheets.ReleaseDispatch();book.ReleaseDispatch();books.ReleaseDispatch();//不能乱序app.Quit();app.ReleaseDispatch();

代码中的注释有较详细的说明。

问题2.打开已存在的excel文件,并编辑保存

       CWorkbooks books;CWorkbook book;CWorksheets sheets;CWorksheet sheet;CApplication app;CRange range;LPDISPATCH lpDisp;COleVariant vResult;COleVariant  covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);if(!app.CreateDispatch("Excel.Application")){AfxMessageBox("无法打开Excel应用",MB_OK|MB_ICONWARNING);return;}books.AttachDispatch(app.get_Workbooks());//打开文件lpDisp = books.Open(m_saveFilePath,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);//得到得到视图workbookbook.AttachDispatch(lpDisp);//得到worksheetssheets.AttachDispatch(book.get_Worksheets());//得到sheetlpDisp = book.get_ActiveSheet();sheet.AttachDispatch(lpDisp);//取得用户区CRange userRange;userRange.AttachDispatch(sheet.get_UsedRange());//得到用户区的行数range.AttachDispatch(userRange.get_Rows());long rowNum = range.get_Count();//得到用户区的列数range.AttachDispatch(userRange.get_Columns());long colNum = range.get_Count();//得到用户区的开始行和开始列long startRow = userRange.get_Row();long startCol = userRange.get_Column();long startWriteRow = startRow + rowNum ;long startWriteCol = startCol + colNum ;CString writeLocation;if(m_isSaveTime){CTime curTime = CTime::GetCurrentTime();CString strTime = curTime.Format("%Y-%m-%d  %H:%M:%S");writeLocation.Format("A%d",startWriteRow+1);range=sheet.get_Range(COleVariant(writeLocation),COleVariant(writeLocation));range.put_Value2(COleVariant(strTime));}//得到数据的位置writeLocation.Format("A%d",startWriteRow+2);//取得要编辑的区域range = sheet.get_Range(COleVariant(writeLocation),COleVariant(writeLocation));result1 = "\'" + result1;//将数据放入取得的区域中range.put_Value2(COleVariant(result1));writeLocation.Format("A%d",startWriteRow+3);range = sheet.get_Range(COleVariant(writeLocation),COleVariant(writeLocation));range.put_Value2(COleVariant(result2));//写入数据的方法二知道行号和列号写数据//range.AttachDispatch(sheet.get_Cells());//range.AttachDispatch(range.get_Item(COleVariant((long)2),COleVariant((long)2)).pdispVal);//range.put_Value2(COleVariant("test"));//保存修改后的数据       book.Save();//释放对象    range.ReleaseDispatch();  sheet.ReleaseDispatch();  sheets.ReleaseDispatch();  book.ReleaseDispatch();  books.ReleaseDispatch(); app.Quit(); app.ReleaseDispatch();  

主要打开文件的语句是:

       lpDisp = books.Open(m_saveFilePath,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);

在通过AttachDispatch方法来取得具体的视图中的具体页,取得具体的编辑单元有两种方法:

方法1.get_Range方法

通过sheet中的get_Range方法,获得编辑的范围,但是这种方法需要字母与数字组成的位置字符串:
           writeLocation.Format("A%d",startWriteRow+1);range=sheet.get_Range(COleVariant(writeLocation),COleVariant(writeLocation));range.put_Value2(COleVariant(strTime));

方法2.get_Item方法

通过行号和列号来得到要编辑的单元,具体代码如下:
       写入数据的方法二知道行号和列号写数据range.AttachDispatch(sheet.get_Cells());range.AttachDispatch(range.get_Item(COleVariant((long)2),COleVariant((long)2)).pdispVal);range.put_Value2(COleVariant("test"));

编辑数据好,需要调用CWorkbook中的Save()函数进行保存,如果不保存,在关闭应用的时候会出现是否保存的提示对话框。

问题3.得到用户区

得到用户已经使用的区域,通过下面的代码:
       //取得用户区CRange userRange;userRange.AttachDispatch(sheet.get_UsedRange());//得到用户区的行数range.AttachDispatch(userRange.get_Rows());long rowNum = range.get_Count();//得到用户区的列数range.AttachDispatch(userRange.get_Columns());long colNum = range.get_Count();//得到用户区的开始行和开始列long startRow = userRange.get_Row();long startCol = userRange.get_Column();

主要是通过CWorksheet中的get_UsedRange()函数实现,得到用户已使用的行数和列数,以及用户开始的行和列,开始行和列都是从1开始计数。

更加详细见: 点击打开链接

MFC打开已有的excel文件,并编辑,保存相关推荐

  1. 编辑已有excel文件

    python可以使用xlrd读excel,使用xlwt写excel,但是如果要把数据写入已存在的excel,需要另外一个库xlutils配合使用. 大概思路: 1.用xlrd.open_workboo ...

  2. Excel文件有密码怎么打开、打开Excel文件不能编辑怎么办?

    之前自己在Excel表格里面做了一些工作.工资表格,设置了密码,时间久了就把密码忘记了,内容还挺重要的,该如何打开忘记密码的Excel文件呢?之前在网上下载的Excel表格样板,打开之后不能粘贴复制. ...

  3. word文档中找不到服务器,【在WORD文件中插入excel表格,编辑保存后重新打开word文件并双击excel时提示“找不到服务器应用程序、源文件】excel整个表格不见了...

    为什么PPT插入EXCEL表格时显示无法找到服务器应用程序 这是由于excel或者ppt只能兼容.低版本的ppt和excel是无法打版本excel插入的表格的. 解决如下: 1.新建一个文本,将后缀名 ...

  4. [转]独立窗口打开多个Excel文件

    2019独角兽企业重金招聘Python工程师标准>>> 不喜欢Excel打开多文件的默认显示方式,就是打开多个Excel文件的时候,总是以一个总窗口,以类似选项卡的方式在同一个窗口内 ...

  5. xlsxwriter写行合并_使用实现XlsxWriter创建Excel文件并编辑

    之前操作Excel使用过其他的方式,针对Excel的写入来说,使用过xlwt模块,也直接使用过win32com接口.如果说哪个最能够发挥Excel的威力,那么肯定是win32com接口实现的方式,然而 ...

  6. python 修改excel 路径_python更改已存在excel文件的方法

    这篇文章主要介绍了关于python更改已存在excel文件的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 需要用到的包: import xlrd import xlwt impo ...

  7. java luckysheet html 实现excel文件在线编辑

    今天得到个需求,<实现excel文件在线编辑.查看.保存>. 我这里遇到了许多坑,就先分享一下.这里只做在线预览的功能实现,因为其他的功能比较简单. 整体思路:xls转xlsx文件,用lu ...

  8. Excel文件的编辑限制密码,如何撤销?

    遇到了很重要的excel文件,对文件进行加密是一个有效的保护方法.如果有些表格可以让他人查看,但是担心他人对表格进行操作,我们可以使用excel中的保护工作表的功能对表格进行加密.和大家分享如何对ex ...

  9. 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

    在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...

最新文章

  1. java菱形乱码 编码_JAVA:编码与乱码问题
  2. java的并发框架_java并发框架有哪些
  3. 关于可变字符串StringBuffer和String的区别总结
  4. 统一配置中心的设计方案
  5. java求二阶微积分方程特解_Scipy:实现微分方程的两种方法:两种不同的解决方案:回答...
  6. 腾讯云服务器配置深度学习环境
  7. C++_程序内存模型_内存四区_代码区_全局区_每种区域都存放什么样的变量---C++语言工作笔记028
  8. 《视觉SLAM十四讲》笔记
  9. 前端安全- 常见的网络攻击
  10. python装饰器详解
  11. 微信小程序-图片上传功能的实现
  12. 华为服务器进入bios怎么重装系统,华为服务器进bios设置
  13. EXCEL基本功能 --- 三种常用的查找与引用函数
  14. java 泰文的编码_Unicode字符编码表(转)
  15. AI反欺诈:千亿的蓝海,烫手的山芋|甲子光年
  16. 018 The Scala Programming Language
  17. 明年iPhone或支持双卡双待;刘强东:若十年后还是BAT,对国家是种不幸|ServiceHot一周热闻
  18. 馒头,不!月饼引起的惨案
  19. 网易数帆基于 Kubernetes 的 Redis 云原生实践综述
  20. 2022新版版IDEA创建Web项目

热门文章

  1. 网络技术入门 :HTTP报文和TCP/IP数据包
  2. 《SpringBoot与Shiro整合-权限管理实战---从构建到模拟数据库登入》
  3. 趣头条敲响上市钟:首日最高涨幅超190% 五度触及熔断
  4. 微信小程序与h5的区别
  5. 计算机的键盘操作课件,计算机应用基础教程-认识键盘ppt课件.ppt
  6. XCP实战系列介绍02-A2L文件详尽解析
  7. 狭长矢量图斑的消除(python)
  8. 从“月饼现象”谈吉利转型
  9. 2018年度总结,展望2019
  10. spring boot- JdbcTemplate、NamedParameterJdbcTemplate基本使用(批量更新插入)