如何在 C++ 中使用 XLSX 包装
Aspose.Cells FOSS for C++ 读取和写入 Excel 文件,使用 .xlsx Open XML 格式。内部,XlsxWorkbookSerializer 类负责协调所有工作簿部件的加载和保存。本指南解释如何使用加载/保存 API,以及包装层自动管理的内容。
分步指南
步骤 1:设置构建
cmake_minimum_required(VERSION 3.15)
project(XlsxPackaging CXX)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(path/to/Aspose.Cells-FOSS-for-Cpp)
add_executable(XlsxPackaging main.cpp)
target_link_libraries(XlsxPackaging PRIVATE Aspose.Cells.Foss.Cpp)步骤 2:包含头文件
#include "aspose/cells_foss/Workbook.h"
#include "aspose/cells_foss/Worksheet.h"
#include "aspose/cells_foss/Cell.h"
using namespace Aspose::Cells_FOSS;步骤 3:加载现有 XLSX 文件
Workbook(filePath) 构造函数在内部调用 XlsxWorkbookSerializer::Load 来解包所有 Open XML 部分:
int main() {
Workbook workbook("input.xlsx");
Worksheet& sheet = workbook.GetWorksheets()[0];
std::string title = sheet.GetCells()["A1"].GetStringValue();
return 0;
}步骤 4:修改工作簿
使用标准 API 对任意单元格、样式或结构进行更改:
sheet.GetCells()["A1"].PutValue("Updated Title");
sheet.GetCells()["B2"].PutValue(99.0);
sheet.GetCells()["C3"].SetFormula("=B2*2");步骤 5:保存工作簿
调用 Workbook::Save(fileName) 将所有打开的 XML 部分重新打包为 XLSX 存档:
workbook.Save("output.xlsx");
workbook.Dispose();格式根据 .xlsx 扩展名推断。XlsxWorkbookSerializer::Save 方法会自动处理写入 xl/workbook.xml、xl/worksheets/sheet*.xml、xl/styles.xml 和 xl/sharedStrings.xml 部分。
步骤 6:了解包装层管理的内容
您无需直接与包装内部交互。序列化器会处理:
| Part | 管理者 |
|---|---|
| 工作簿结构 | XlsxWorkbookProperties |
| 工作表数据 | WorksheetXmlMapper |
| 样式和字体 | XlsxWorkbookStyles |
| 共享字符串 | SharedStringTableXmlMapper |
| 文档属性 | XlsxDocumentProperties |
| 已定义的名称 | XlsxWorkbookDefinedNames |
常见问题与解决方案
文件已保存,但在 Excel 中无法打开 确保输出文件路径使用 .xlsx 扩展名。使用不同的扩展名保存可能会产生无法识别的文件。
往返后样式丢失 Apply Cell::SetStyle(style) 调用之前 Workbook::Save. 保存后修改的样式未写入。
文件加载为空 验证文件未受密码保护且是有效的 XLSX(而不是 .xls or .xlsm)。该库支持 .xlsx 仅。
保存后缺少已定义的名称 使用 Workbook::EnsureUniqueDefinedName() 在保存之前以解决任何作用域冲突。
内存未释放 Call workbook.Dispose() 保存之后以释放所有内部 XLSX 打包资源。
常见问题
我能保存为除 XLSX 之外的其他格式吗?
当前 v0.1 版本仅支持保存为 XLSX。支持加载 CSV,但不提供保存为 CSV 的功能。
库会保留我未修改的现有部件吗?
是的。序列化器会对加载的所有部件进行往返处理。未修改的工作表数据、样式和已定义的名称在保存时会被保留。
我可以检查工作簿部件的原始 XML 吗?
XmlDocument::SaveToUtf8() 方法将 XML 文档序列化为字符串。但是,公开的 API 中未暴露对 XLSX 档案部件的直接访问。请使用 XmlDocument 进行自定义 XML 处理。
是否有针对大文件的流式 API?
没有。当前版本会将整个工作簿加载到内存中。对于非常大的文件,建议将处理分块为更小的工作簿。
如果我在同一个已加载的文件上覆盖保存,会发生什么?
这是受支持的。库会先写入一个新的内部缓冲区,然后才覆盖磁盘上的文件,因此就地保存不会损坏源文件。