在MFC中对Excel的一些操作
首先要在程序中加载CExcel.h和CExcel.cpp文件,这里面包装了很多函数和对Excel文件的操作,下面所有程序中的m_excel都是类CExcel的对象,如:
private:
_Application pApp;
Workbooks pBooks ;
_Workbook pBook ;
Worksheets pSheets ;
_Worksheet pSheet;
Range pRange;
Interior pInterior;
FontPtr pFont;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
首先在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()语句之后加入如下代码:
if
(CoInitialize(NULL)==0)
//初始化COM库
{
AfxMessageBox(
"初始化COM失败!"
);
exit
(1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
使用Excel模板来新建一个excel文件,并保存在指定的地址上
UpdateData();//外部有对话框,此时可以将对话框中数据拷贝给与对话框绑定的变量
CString modPath = _T("C:\\Users\\军\\Desktop\\excel.xls");//模板所在的地址
CString strName = m_fileName + _T(".xlsx");//新建的Excel文件的文件名
CString pathName = m_saveAddr + strName;//新建的Excel文件的保存地址
//启动Excel服务
CoInitialize(NULL);
if (!m_execl.pApp.CreateDispatch(_T("Excel.Application"), NULL))
{
AfxMessageBox(_T("创建Excel服务失败!"));
return;
}
m_execl.pApp.put_Visible(FALSE);//设置Excel文件不打开
m_execl.pBooks.AttachDispatch(m_execl.pApp.get_Workbooks(), TRUE);
m_execl.pBook.AttachDispatch(m_execl.pBooks.Add((_variant_t)modPath), TRUE);
//加载模板Excel文件
m_execl.pSheets.AttachDispatch(m_execl.pBook.get_Worksheets(), true);//加载sheet页面
m_execl.pSheet.AttachDispatch(m_execl.pSheets.get_Item(_variant_t("Sheet1")), true);
//将新建的Excel文件保存到指定的地址中,此时保存在pathName地址中
m_execl.pSheet.SaveAs(pathName, vtMissing, vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
//释放Excel实例
//释放对象
m_execl.pRange.ReleaseDispatch();
m_execl.pSheet.ReleaseDispatch();
m_execl.pSheets.ReleaseDispatch();
m_execl.pBook.ReleaseDispatch();
m_execl.pBooks.ReleaseDispatch();
//退出程序
m_execl.pApp.Quit();
//pApp一定要释放,否侧程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候回出错
m_execl.pApp.ReleaseDispatch();
注:本程序里面的Excel文件后缀名为.xlsx,这个要依据情况定,有时可能是.xls
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面介绍怎么向指定路径下的Excel文件中写入数据
CoInitialize(NULL);
if (!m_execl.pApp.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("创建Excell服务失败!"));
exit(1);
}
m_execl.pApp.put_Visible(FALSE);
m_execl.pBooks.AttachDispatch(m_execl.pApp.get_Workbooks(), true);
//打开要写数据的Excel文件,其中excelPath为该Excel文件的保存路径
m_execl.pBook.AttachDispatch(m_execl.pBooks.Open(excelPath, vtMissing, vtMissing,vtMissing,
vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing, vtMissing,vtMissing));
m_execl.pSheets.AttachDispatch(m_execl.pBook.get_Worksheets(), true);
m_execl.pSheet.AttachDispatch(m_execl.pSheets.get_Item(_variant_t("sheet1")), true);
m_execl.pRange.AttachDispatch(m_execl.pSheet.get_Cells(), true);
//获得Excel文件中已经使用了的行数和列数
//得到该Excel文档中已经使用了的列数
m_execl.pRange = m_execl.pSheet.get_UsedRange();
m_execl.pRange = m_execl.pRange.get_Columns();
long icul = m_execl.pRange.get_Count();
//得到Excel文档中已经使用了的行数
m_execl.pRange = m_execl.pSheet.get_UsedRange();
m_execl.pRange = m_execl.pRange.get_Rows();
long iRow = m_execl.pRange.get_Count();
long iRows = iRow + 1;//这里当我们要写数据时,都是从已经使用了的下一行开始写数据,所以要将已经使用的行数+1来得到下一行
for (int c = 1; c <= icul; )//这里我是使用了CExcel类中自带的写数据的函数
{
m_execl.PutValue(c, iRows, strNum);//c表示要写数据的列,iRow表示要写数据的行,strNum表示写入的字符串,这里是CString型
c++
}
/////////////////////////下面是较一般的写数据的方便
m_pRang.SetItem(_variant_t((
long
)1),_variant_t((
long
)1),_variant_t(
"数学系研究生课程统计"
)); //往第一行第一列的单元格中写数据
m_pRang.SetItem(_variant_t((
long
)2),_variant_t((
long
)1),_variant_t(
"课程名"
)); //往第二行第一列的单元格中写数据
//加载已经使用的单元格
m_execl.pRange.AttachDispatch(m_execl.pSheet.get_UsedRange());
//水平对齐:默认=1,居中=-4108,左=-4131,右=-4152
//垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107
m_execl.pRange.put_HorizontalAlignment(_variant_t((long)-4108));
m_execl.pRange.put_VerticalAlignment(_variant_t((long)-4108));
m_execl.pSheet.ReleaseDispatch();
m_execl.pSheets.ReleaseDispatch();
m_execl.pBook.ReleaseDispatch();
m_execl.pBooks.ReleaseDispatch();
//退出程序
m_execl.pApp.Quit();
m_execl.pApp.ReleaseDispatch();