最基本的使用
本次是为了完成编程作业,不得不学习Excel接口的使用,找了很多教程和官网去查文档,可能是我方式不对吧,花费了很多精力也没有找到一个比较系统的东西,所以在自己博客记录,这次只使用了一些基本的功能,以后有缘继续学习的话,再增加这篇博客的内容吧。
一、基本编程环境
Visual Studio 2015 C++ MFC Excel2019
-
导入API文件
右键工程,添加类, 依次选择1,2,3 -
找到电脑的EXCEL.EXE所在的地方,选择它,添加下图方框内的7个类,然后点完成。
-
添加完成后会生成7个头文件,将这7个头文件里面最开始的这条语句注释掉:
#import “C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE” no_namespace然后添加头文件 #include <afxdisp.h>
为防止以后使用Office的其他程序时出错,这时可以给现在的7个类添加到一个新命名空间,我用的_excel(其他程序也有Application等类,到时候会冲突)。
二、这几个类的说明和操作步骤
操作步骤
(1)创建一个Excel应用程序。(Application类)
(2)得到Workbook的容器。
(3)打开一个Workbook或者创建一个Workbook。
(4)得到Workbook中的Worksheet的容器。
(5)打开一个Worksheet或者创建一个WorkSheet。
(6)通过Range对WorkSheet中的单元格进行读写操作。
(7)保存Excel。
(8)释放资源。
部分示例代码(这是我的一个功能函数,这里只作为参考)
// -----------------------------------------------------------------------------------------------
// 描述:对话框选择保存目录
//------------------------------------------------------------------------------------------------
CString strFilter;
strFilter ="Excel (*.xlsx)|*.*||"; //
CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
if ( IDOK != dlg.DoModal())
return;
CString strFileName;
strFileName = dlg.GetPathName();
// -----------------------------------------------------------------------------------------------
// 描述://excel 接口部分
//------------------------------------------------------------------------------------------------
_excel::CApplication app;
_excel::CFont0 font;
_excel::CRange range;
_excel::CRange col;
_excel::CWorkbook book;
_excel::CWorkbooks books;
_excel::CWorksheet sheet;
_excel::CWorksheets sheets;
CoInitialize(NULL);//初始化COM,最后还有CoUninitialize
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!app.CreateDispatch(_T("EXCEL.application"))) //启动excel
{
AfxMessageBox(_T("居然你连OFFICE都没有安装吗?"));
return;
}
app.put_Visible(TRUE);//设置表可见性
app.put_DisplayFullScreen(FALSE);//设置全屏显示
app.put_DisplayAlerts(FALSE);//屏蔽警告
books = app.get_Workbooks();
book = books.Add(vtMissing);//新建一个book
//获取工作表worksheet(三种方法)
sheet = book.get_ActiveSheet();
sheets = book.get_Sheets();
//worksheet = worksheets.get_Item((_variant_t("sheet2")));
//worksheet = worksheets.get_Item((_variant_t(1)));
// --------------------------------------------------------------------------------------------------
// 描述:编写文件内容
//---------------------------------------------------------------------------------------------------
CString TempStr;
range = sheet.get_Range(_variant_t("A1"), _variant_t("G1"));
range.Merge(_variant_t((long)0));
TempStr.Format(TEXT("本样品一共%d个裂缝,%d个孔洞,采用的分割阈值为:%d"), ListCracks.size(), ListHoles.size(), ThresholdValue);
range.put_Value2(_variant_t(TempStr));//参数是二维数组可以批量设置单元格值
range = sheet.get_Range(_variant_t("A2"), _variant_t("A2"));
range.put_Value2(_variant_t("孔洞编号"));
range = sheet.get_Range(_variant_t("B2"), _variant_t("B2"));
range.put_Value2(_variant_t("面积"));
range = sheet.get_Range(_variant_t("D2"), _variant_t("D2"));
range.put_Value2(_variant_t("面积"));
range = sheet.get_Range(_variant_t("C2"), _variant_t("C2"));
range.put_Value2(_variant_t("裂缝编号"));
range = sheet.get_Range(_variant_t("E2"), _variant_t("E2"));
range.put_Value2(_variant_t("长度"));
for (int i = 0; i < ListHoles.size(); i++)
{
int Temp = i + 3;
TempStr.Format(TEXT("A%d"), Temp);
range = sheet.get_Range(_variant_t(TempStr), _variant_t(TempStr));
TempStr.Format(TEXT("孔%d"), i);
range.put_Value2(_variant_t(TempStr));
TempStr.Format(TEXT("B%d"), Temp);
range = sheet.get_Range(_variant_t(TempStr), _variant_t(TempStr));
range.put_Value2(_variant_t(ListHoles[i]));
}
for (int i = 0; i < ListCracks.size(); i++)
{
int Temp = i + 3;
TempStr.Format(TEXT("C%d"), Temp);
range = sheet.get_Range(_variant_t(TempStr), _variant_t(TempStr));
TempStr.Format(TEXT("裂%d"), i);
range.put_Value2(_variant_t(TempStr));
TempStr.Format(TEXT("D%d"), Temp);
range = sheet.get_Range(_variant_t(TempStr), _variant_t(TempStr));
range.put_Value2(_variant_t(ListCracks[i].x));
TempStr.Format(TEXT("E%d"), Temp);
range = sheet.get_Range(_variant_t(TempStr), _variant_t(TempStr));
int length = ListCracks[i].y*0.5;
range.put_Value2(_variant_t(length));
}
// --------------------------------------------------------------------------------------------------
// 描述:存储
//---------------------------------------------------------------------------------------------------
covOptional = COleVariant((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant varZero((short)0);
COleVariant varTrue(short(1), VT_BOOL);
COleVariant varFalse(short(0), VT_BOOL);
book.SaveAs(COleVariant(strFileName), vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing, (long)0, vtMissing,
vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
// --------------------------------------------------------------------------------------------------
// 描述:释放
//---------------------------------------------------------------------------------------------------
font.ReleaseDispatch();
range.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
//app.Quit();//Excel退出
app.ReleaseDispatch();
CoUninitialize();//对应CoInitialize
/*OnOK();*///退出子对话框
参考结果