MFC中使用EXCEL的方法之一

1、导入EXCEL控件

打开类向导,添加类型库中的MFC类

选择文件来源,打开EXCEL.EXE所在的文件路径

然后添加如下图所示的几个类,这几个类可以满足基本的读写

然后把新添加的这几个类中头文件中的 #import注释掉

当引用头文件准备使用时,会发现有个错误,此时在DialogBox()前增加一个下划线,变成VARIANT _DialogBox() 就可以正常使用了

2、初始化Ole环境

在程序初始化之后调用AfxOleInit();

在程序关闭之前调用AfxOleTerm();

3、调用

初始化EXCEL调用环境

cpp 复制代码
CApplication excelApp;
//启动Excel
if (!excelApp.CreateDispatch(_T("Excel.Application"), NULL))
{
	AfxMessageBox(_T("启动Excel失败!"));
	return FALSE;
}

获取工作簿和sheet页(EXCEL已经存在)

cpp 复制代码
    CWorkbook book;
	CWorkbooks books;
	CWorksheets sheets;
	CWorksheet sheet;

	// 解析EXCEL
	COleVariant
		covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	books.AttachDispatch(excelApp.get_Workbooks(), TRUE);
	book = books.Open(strExcelPath, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional);

	sheets = book.get_Worksheets();
	//获取第一个工作表
	sheet = sheets.get_Item(COleVariant((short)1));

创建一个新的工作簿

cpp 复制代码
CWorkbook bookNew = books.Add(covOptional);

对EXCEL的数据进行操作

cpp 复制代码
CRange usedRange;

usedRange.AttachDispatch(sheet.get_Cells(), TRUE);

// 或者如下(AttachDispatch和等于是两种不同的使用方式)
usedRange = sheet.get_UsedRange();


// 获取某个单元格,i,j从1开始
usedRange.AttachDispatch(usedRange.get_Item(COleVariant(long(i)), COleVariant(long(j))).pdispVal, TRUE);

// 或者如下
usedRange= usedRange.get_Item(COleVariant(long(i)), COleVariant(long(j))).pdispVal;

usedRange.put_Item(COleVariant(long(i)), COleVariant(long(j)), COleVariant(_T("文字内容"));

// 如果需要写入数字,则需要先设置格式,如下:
usedRange.put_NumberFormat(COleVariant(_T("@")));
usedRange.put_Item(COleVariant(long(i)), COleVariant(long(j)), COleVariant(_T("2025"));

// 读取或者写入单个单元格,还可以使用
COleVariant ret = usedRange.get_Value2();
usedRange.put_Value2(ret);

释放引用及保存EXCEL文件

cpp 复制代码
//保存
book.SaveCopyAs(COleVariant(strExcelPath));  //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件

book.put_Saved(TRUE);   //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
	
// 释放各种引用
usedRange.ReleaseDispatch();

sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();

books.ReleaseDispatch();

books.Close();

退出EXCEL操作

cpp 复制代码
	excelApp.Quit();
	excelApp.ReleaseDispatch();
相关推荐
百数平台1 天前
百数表格知识库配置指南:Excel/CSV 上传、表结构字段类型与 NL2SQL 查询全说明
excel
葡萄城技术团队1 天前
在 DSH 中直接查看和编辑 Excel:dsh-spreadjs-editor 开源插件发布
excel
开开心心就好1 天前
视频里的图片怎么提取?双击一下就导出
java·前端·人工智能·spring·智能手机·intellij-idea·excel
葡萄城技术团队1 天前
从 AI 生成到在线预览:dsh-spreadjs-editor 补齐 DSH 的 Excel 任务闭环
excel
泡海椒1 天前
JQuick-Excel 实战:用 STYLE 配置单元格与区域样式
开发语言·python·excel
优选资讯2 天前
标签打印软件怎么对接 Excel 数据
前端·excel
泡海椒2 天前
JQuick-Excel 实战:FORMAT 管理日期与数字的 Excel 显示
开发语言·python·excel
AIGS0012 天前
从814张表到250个本体:本体建模在做什么
数据库·excel·erp·数据中台·智能问数·本体语义·企业大脑
泡海椒2 天前
JQuick-Excel VALIDATION 实战:用作用范围约束 Excel 导入校验
开发语言·python·excel
jason.zeng@15022072 天前
(八)现有架构上新增一个通用Excel导出工具
python·架构·langchain·excel·llama