博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
向EXCEL模板文件中写入数据和插入新行
阅读量:2392 次
发布时间:2019-05-10

本文共 3200 字,大约阅读时间需要 10 分钟。

        在很多情况下,我们需要将程序产生的一些数据按照一些用户要求的EXCEL文件模板格式进行填写,将指定的数据项写入指定的单元格。在某些特定的情况下,可能还需要进行动态的行插入,比如数量不确定的点坐标信息,要求每行记录一个点坐标信息时。另外,用模板生成的文件,需要进行文件另存,以免将模板文件覆盖。

        基于以上目的,笔者采用通用的网络搜魂大法,几经周折,几多测试,终于完成了以上功能,在此与大家共享。

        之前曾经使用过CSpreadSheet类进行EXCEL读写,不过貌似这个类不能用于模板EXCEL的填写,只能对新建EXCEL文件进行操作。闲话少说,下面就介绍如何完成以上工作的吧。

1、需要在工程中初始化OLE

if(!AfxOleInit())///初始化COM库

{

     AfxMessageBox("初始化COM失败");

     return FALSE;

}

这段代码我一般会放在应用程序类的InitInstance函数的开头部分。

2、插入EXCEL模块

使用Classwizard中,点击右侧第一个按钮“AddClass...”,在弹出的下拉菜单中选择“From a type library...”

在弹出的目录选择对话框中,选择Office安装目录下的EXCEL.EXE文件

将弹出需要导入的模块选择窗口,如果嫌麻烦,那就将列表中的模块全部选中。选中的办法是直接拖拉选中,或者按住SHIFT键后,选择第一个和最后一个即可。(该死,怎么不支持CTRL+A呢)

点击“OK”即可将所有模块插入工程。此时看一下工程文件,会发现多了EXCEL.h和EXCEL.CPP两个文件。

3、编写代码

环境已经准备好了,假设现在的测试工程是点击一个按钮,在按钮事件中完成模板文件单元格数据的填写、动态行的插入以及文件的存储。

首先注意要将EXCEL.h文件包含进来:

#include "comdef.h"   //这个也需要哦,不然_variant_t不认识

#include "excel.h"

这里假设将EXCEL对象作为成员变量:(这个主要看工程中具体的应用了)

       Range m_ExlRge;

       _Worksheet m_ExlSheet;
       Worksheets m_ExlSheets;
       _Workbook m_ExlBook;
       Workbooks m_ExlBooks;
       _Application m_ExlApp;

 

然后在按钮的点击事件中增加处理代码,具体代码的含义就看注释吧。

[cpp]
  1. void CTTTDlg::OnButton1()   
  2. {  
  3.  //用m_ExlApp对象创建Excel2003进程   
  4.    
  5.  if(!m_ExlApp.CreateDispatch("Excel.Application",NULL))   
  6.  {   
  7.   AfxMessageBox("创建Excel服务失败!");   
  8.   return;   
  9.  }   
  10.    
  11.  //设置为不可见,这样就不会弹出EXCEL窗口了   
  12.  m_ExlApp.SetVisible(FALSE);   
  13.    
  14.  ///下面得到应用程序所在的路径///   
  15.  CString theAppPath;  
  16.  //  
  17.  //此段省略获得应用程序根目录的代码  
  18.  //  
  19.        
  20.    
  21.    
  22.  CString TempPath = theAppPath+"ShipInfoTemp.xls";//EXCEL模板的路径   
  23.    
  24.  m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE);   
  25.    
  26.  m_ExlBook.AttachDispatch(m_ExlBooks.Add((_variant_t)TempPath),TRUE);//加载EXCEL模板   
  27.    
  28.  m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加载Sheet页面   
  29.     
  30.  //修改Sheet页面的名称,第一页从1开始,不是0哦!后面涉及到编号的地方都是如此,要注意阿  
  31.  m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);   
  32.  m_ExlSheet.SetName("1106号台风");   
  33.     
  34.  //根据实际受台风影响的船舶的数量,动态改变船舶信息的行数,这里假设只增加一行,插入在第12行之前  
  35.  Range rangeSelect;  
  36.  rangeSelect.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A12"),_variant_t("D12")),TRUE);  
  37.  Range rangeInsert = rangeSelect.GetEntireRow();//选择第12行  
  38.  //这里特别说明一下-4121,在ASP.NET和VB等工具下,表示xlShiftDown,指将行向下挤,VC下没找到,所以只能用直接的数值了  
  39.  rangeInsert.Insert(COleVariant((long)-4121),vtMissing); //在12行之前插入  
  40.  rangeSelect.ReleaseDispatch();   
  41.  rangeInsert.ReleaseDispatch();   
  42.   
  43.  //开始向各个单元格填入数据  
  44.  m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);//加载所有单元格   
  45.  //此段可以循环插入船舶信息,这里以插入一条船来举例     
  46.  m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)1),_variant_t("1"));   
  47.  m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)2),_variant_t("雪龙号"));   
  48.  m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)3),_variant_t("201106270800"));   
  49.  m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)4),_variant_t("京唐/南沙"));   
  50.  m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)5),_variant_t("3901N"));    
  51.  m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)6),_variant_t("12138E"));   
[cpp]
  1.  //将编辑完成的内容保存为新文件,这里的文件名可以根据需要动态产生。  
  2.  m_ExlSheet.SaveAs(theAppPath + "newdata.xls",vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);  
  3.   
  4.  //释放对象  
  5.  m_ExlRge.ReleaseDispatch();   
  6.  m_ExlSheet.ReleaseDispatch();   
  7.  m_ExlSheets.ReleaseDispatch();   
  8.  m_ExlBook.ReleaseDispatch();   
  9.  m_ExlBooks.ReleaseDispatch();   
  10.  //m_ExlApp一定要退出程序,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错   
  11.  m_ExlApp.Quit();   
  12.  m_ExlApp.ReleaseDispatch();   
  13. }  
  14.   
  15. 本段代码在XP系统,EXCEL 2003,VC6环境下测试成功。 

转载地址:http://qbhab.baihongyu.com/

你可能感兴趣的文章
JSP技术的学习总结
查看>>
JavaBean的初步认知
查看>>
重识java反射
查看>>
Spring的核心中IOC、DI
查看>>
Spring中注解的使用
查看>>
Spring的认识
查看>>
gitee的使用
查看>>
maven项目出现如下错误,求指点;CoreException: Could not calculate build plan:
查看>>
理解Paxos算法的证明过程
查看>>
详解 JVM Garbage First(G1) 垃圾收集器
查看>>
Java 8 函数式编程入门之Lambda
查看>>
用高阶函数轻松实现Java对象的深度遍历
查看>>
WindowsApi+Easyx图形库的透明时钟
查看>>
Eclipse LUNA配置TomCat(非j2ee版本)
查看>>
树莓派安装mysql-srver报错 404 not found!
查看>>
Ubuntu 14.04LTS 下安装.net框架
查看>>
Ubuntu || Linux下添加程序启动器
查看>>
Ubutu 下安装putty并且连接树莓派
查看>>
Eclipse 配置Groovy语言环境 && Java工程运行Groovy
查看>>
Ubuntu 终端zsh的agnoster主题乱码
查看>>