记录Excel API的使用 MFC

1 篇文章 0 订阅

最基本的使用

本次是为了完成编程作业,不得不学习Excel接口的使用,找了很多教程和官网去查文档,可能是我方式不对吧,花费了很多精力也没有找到一个比较系统的东西,所以在自己博客记录,这次只使用了一些基本的功能,以后有缘继续学习的话,再增加这篇博客的内容吧。

一、基本编程环境

Visual Studio 2015 C++ MFC Excel2019

  1. 导入API文件
    右键工程,添加类, 依次选择1,2,3在这里插入图片描述

  2. 找到电脑的EXCEL.EXE所在的地方,选择它,添加下图方框内的7个类,然后点完成。
    在这里插入图片描述

  3. 添加完成后会生成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();*///退出子对话框

参考结果
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值