保存和导出文档
保存和导出文档
Document.Save 将文档写入文件或流,使用目标格式。该格式可以从文件扩展名推断、显式提供为 SaveFormat 值,或由 SaveOptions 子类 — OoxmlSaveOptions、MarkdownSaveOptions 或 TxtSaveOptions — 控制以实现特定格式的设置。本指南涵盖 Save 重载、SaveFormat 枚举、OOXML 保存选项、Markdown 和纯文本导出,以及在转换前检测格式。
使用 Document.Save 保存
最简单的调用是 Document.Save(fileName),它会根据文件扩展名推断目标格式。Save(fileName, saveFormat) 则无论扩展名如何都显式指定格式,Save(fileName, saveOptions)(或相匹配的 Stream 重载)接受一个 SaveOptions 子类以进行特定格式设置。SaveOptions.CreateSaveOptions(saveFormat) 是一个静态工厂,返回针对给定 SaveFormat 的正确选项子类,并已设置默认值。
使用 SaveFormat 选择格式
SaveFormat 枚举列出了库能够识别的所有保存格式标识符。Document.Save 完全支持本版本的核心文档格式——DOCX、DOCM、DOTX、DOTM 和 Flat OPC(以及其宏启用和模板变体)——以及 Markdown 和纯文本的读写。FileFormatUtil.SaveFormatToExtension(saveFormat) 和 ExtensionToSaveFormat(extension) 在枚举和文件扩展名字符串之间进行转换。
在枚举中存在一些 SaveFormat 值,以确保 API 的完整性,但这些对应的格式在此精简的开源版中未实现可用的读取器或写入器——尝试保存为这些格式会生成与源文档不等价的输出。请坚持使用上述列出的格式,以确保可靠的往返转换。
OOXML 选项:DOCX、DOCM、DOTX、DOTM 和 Flat OPC
OoxmlSaveOptions 配置将文件保存为任意 Open XML 格式。其 SaveFormat 属性选择要写入的具体变体;Password 为已保存的文件设置打开密码(独立于 Document.Protect 的编辑限制);Compliance 选择 OOXML 的严格程度;而 CompressionLevel / Zip64Mode 控制底层的 ZIP 打包。可使用 new OoxmlSaveOptions(saveFormat) 或通过 SaveOptions.CreateSaveOptions(saveFormat) 构建一个。
导出为 Markdown
MarkdownSaveOptions 控制 Markdown 导出:ListExportMode 和 LinkExportMode 决定列表和超链接的渲染方式,ImagesFolder / ImagesFolderAlias 控制提取的图像写入位置以及引用方式,ExportImagesAsBase64 则将它们内联嵌入,TableContentAlignment 影响生成的表格标记。将一个 MarkdownSaveOptions 实例传递给 Document.Save(fileName, saveOptions),并提供一个 .md 文件名,或显式设置其 SaveFormat。
导出为纯文本
TxtSaveOptions(通过其基类 TxtSaveOptionsBase,该基类与 MarkdownSaveOptions 共享)控制纯文本导出:Encoding 设置字符编码,ParagraphBreak 设置行结束字符串,MaxCharactersPerLine 换行长行,SimplifyListLabels 将列表项目符号/编号正规化为普通字符,PreserveTableLayout 则尝试使用空格保持表格列对齐。
在转换前检测格式
在转换尚未知晓格式的文件之前,FileFormatUtil.DetectFileFormat(fileName) 会返回一个包含检测到的 LoadFormat 的 FileFormatInfo。将其与 FileFormatUtil.LoadFormatToSaveFormat(loadFormat) 结合使用,可在尝试 Document.Save 之前决定是否可以通过此版本支持的格式进行往返转换。
技巧与最佳实践
- 在需要控制特定格式行为(如 Markdown 列表渲染或 OOXML 压缩)时,请使用
Save(fileName, saveOptions)而不是普通的Save(fileName, saveFormat)重载。 - 为开放密码保护的文件设置
OoxmlSaveOptions.Password;这与Document.Protect不同,后者仅限制编辑但不对文件进行加密。 - 若需要单个自包含的 Markdown 文件,请选择
MarkdownSaveOptions.ExportImagesAsBase64;如果希望在 Markdown 旁边拥有一个包含提取图像文件的文件夹,则选择ImagesFolder。 - 当运行时确定目标格式时,请调用
SaveOptions.CreateSaveOptions(saveFormat),而不是手动选择具体的选项类。 - 在转换之前,用
FileFormatUtil验证目标格式,而不要仅依赖裸文件扩展名,因为扩展名可能错误或具有误导性。
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
Save(fileName) 选择了错误的格式 | 文件扩展名与预期格式不匹配 | 使用 Save(fileName, saveFormat) 或 Save(fileName, saveOptions) 来明确格式 |
| 已保存的 OOXML 文件在使用密码时无法打开 | OoxmlSaveOptions.Password 在保存前未设置 | 构造一个 OoxmlSaveOptions,设置 Password,并将其传递给 Save |
| Markdown 导出意外地将图像文件散布到各处 | 默认的 MarkdownSaveOptions 行为会将图像提取为文件 | 将 ExportImagesAsBase64 = true 设置为单个自包含文件,或设置 ImagesFolder 以控制图像的存放位置 |
| 纯文本导出会丢失表格列对齐 | TxtSaveOptions.PreserveTableLayout 保持默认 | 在保存之前设置 PreserveTableLayout = true |
FAQ
如何在不考虑文件扩展名的情况下将文档保存为特定格式?
使用显式的 SaveFormat 值调用 Save(fileName, saveFormat),或使用匹配的 SaveOptions 子类调用 Save(fileName, saveOptions)。
此版本能够双向读取和写入哪些格式?
DOCX、DOCM、DOTX、DOTM、Flat OPC(以及其宏启用和模板变体)、Markdown 和纯文本。
如何对已保存的文件进行密码保护?
在 OoxmlSaveOptions 实例上设置 Password,并将其传递给 Document.Save(fileName, saveOptions)。
如何控制导出文本文件的换行符?
在保存之前,在 TxtSaveOptions 实例上设置 ParagraphBreak。
在转换文件之前,我如何检查文件的格式?
调用 FileFormatUtil.DetectFileFormat(fileName) 并读取返回的 FileFormatInfo.LoadFormat。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
Document.Save | 将文档写入文件、流或输出目标,使用所选格式。 |
SaveFormat | 枚举标识保存操作的目标格式。 |
SaveOptions | 用于特定格式保存配置的抽象基类;CreateSaveOptions(saveFormat) 返回匹配的子类。 |
OoxmlSaveOptions | DOCX、DOCM、DOTX、DOTM 和 Flat OPC 的选项——密码、合规性、压缩。 |
MarkdownSaveOptions | Markdown 导出选项 — 列表/链接 渲染,图像处理。 |
TxtSaveOptions / TxtSaveOptionsBase | 纯文本导出选项 — 编码、换行、表格布局。 |
FileFormatUtil.DetectFileFormat | 在加载或转换之前检测文件的格式。 |
FileFormatUtil.SaveFormatToExtension / ExtensionToSaveFormat | 在 SaveFormat 值和文件扩展名之间进行转换。 |