本文共 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;
然后在按钮的点击事件中增加处理代码,具体代码的含义就看注释吧。
- void CTTTDlg::OnButton1()
- {
-
-
- if(!m_ExlApp.CreateDispatch("Excel.Application",NULL))
- {
- AfxMessageBox("创建Excel服务失败!");
- return;
- }
-
-
- m_ExlApp.SetVisible(FALSE);
-
-
- CString theAppPath;
-
-
-
-
-
-
- CString TempPath = theAppPath+"ShipInfoTemp.xls";
-
- m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE);
-
- m_ExlBook.AttachDispatch(m_ExlBooks.Add((_variant_t)TempPath),TRUE);
-
- m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);
-
-
- m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);
- m_ExlSheet.SetName("1106号台风");
-
-
- Range rangeSelect;
- rangeSelect.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A12"),_variant_t("D12")),TRUE);
- Range rangeInsert = rangeSelect.GetEntireRow();
-
- rangeInsert.Insert(COleVariant((long)-4121),vtMissing);
- rangeSelect.ReleaseDispatch();
- rangeInsert.ReleaseDispatch();
-
-
- m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);
-
- m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)1),_variant_t("1"));
- m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)2),_variant_t("雪龙号"));
- m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)3),_variant_t("201106270800"));
- m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)4),_variant_t("京唐/南沙"));
- m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)5),_variant_t("3901N"));
- m_ExlRge.SetItem(_variant_t((long)8),_variant_t((long)6),_variant_t("12138E"));
-
- m_ExlSheet.SaveAs(theAppPath + "newdata.xls",vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);
-
-
- m_ExlRge.ReleaseDispatch();
- m_ExlSheet.ReleaseDispatch();
- m_ExlSheets.ReleaseDispatch();
- m_ExlBook.ReleaseDispatch();
- m_ExlBooks.ReleaseDispatch();
-
- m_ExlApp.Quit();
- m_ExlApp.ReleaseDispatch();
- }
-
- 本段代码在XP系统,EXCEL 2003,VC6环境下测试成功。
转载地址:http://qbhab.baihongyu.com/