简介
在 MFC(Microsoft Foundation Classes)中操作 Excel,主要通过 OLE 自动化(OLE Automation) 实现,本质是调用 Excel 暴露的 COM 接口。Excel 的对象模型是一个层次化的结构,MFC 通过包装这些 COM 接口(生成对应的类,如 _Application、Workbook 等),让开发者可以通过类的方法和属性操作 Excel。
一、Excel 对象模型核心层次
Excel 的对象模型呈树状结构,核心对象从顶层到底层依次为:
Application
→ Workbooks
→ Workbook
→ Worksheets
→ Worksheet
→ Range
释放对象:倒过来。
每个对象都有特定的功能,且通过属性或方法关联到下一层对象。
COleVariant
COleVariant 是 MFC 中用于处理 OLE 自动化(OLE Automation)中变体类型数据的类,专门用于在 MFC 程序与 COM/OLE 对象(如 Excel、Word 等 Office 应用程序)交互时,进行数据类型的转换和传递。
它封装了 COM 中的 VARIANT 结构,简化了不同数据类型(如字符串、数字、布尔值等)与 VARIANT 类型之间的转换,是 MFC 操作 COM/OLE 对象时不可或缺的工具类。
在 COM/OLE 自动化中,方法的参数和返回值通常要求是 VARIANT 类型(一种可以存储多种数据类型的通用结构)。COleVariant 对 VARIANT 进行了封装,提供了:
- 便捷的构造函数,支持直接用常见类型(如
int
、CString
、BOOL
等)初始化。 - 自动管理内存(如字符串的分配与释放),避免手动操作
VARIANT
带来的内存泄漏风险。 - 简化了类型转换逻辑,无需手动设置
VARIANT
的类型标记(vt 字段)。
构造函数
COleVariant varInt(123);
COleVariant varStr("123");
COleVariant varCStr(CString("123"));
COleVariant varBool(VARIANT_TRUE); // 等价于 COleVariant(TRUE)
// 4. 浮点数(转换为 VT_R8 类型)
COleVariant varFloat(3.14);
// 5. 空值(VT_EMPTY,表示未初始化)
COleVariant varEmpty;
// 6. 单元格索引(Excel 中常用,如行号、列号)
COleVariant varIndex((short)1); // 短整数(VT_I2 类型)
常用方法
COleVariant
提供了 ChangeType
方法用于类型转换,以及 lVal
、dblVal
、bstrVal
等成员直接访问对应类型的值
COleVariant var(123); // 初始为整数(VT_I4)
// 转换为字符串类型(VT_BSTR)
var.ChangeType(VT_BSTR);
CString str = var.bstrVal; // 获取字符串值("123")
// 转换为浮点数类型(VT_R8)
var.ChangeType(VT_R8);
double d = var.dblVal; // 获取浮点值(123.0)
使用 Clear 方法释放内部数据,将其重置为 VT_EMPTY:
COleVariant var("Test");
var.Clear(); // 释放字符串资源,变为空值
与 VARIANT 结构互转
COleVariant var(100);
VARIANT v = var; // 隐式转换为 VARIANT 结构
_Application
对象(顶层应用对象)
对应 Excel 应用程序本身,是所有其他对象的根。
主要功能:控制整个 Excel 应用程序的状态、设置全局属性、获取工作簿集合等。
常用属性和方法:
CreateDispatch
excelApp.CreateDispatch("Excel.Application");
visible
设置 Excel 窗口是否可见(VARIANT_TRUE 显示,VARIANT_FALSE 后台运行)。
// 1. 设置 Excel 可见
excelApp.SetVisible(VARIANT_TRUE); // 显示 Excel 窗口
// 2. 设置 Excel 不可见(后台运行)
excelApp.SetVisible(VARIANT_FALSE);
// 3. 获取当前可见状态
VARIANT_BOOL isVisible = excelApp.GetVisible();
if (isVisible == VARIANT_TRUE) {
// Excel 窗口当前可见
}
PutDisplayAlerts
excelApp.PutDisplayAlerts(VARIANT_FALSE); // 关闭警告框
GetWorkbooks
返回 Workbooks 集合对象,用于管理所有打开的工作簿(新建、打开、关闭等)
Workbooks workbooks = excelApp.GetWorkbooks(); // 获取工作簿集合
ActiveWorkbook
获取当前激活(选中)的工作簿。
_Workbook activeBook = excelApp.GetActiveWorkbook(); // 获取当前激活的工作簿
ActiveSheet
_Worksheet activeSheet = excelApp.GetActiveSheet(); // 获取当前激活的工作表
ScreenUpdating
- 功能:控制 Excel 是否实时刷新屏幕(如单元格数据变化、格式修改时的界面更新)。
- 取值:VARIANT_TRUE(实时刷新)/ VARIANT_FALSE(暂停刷新)。
- 典型用途:批量操作(如写入大量数据)时设为 FALSE,减少界面渲染开销,提升效率;操作完成后恢复为 TRUE。
excelApp.PutScreenUpdating(VARIANT_FALSE); // 暂停屏幕刷新
// 执行大量数据写入...
excelApp.PutScreenUpdating(VARIANT_TRUE); // 恢复刷新
Calculation
设置 Excel 公式的计算模式(自动 / 手动计算)。
批量修改数据时设为手动计算,避免频繁触发公式更新,提升性能;完成后切换回自动计算并手动刷新。
xcelApp.PutCalculation(-4135); // 设为手动计算
// 批量修改数据...
excelApp.Calculate(); // 手动触发一次计算
excelApp.PutCalculation(-4105); // 恢复自动计算
Quit()
必须调用此方法,否则即使释放对象,Excel 进程仍可能残留(尤其当 Visible = FALSE 时)。
excelApp.Quit(); // 关闭 Excel 应用
Run()
运行 Excel 中的宏(VBA 过程)。
// 运行当前工作簿中的 "MyMacro" 宏
excelApp.Run(COleVariant("MyMacro"), COleVariant(), ...); // 后续参数为宏的输入参数
PutWindowState()
excelApp.PutWindowState(-4137); // 最大化 Excel 窗口
取值:
- xlMaximized(-4137):最大化。
- xlMinimized(-4140):最小化。
- xlNormal(-4143):正常大小。
对象释放
_Application 是顶层对象,需在最后释放(释放顺序:从底层对象如 Range、Worksheet 到顶层 _Application),避免内存泄漏。
excelApp.ReleaseDispatch();
Workbooks 对象(工作簿集合)
代表 Excel 应用程序中所有打开的工作簿,用于管理工作簿的创建、打开、关闭等。
常用方法:
GetCount
获取当前打开的工作簿数量。
用途: 判断是否有打开的工作簿,或遍历所有工作簿。
long count = wrokbooks.GetCount();
GetItem
- 功能:通过索引或名称获取指定的工作簿(_Workbook 对象)。
- 参数:VARIANT 类型(可为索引,如 1;或工作簿名称,如 “数据报表.xlsx”)。
- 注意:Excel 中索引从 1 开始(而非 0)。
// 通过索引获取第一个工作簿
_Workbook firstBook = workbooks.GetItem(COleVariant((short)1));
// 通过名称获取工作簿(需确保名称正确,不含路径)
_Workbook namedBook = workbooks.GetItem(COleVariant("test.xlsx"));
Add()
- 功能:新建一个工作簿。
- 参数(可选):VARIANT 类型,指定新建工作簿的模板(默认使用空白模板):
- 缺省(或 COleVariant((long)1)):新建空白工作簿(默认)。
- 模板路径:如 COleVariant(“C:\模板.xltx”),基于指定模板创建。
- 返回值:新建的 _Workbook 对象。
// 新建空白工作簿
_Workbook newBook = workbooks.Add(COleVariant((long)1));
// 基于模板新建工作簿
_Workbook templateBook = workbooks.Add(COleVariant("C:\\my_template.xltx"));
Open()
- 功能:打开指定路径的 Excel 文件。
- 返回值:打开的 _Workbook 对象。
// 正常打开文件
_Workbook openBook = workbooks.Open("C:\\test.xlsx");
// 只读打开文件
_Workbook readOnlyBook = workbooks.Open(
"C:\\test.xlsx",
COleVariant((long)0), // 忽略其他默认参数
COleVariant(VARIANT_TRUE) // 只读模式
);
参数
_Workbook Open(
VARIANT FileName, // 1. 文件路径(必填)
VARIANT UpdateLinks, // 2. 链接更新方式
VARIANT ReadOnly, // 3. 是否只读打开
VARIANT Format, // 4. 文本文件分隔符(打开文本文件时用)
VARIANT Password, // 5. 打开密码(加密文件)
VARIANT WriteResPassword, // 6. 写入密码(修改权限密码)
VARIANT IgnoreReadOnlyRecommended, // 7. 忽略只读推荐
VARIANT Origin, // 8. 文本文件原始格式(如编码)
VARIANT Delimiter, // 9. 文本文件分隔符(替代参数4)
VARIANT Editable, // 10. 是否可编辑(对某些格式有效)
VARIANT Notify, // 11. 通知权限(共享工作簿时)
VARIANT Converter, // 12. 文件转换器(旧格式转换)
VARIANT AddToMru, // 13. 是否添加到最近使用文件列表
VARIANT Local, // 14. 是否使用区域设置
VARIANT CorruptLoad // 15. 损坏文件加载方式
);
UpdateLinks
- 功能:控制工作簿中外部链接(如链接到其他文件的数据)的更新方式。
- 取值:
- 0 或
xlUpdateLinksNever
(-4142):从不更新链接。 - 1 或
xlUpdateLinksUserSetting
(1):按用户设置更新(默认)。 - 2 或
xlUpdateLinksAlways
(3):总是更新链接。
- 0 或
- 用途:打开包含外部链接的工作簿时,避免弹出更新提示(需配合 DisplayAlerts = FALSE)。
// 打开文件时从不更新外部链接
workbooks.Open(
"C:\\linked_book.xlsx",
COleVariant((long)-4142), // UpdateLinks = 从不更新
COleVariant(VARIANT_FALSE) // ReadOnly = 否
);
Password 与 WriteResPassword
Password
:打开受密码保护的工作簿时,需提供此密码(否则无法打开)。
WriteResPassword
:若文件设置了 “修改权限密码”,需提供此密码才能编辑(否则只能只读打开)。
// 打开同时设置了打开密码和修改密码的文件
_Workbook book = workbooks.Open(
"C:\\encrypted.xlsx",
COleVariant((long)1), // UpdateLinks = 默认
COleVariant(VARIANT_FALSE), // ReadOnly = 否
COleVariant((long)0), // Format = 默认
COleVariant("open123"), // 打开密码
COleVariant("write456") // 修改权限密码
);
IgnoreReadOnlyRecommended
- 功能:控制是否忽略 Excel 的 “只读推荐” 设置(文件作者可能建议只读打开)。
- 取值:VARIANT_TRUE(忽略推荐,允许编辑)/ VARIANT_FALSE(遵循推荐,默认只读打开)。
// 忽略只读推荐,强制可编辑打开
workbooks.Open(
"C:\\recommend_readonly.xlsx",
COleVariant((long)1),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(""),
COleVariant(""),
COleVariant(VARIANT_TRUE) // 忽略只读推荐
);
AddToMru
- 功能:控制打开的文件是否添加到 Excel 的 “最近使用文件” 列表(文件菜单中显示)。
- 取值:VARIANT_TRUE(添加,默认)/ VARIANT_FALSE(不添加)。
- 用途:自动化操作时,避免在用户的最近文件列表中留下痕迹。
// 打开文件但不添加到最近使用列表
workbooks.Open(
"C:\\temp.xlsx",
COleVariant((long)1),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(""),
COleVariant(""),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(""),
COleVariant(VARIANT_TRUE),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(VARIANT_FALSE) // 不添加到最近列表
);
CorruptLoad
- 功能:指定如何加载疑似损坏的文件。
- 取值:
- 0 或 xlNormalLoad(默认):正常加载(若损坏则报错)。
- 1 或 xlRepairFile:尝试修复损坏的文件后加载。
- 2 或 xlExtractData:仅提取文件中的数据(忽略格式和公式)。
// 尝试修复损坏的文件并打开
workbooks.Open(
"C:\\corrupt.xlsx",
COleVariant((long)1),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(""),
COleVariant(""),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(""),
COleVariant(VARIANT_TRUE),
COleVariant(VARIANT_FALSE),
COleVariant((long)0),
COleVariant(VARIANT_TRUE),
COleVariant(VARIANT_TRUE),
COleVariant((long)1) // 尝试修复损坏文件
);
close
- 功能:关闭所有打开的工作簿(不常用,建议通过 _Workbook.Close() 单独关闭)。
- 注意:若工作簿有未保存的修改,会根据
Application.DisplayAlerts
决定是否提示保存(DisplayAlerts = FALSE 时默认不保存)。
workbooks.Close(); // 关闭所有工作簿(谨慎使用,可能丢失未保存数据)
Workbook
对象(单个工作簿)
代表一个 Excel 文件(.xlsx、.xls 等),包含工作表、图表等内容。
常用属性和方法:
Name
获取或设置工作簿的名称(不含路径,仅文件名)。
_Workbook workbook = workbooks.Open("a.xlsx");
CString oldName = workbook.GetName();
workbook.SetName("new book.xlsx");
GetFullName
- 功能:获取工作簿的完整路径(含路径和文件名)。
- 用途:常用于确认文件保存位置或判断文件是否已保存。
CString fullPath = workbook.GetFullName(); // 如 "C:\data.xlsx"
GetPath
获取工作簿所在的文件夹路径(不含文件名)。
CString folder = workbook.GetPath(); // 如 "C:\"
GetSaved
- 功能:判断工作簿是否已保存(VARIANT_TRUE 表示未修改或已保存,VARIANT_FALSE 表示有未保存的修改)。
- 用途:避免重复保存或提示用户保存修改。
if (workbook.GetSaved() == VARIANT_FALSE) {
workbook.Save(); // 若有未保存修改,则保存
}
GetWorksheets
- 功能:返回 Worksheets 集合对象,用于管理当前工作簿中的所有工作表。
- 类型:Worksheets 类(子对象集合)。
Worksheets worksheets = workbook.GetWorksheets(); // 获取工作表集合
long sheetCount = worksheets.GetCount(); // 获取工作表数量
ActiveSheet
- 功能:获取或设置当前工作簿中激活(选中)的工作表。
- 类型:_Worksheet 类。
_Worksheet activeSheet = workbook.GetActiveSheet(); // 获取当前激活的工作表
workbook.SetActiveSheet(worksheets.GetItem(COleVariant((short)2))); // 激活第2个工作表
Save
保存当前工作簿(按当前路径和格式保存,若为新建文件未保存过,会弹出保存对话框,除非已通过 SaveAs 保存过)。
workbook.Save();
SaveAs()
- 功能:将工作簿另存为指定路径和格式的文件(新建文件必须用此方法首次保存)。
- 核心参数(常用):
- FileName:VARIANT 类型,保存路径(如 “C:\new_data.xlsx”)。
- FileFormat:VARIANT 类型,保存格式(如 .xlsx 对应 51,.xls 对应 56)。
- Password:VARIANT 类型,设置打开密码(可选)。
- 常用格式参数:
- xlOpenXMLWorkbook(51):.xlsx(默认,Excel 2007+ 格式)。
- xlWorkbookNormal(56):.xls(Excel 97-2003 格式)。
- xlCSV(6):.csv(逗号分隔文本)。
// 另存为 .xlsx 格式并设置密码
workbook.SaveAs(
COleVariant("C:\\saved.xlsx"), // 路径
COleVariant((long)51), // 格式(.xlsx)
COleVariant("open123"), // 打开密码
COleVariant(""), // 写入密码(可选)
COleVariant(VARIANT_FALSE), // 不推荐只读
COleVariant(VARIANT_FALSE) // 不创建备份
);
Close
- 功能:关闭当前工作簿。
- 参数:VARIANT_BOOL SaveChanges(可选):
- VARIANT_TRUE:关闭前保存修改。
- VARIANT_FALSE:关闭前不保存修改。
- 缺省:若工作簿有未保存修改,会根据 Application.DisplayAlerts 决定是否提示。
workbook.Close(COleVariant(VARIANT_TRUE)); // 关闭并保存修改
Activate
激活当前工作簿(使其成为 Excel 中当前操作的工作簿)。
workbook.Activate(); // 激活工作簿
newSheet
功能:在当前工作簿中新建一个工作表(等价于 Worksheets.Add())。
_Worksheet newSheet = workbook.NewSheet(); // 新建工作表
newSheet.SetName("新工作表");
Protect() 与 Unprotect()
- Protect():保护工作簿(防止结构修改,如添加 / 删除工作表)。
- 参数:Password(可选,保护密码)、Structure(是否保护结构,默认 TRUE)。
- Unprotect():解除工作簿保护(需提供保护时的密码)。
workbook.Protect(COleVariant("protect123"), COleVariant(VARIANT_TRUE)); // 保护工作簿
workbook.Unprotect(COleVariant("protect123")); // 解除保护
Worksheets 对象(工作表集合)
代表一个工作簿中所有的工作表(Sheet1、Sheet2 等),用于管理工作表的创建、删除、选择等。
常用方法:
Count
- 功能:获取当前工作簿中工作表的数量。
- 返回值:long 类型(非负整数)。
- 用途:遍历所有工作表或判断是否存在工作表。
Worksheets worksheets = workbook.GetWorksheets();
long sheetCount = worksheets.GetCount(); // 获取工作表总数
Item
- 功能:通过索引或名称获取指定的工作表(_Worksheet 对象)。
- 参数:VARIANT 类型(可为索引,如 1;或工作表名称,如 “Sheet1” 或 “销售数据”)。
- 注意:Excel 中工作表索引从 1 开始(而非 0),名称区分大小写。
// 通过索引获取第一个工作表
_Worksheet sheet1 = worksheets.GetItem(COleVariant((short)1));
// 通过名称获取工作表
_Worksheet salesSheet = worksheets.GetItem(COleVariant("销售数据"));
Add()
- 功能:在当前工作簿中新建一个工作表。
- 参数(可选):
- Before:VARIANT 类型,指定新工作表插入到哪个工作表之前(默认插入到当前激活工作表之前)。
- After:VARIANT 类型,指定新工作表插入到哪个工作表之后(与 Before 互斥)。
- Count:VARIANT 类型,新建工作表的数量(默认 1)。
- Type:VARIANT 类型,工作表类型(默认空白工作表,xlWorksheet 对应值为 1)。
- 返回值:新建的 _Worksheet 对象(若新建多个,返回第一个)。
// 在最后一个工作表后新建1个空白工作表
_Worksheet newSheet = worksheets.Add(
COleVariant(), // Before:不指定(默认)
worksheets.GetItem(COleVariant((short)worksheets.GetCount())), // After:最后一个工作表
COleVariant((short)1), // Count:1个
COleVariant((short)1) // Type:空白工作表
);
newSheet.SetName("新工作表"); // 重命名
Delete()
- 功能:删除当前选中的工作表(需先通过 _Worksheet.Select() 选中)。
- 注意:
- 删除前需确保工作表已被选中,否则可能删除错误的工作表。
- 若
Application.DisplayAlerts = TRUE
,会弹出确认对话框;设为 FALSE 则直接删除(无提示)。
// 删除第2个工作表(无提示)
excelApp.PutDisplayAlerts(VARIANT_FALSE); // 关闭警告框
_Worksheet sheetToDelete = worksheets.GetItem(COleVariant((short)2));
sheetToDelete.Select(); // 选中要删除的工作表
worksheets.Delete(); // 执行删除
excelApp.PutDisplayAlerts(VARIANT_TRUE); // 恢复警告框
Worksheet 对象(单个工作表)
代表工作簿中的一张工作表,是操作单元格数据的主要载体。
常用属性和方法:
Name
功能:获取或设置工作表的名称(显示在底部标签栏的名称)。
_Worksheet sheet = worksheets.GetItem(COleVariant((short)1));
CString oldName = sheet.GetName(); // 获取当前名称(如 "Sheet1")
sheet.SetName("销售报表"); // 重命名为“销售报表”
UsedRange
- 功能:返回工作表中已使用的单元格区域(包含数据或格式的最小矩形区域)。
- 类型:Range 对象。
- 用途:快速获取工作表中实际有数据的区域,避免遍历整个工作表。
Range usedRange = sheet.GetUsedRange();
CString address = usedRange.GetAddress(); // 获取已用区域地址(如 "$A$1:$C$10")
long rowCount = usedRange.GetRows().GetCount(); // 已用区域的行数
long colCount = usedRange.GetColumns().GetCount(); // 已用区域的列数
Cells
功能:返回工作表中所有单元格的集合(Range 对象),可通过行列索引访问指定单元格。
// 获取第1行第1列(A1)单元格
Range cellA1 = sheet.GetCells().GetItem(COleVariant((long)1), COleVariant((long)1));
cellA1.SetValue(COleVariant("数据")); // 写入数据
Visible
- 功能:控制工作表是否可见(隐藏或显示)。
- 取值:
- VARIANT_TRUE:可见(默认)。
- VARIANT_FALSE:隐藏(仍存在于工作簿中,可通过 SetVisible(VARIANT_TRUE) 恢复)。
- xlSheetVeryHidden(2):深度隐藏(无法通过 Excel 界面手动恢复,只能通过代码设置可见)。
sheet.SetVisible(VARIANT_FALSE); // 隐藏工作表
Index
- 功能:获取工作表在工作簿中的索引位置(从 1 开始)。
- 用途:判断工作表的排列顺序。
long index = sheet.GetIndex(); // 获取索引(如第3个工作表返回 3)
GetRange()
- 功能:通过单元格地址或名称获取指定区域(Range 对象)。
- 参数:单元格地址(如 “A1”、“A1:B10”、“A:A” 表示整列)。
// 获取 A1 到 C3 的区域
Range range1 = sheet.GetRange(COleVariant("A1:C3"));
// 获取第2行(整行)
Range row2 = sheet.GetRange(COleVariant("2:2"));
// 获取 B 列(整列)
Range colB = sheet.GetRange(COleVariant("B:B"));
Select()
功能:选中当前工作表(使其成为激活状态)。
用途:删除工作表前必须先选中,或切换到指定工作表进行操作。
sheet.Select(); // 选中当前工作表
Copy
- 功能:复制当前工作表到指定位置(同一工作簿或其他工作簿)。
- 参数(可选):
- Before:复制到哪个工作表之前(默认复制到工作簿末尾)。
- After:复制到哪个工作表之后(与 Before 互斥)。
// 复制当前工作表到最后一个工作表之后
sheet.Copy(COleVariant(), worksheets.GetItem(COleVariant((short)worksheets.GetCount())));
Delete()
- 功能:删除当前工作表(等价于 Worksheets.Delete(),但需先选中)。
- 注意:需配合 Application.DisplayAlerts = FALSE 避免确认对话框。
excelApp.PutDisplayAlerts(VARIANT_FALSE);
sheet.Select();
sheet.Delete(); // 删除当前工作表
excelApp.PutDisplayAlerts(VARIANT_TRUE);
Protect() 与 Unprotect()
- Protect():保护工作表(防止修改单元格数据或格式)。
- 参数:Password(保护密码,可选)、Contents(是否保护单元格内容,默认 TRUE)等。
- Unprotect():解除工作表保护(需提供保护密码)。
sheet.Protect(COleVariant("sheet123"), COleVariant(VARIANT_TRUE)); // 保护工作表
sheet.Unprotect(COleVariant("sheet123")); // 解除保护
Range 对象(单元格区域)
代表工作表中的一个或多个单元格(单个单元格、连续区域或不连续区域),是操作数据、格式的核心对象。
常用属性和方法:
Formula
功能:获取或设置单元格的公式(以等号 = 开头)。
用途:通过代码设置 Excel 公式,实现自动计算。
// 设置 B3 单元格公式为 "=A3*2"(计算 A3 的 2 倍)
Range formulaCell = sheet.GetRange(COleVariant("B3"));
formulaCell.SetFormula(COleVariant("=A3*2"));
Value
功能:获取或设置单元格区域的值(支持文本、数字、日期等类型)。
注意:读取时会根据单元格内容自动转换类型;写入时需用 COleVariant 包装数据。
Range cell = sheet.GetRange(COleVariant("A1"));
cell.SetValue(COleVariant("测试")); // 写入文本
cell.SetValue(COleVariant(123.45)); // 写入数字
COleVariant value = cell.GetValue(); // 读取值
if (value.vt == VT_BSTR) {
CString str = value.bstrVal; // 文本类型
} else if (value.vt == VT_R8) {
double num = value.dblVal; // 数字类型
}
Address
功能:获取单元格区域的地址(如 “$A1"、"1"、"1"、"A1:1:1:C$3”)。
参数(可选):是否包含绝对引用符号 $、是否使用 R1C1 格式等。
Range range = sheet.GetRange(COleVariant("A1:C3"));
CString addr = range.GetAddress(); // 返回 "$A$1:$C$3"
Row 与 Column
功能:Row 返回区域左上角单元格的行号;Column 返回区域左上角单元格的列号(A=1,B=2,…)。
Range range = sheet.GetRange(COleVariant("B2:D4"));
long startRow = range.GetRow(); // 返回 2(B2 的行号)
long startCol = range.GetColumn(); // 返回 2(B 列对应数字 2)
Rows 与 Columns
返回区域中所有行或列的集合(Range 对象),用于批量设置行高、列宽等。
Range range = sheet.GetRange(COleVariant("A1:C3"));
range.GetRows().SetRowHeight(COleVariant((double)20)); // 设置区域所有行高为 20
range.GetColumns().SetColumnWidth(COleVariant((double)15)); // 设置区域所有列宽为 15
Font
功能:返回 Font 对象,用于设置区域的字体(大小、颜色、加粗等)。
Range title = sheet.GetRange(COleVariant("A1"));
Font font = title.GetFont();
font.SetBold(VARIANT_TRUE); // 加粗
font.SetSize(14); // 字号 14
font.SetColor(RGB(255, 0, 0)); // 红色字体
Interior
功能:返回 Interior 对象,用于设置单元格背景色、填充样式等。
Range cell = sheet.GetRange(COleVariant("B2"));
Interior interior = cell.GetInterior();
interior.SetColor(RGB(255, 255, 200)); // 浅黄色背景
MergeCells
功能:判断或设置区域是否为合并单元格(VARIANT_TRUE 表示已合并)。
Range mergeRange = sheet.GetRange(COleVariant("A1:C1"));
mergeRange.SetMergeCells(COleVariant(VARIANT_TRUE)); // 合并单元格
Merge()
功能:合并指定区域的单元格(等价于 SetMergeCells(VARIANT_TRUE))。
参数:VARIANT_BOOL MergeCells(VARIANT_TRUE 合并,VARIANT_FALSE 取消合并)。
sheet.GetRange(COleVariant("A1:C1")).Merge(COleVariant(VARIANT_TRUE)); // 合并 A1-C1
AutoFit()
功能:自动调整区域的行高或列宽,以适应内容(根据单元格中最长内容自动缩放)。
// 自动调整 A 列宽度
sheet.GetRange(COleVariant("A:A")).AutoFit();
// 自动调整 1-5 行高度
sheet.GetRange(COleVariant("1:5")).AutoFit();
ClearContents()
清除区域中的内容(保留格式)。
sheet.GetRange(COleVariant("A1:C3")).ClearContents(); // 清除 A1-C3 的内容
ClearFormats()
功能:清除区域中的格式(保留内容)。
sheet.GetRange(COleVariant("A1:C3")).ClearFormats(); // 清除 A1-C3 的格式
Clear()
功能:清除区域中的内容和格式(完全清空)。
sheet.GetRange(ColeVariant("A1:C3")).Clear();
Resize()
功能:调整区域的大小(基于当前区域左上角单元格,扩展或缩小行列数)。
参数:RowSize(新的行数)、ColumnSize(新的列数)。
// 将 A1 单元格扩展为 3 行 2 列的区域(A1:B3)
Range range = sheet.GetRange(COleVariant("A1"));
Range resized = range.Resize(COleVariant((long)3), COleVariant((long)2));
Offset()
功能:获取当前区域偏移指定行列后的新区域(基于当前区域左上角单元格偏移)。
参数:RowOffset(行偏移量,正数向下,负数向上)、ColumnOffset(列偏移量,正数向右,负数向左)。
// 获取 A1 向右偏移 2 列、向下偏移 1 行的区域(C2)
Range range = sheet.GetRange(COleVariant("A1"));
Range offsetRange = range.Offset(COleVariant((long)1), COleVariant((long)2));
MFC 操作 Excel 的基本流程
- 初始化 COM 环境:MFC 中需先调用
CoInitialize(NULL)
初始化 COM(结束后用CoUninitialize()
释放)。 - 创建 Excel 应用对象:通过
_Application
类的CreateDispatch
方法启动 Excel。 - 操作工作簿和工作表:通过
Workbooks.Add()
新建工作簿,或者Workbooks.Open()
打开工作簿,Worksheets.GetItem()
获取工作表。 - 操作单元格:通过
Range
对象设置单元格值、格式等。 - 清理资源:依次关闭工作簿、退出 Excel,释放所有对象(避免 Excel 进程残留)。
示例
#include "excel.h"
CoInitialize(NULL);
_Application excelApp;
if(!excelApp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("无法启动excle");
return;
}
Workbooks workbooks = excelApp.GetWrokbooks();
_Workbook workbook = workbooks.Add((long)xlWorkSheet); // xlWorksheet = 1
Worksheets worksheets = workbook.GetWorksheets();
_Worksheet worksheet = worksheets.GetItem(COleVariant((short)1));
Range range = worksheet.GetRange(COleVariant("A1"), ColeVariant("A1"));
range.SetValue(COleVariant("Hello excel"));
Font font = range.GetFont();
font.SetBold(TRUE);
font.SetSize(14);
workbook.SaveAs(COleVariant("C:\\a.xlsx"),
COleVariant((long)xlOpenXMLWorkbook), // .xlsx
COleVariant((short)0), COleVariant(""),
COleVariant(FALSE), COleVariant(FALSE),
COleVariant((long)xlNoChange),
COleVariant((long)xlLocalSessionChanges)
)
workbook.Close(COleVariant(FALSE));
workbooks.ReleaseDispatch();
workbook.ReleaseDispatch();
worksheet.ReleaseDispatch();
worksheets.ReleaseDispatch();
// 6. 退出 Excel 并释放
excelApp.Quit();
excelApp.ReleaseDispatch();
// 释放 COM
CoUninitialize();