mfc中操作excel

发布于:2025-08-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

简介

在 MFC(Microsoft Foundation Classes)中操作 Excel,主要通过 OLE 自动化(OLE Automation) 实现,本质是调用 Excel 暴露的 COM 接口。Excel 的对象模型是一个层次化的结构,MFC 通过包装这些 COM 接口(生成对应的类,如 _Application、Workbook 等),让开发者可以通过类的方法和属性操作 Excel。

一、Excel 对象模型核心层次

Excel 的对象模型呈树状结构,核心对象从顶层到底层依次为:
ApplicationWorkbooksWorkbookWorksheetsWorksheetRange
释放对象:倒过来。
每个对象都有特定的功能,且通过属性或方法关联到下一层对象。

COleVariant

COleVariant 是 MFC 中用于处理 OLE 自动化(OLE Automation)中变体类型数据的类,专门用于在 MFC 程序与 COM/OLE 对象(如 Excel、Word 等 Office 应用程序)交互时,进行数据类型的转换和传递。
它封装了 COM 中的 VARIANT 结构,简化了不同数据类型(如字符串、数字、布尔值等)与 VARIANT 类型之间的转换,是 MFC 操作 COM/OLE 对象时不可或缺的工具类。

在 COM/OLE 自动化中,方法的参数和返回值通常要求是 VARIANT 类型(一种可以存储多种数据类型的通用结构)。COleVariant 对 VARIANT 进行了封装,提供了:

  1. 便捷的构造函数,支持直接用常见类型(如 intCStringBOOL 等)初始化。
  2. 自动管理内存(如字符串的分配与释放),避免手动操作 VARIANT 带来的内存泄漏风险。
  3. 简化了类型转换逻辑,无需手动设置 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 方法用于类型转换,以及 lValdblValbstrVal 等成员直接访问对应类型的值

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):总是更新链接。
  • 用途:打开包含外部链接的工作簿时,避免弹出更新提示(需配合 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 的基本流程

  1. 初始化 COM 环境:MFC 中需先调用 CoInitialize(NULL) 初始化 COM(结束后用 CoUninitialize() 释放)。
  2. 创建 Excel 应用对象:通过 _Application 类的 CreateDispatch 方法启动 Excel。
  3. 操作工作簿和工作表:通过 Workbooks.Add() 新建工作簿,或者Workbooks.Open()打开工作簿,Worksheets.GetItem() 获取工作表。
  4. 操作单元格:通过 Range 对象设置单元格值、格式等。
  5. 清理资源:依次关闭工作簿、退出 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();

网站公告

今日签到

点亮在社区的每一天
去签到