我使用的是office2003
第一步:
首先得到这几个文件
CApplication.h
CWorkbook.h
CWorkbooks.h
CWorksheet.h
CWorksheets.h
CRange.h
CFont0.h
得到的方法可以直接引入 引入的方法:
Project->add Class->mfc->MFC Class From TypeLib->Available type libraries->Mircrosoft Excel xx Object library
添加这接个类就可以了
当然也可以从本文下载,推荐直接下载加入到工程中去,本文后面有这些文件的源码可以直接复制过去用。
第二步,
工程中新建个.cpp文件和.h文件
我的是Excel.cpp Excel.h
在Excel.h中添加以下头文件
#include <comdef.h>
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "CApplication.h"
#include "CFont0.h"
Excel.cpp中创建以下实例
CRange m_ExlRge;
CWorksheet m_ExlSheet;
CWorksheets m_ExlSheets;
CWorkbook m_ExlBook;
CWorkbooks m_ExlBooks;
CApplication m_ExlApp;
CFont0 ft;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
第三步:
在工程中的InitInstance中加入下面的代码 初始化自动化模块ole
CWinApp::InitInstance();
if(!AfxOleInit()){
AfxMessageBox("init ole failed!");
}
第四步:
接下来就可以使用相关的接口了
网上的搜到的接口和我们用的有差异
比如Get之类的函数我们使用get_
Set改为put_
我们随便建个函数 下面的方法基本上就是网上能搜到的一些方法了 拿来用就行
比如bool Excel()
{
首先启动Excel服务
if(!m_ExlApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!请先安装Offic Excel 2003");
return false;
}
在我们程序编辑excel的时候显示出来(我是喜欢这样,网上例子一般都是设置成FALSE,我们先设置TRUE方便调试)
m_ExlApp.put_Visible(TRUE);
得到工作薄
m_ExlBooks.AttachDispatch(m_ExlApp.get_Workbooks(),true);
m_ExlBook.AttachDispatch(m_ExlBooks.Add(covOptional),true);
}
_ExlSheets.AttachDispatch(m_ExlBook.get_Sheets(),true);
得到sheet工作表
m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
m_ExlSheet.AttachDispatch(m_ExlSheets.get_Item(_variant_t((long)1)),TRUE);
//删除第二个Sheet页面
m_ExlSheet.AttachDispatch(m_ExlSheets.get_Item(_variant_t((long)2)),TRUE);
m_ExlSheet.Delete();
//把第一个Sheet页面的名字改变为TestSheet
m_ExlSheet.AttachDispatch(m_ExlSheets.get_Item(_variant_t((long)1)),TRUE);
m_ExlSheet.put_Name("测试项");
合并单元格
m_ExlRge.AttachDispatch(m_ExlSheet.get_Range(_variant_t("A1"),_variant_t("K1")),TRUE);
m_ExlRge.Merge(_variant_t((long)0));
单元格中写数据 写数据之前一定要加载所有单元格 否则定位就不准了
m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);//加载所有单元格
m_ExlRge.put_Item(_variant_t((long)1),_variant_t((long)1),_variant_t("hello你好"));
所有单元格设置自动换行 水平和垂直居中
m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);//加载所有单元格
m_ExlRge.put_WrapText(_variant_t(true));
m_ExlRge.put_HorizontalAlignment(_variant_t((long)-4108));
m_ExlRge.put_VerticalAlignment(_variant_t((long)-4108));
设置边框
m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);//加载所有单元格
CRange UnitRge;
CString CellName;
for(int i=1;i<=3);i++)
{
for(int j=1;j<=11;j++)
{
CellName.Format("%c%d",j+64,i);//单元格的名称
UnitRge.AttachDispatch(m_ExlRge.get_Range(_variant_t(CellName),_variant_t(CellName)));//加载单元格
//LineStyle=线型 Weight=线宽 ColorIndex=线的颜色(-4105为自动)
UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)3),_variant_t((long)-4105),vtMissing);//设置边框
}
}
设置字体颜色
m_ExlRge.AttachDispatch(m_ExlSheet.get_Range(_variant_t(“H1”),_variant_t(“H1”)));
ft.AttachDispatch(m_ExlRge.get_Font());
ft.put_ColorIndex(_variant_t((long)3));//红
特别注意的是使用m_ExlRge写数据的时候一定要先获取所有单元格,比如说我使用它的put_item函数写到一半设置了一下字体颜色,那么我们肯定会用到m_ExlRge.AttachDispatch那么我们就定位到这个地方了我们再次用put_item的时候设置字体颜色的那个点就认为是(0,0)点了所以这个时候需要先使用m_ExlRge.AttachDispatch(m_ExlSheet.get_Cells(),TRUE);加载所有单元格
最后关键的一步 保存文件和释放资源
我使用的是saveas保存文件,其他的方法目前还在研究,saveas就能直接保存的指定的目录了
CString FilePath = “D:\\test.xls”; 可以灵活设置
m_ExlBook.SaveAs(COleVariant(FilePath),covOptional,
covOptional,covOptional,
covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,
covOptional,covOptional);
m_ExlRge.ReleaseDispatch();
m_ExlSheet.ReleaseDispatch();
m_ExlSheets.ReleaseDispatch();
m_ExlBook.ReleaseDispatch();
m_ExlBooks.ReleaseDispatch();
//m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
m_ExlApp.ReleaseDispatch();
//退出程序
m_ExlApp.Quit();
https://blog.csdn.net/shuilan0066/article/details/7936336
https://blog.csdn.net/wangmeng0804/article/details/65627826