作为刚毕业的菜鸡入职后,部门老大让做一个小程序,要求能够读写EXCEL文件,赶紧百度搜索VC读写Excel文件,参照了几位大佬的博客后终于完成,于是在此写下大白的一点点收获以便以后复用。并且这也是大白的第一篇博客呀!
打开Class Wizard,点击Add class按钮下的From a type Library导入office安装目录下的excel.exe,然后选择_Application,Workbooks,_Workbook,_Worksheet,Worksheets,Range等类,点击OK后可以在源文件和头文件中看到excel.cpp、excel.h两个文件,在excel.h文件中可以看到刚刚选择的类,在需要操作Excel的文件中#include “excel.h”就可以了。
在程序的入口处(CWinApp派生类的InitInstance()方法中)添加如下代码:
if (!AfxOleInit())
{
AfxMessageBox("无法初始化COM的动态链接库");
return FALSE;
}
如果是在其它线程中操作Excel务必在线程中再次初始化COM组件。
定义如下变量:
_Application excel_app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
选择要读取的Excel文件:
CString excelPathName;
CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
NULL,
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("xlsx Files(*.xlsx)|*.xlsx||"), //打开xlsx文件
NULL);
if(dlg.DoModal()==IDOK)
{
excelPathName=dlg.GetPathName(); //文件名保存在了excelPathName里
}
读取Excel文件:
if (!excel_app.CreateDispatch("Excel.Application"))//创建Excel服务器
{
AfxMessageBox("无法启动EXCEL服务器");
}
else
{
excel_app.SetVisible(TRUE); //使Excel可见
excel_app.SetUserControl(TRUE); //允许其他用户控制Excel
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
books.AttachDispatch(excel_app.GetWorkbooks());
LPDISPATCH lpdis = books.Open(excelPathName, covOptional, covOptional, covOptional, covOptional
, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional
, covOptional, covOptional, covOptional);
book.AttachDispatch(lpdis);
sheets.AttachDispatch(book.GetWorksheets());
sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
range.AttachDispatch(sheet.GetCells());
_variant_t var;
CString tmpStr;//存储每个格子的数据
int r,c;
var =range.GetItem(_variant_t((long)r)
,_variant_t((long)c));//读取第r行c列的数据,注意行和列都是从1开始
tmpStr.Format("%s",(char*)(_bstr_t)var);//转换成CString
book.SetSaved(TRUE);//将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存 ,如果没有这句会导致Excel释放不掉!
range.ReleaseDispatch();//注意释放顺序
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
excel_app.ReleaseDispatch();
excel_app.Quit();
}
写入数据到Excel文件:
if (!excel_app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("无法启动EXCEL服务器");
}
else
{
excel_app.SetVisible(TRUE);
excel_app.SetUserControl(TRUE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
books.AttachDispatch(excel_app.GetWorkbooks());
book.AttachDispatch(books.Add(covOptional));
sheets.AttachDispatch(book.GetWorksheets());
sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
Range range;
range.AttachDispatch(sheet.GetCells());
int r,c; //r表示行数,c表示列数
CString data,savePath;//这里data存储要写入的数据,savePath为要保存的Excel文件路径
range.SetItem(_variant_t((long)r), _variant_t((long)c), _variant_t(data));//在第r行c列写入数据data,注意行和列都是从1开始
book.SaveAs(COleVariant(savePath), covOptional, covOptional,
covOptional, covOptional, covOptional, 0, covOptional,
covOptional, covOptional, covOptional, covOptional);
book.SetSaved(TRUE);
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
excel_app.ReleaseDispatch();
excel_app.Quit();
}
好了,一篇简单读写Excel文件的博客就此结束了,大白的第一篇博客呀!虽然简陋但也是大白第一步,希望自己继续努力。