使用 OpenXML 和 C# 编辑 Word 文档,无需自动化/互操作






4.72/5 (18投票s)
本技巧解释了如何使用 OpenXML 和 C# 进行 Word 自动化,而无需 Word 互操作。
引言
您是否正在寻找一种方法来进行 Word 自动化?想以编程方式处理 Word 文档?阅读本技巧,它将帮助您使用 C# 和 OpenXML 进行 Word 自动化,而无需互操作。
阅读本技巧后,您将能够说出
- 什么是 Open XML
- 为什么要使用 Open XML
- 如何使用 OpenXML 和 C# 以及 OpenXML API 创建 Word 文档
- 使用 OpenXML 和 C# 创建 Word 表格
背景
我见过许多开发人员在以编程方式处理 Word 文档时遇到困难,处理 Word 文档有几种方法
- 使用 COM 互操作对象(Winword 实例)(有关互操作示例代码,请参阅本文)
- 使用 OpenXML API(无需在计算机上安装 Word)
Using the Code
所需物品
在开始 OpenXML 操作之前,我们需要准备好以下物品
- C# Visual Studio(2005 及更高版本)
- OpenXML API(可在此处下载适用于 Microsoft Office 的 Open XML SDK 2.5)
仅此而已。(哇!!!无需安装 Word)
开始使用 OpenXML
如今,DOCX 文件越来越受欢迎,因为它们非常轻巧且处理速度快,DOCX 是 ZIP 和 XML 组合的神奇结果。因此,很明显,如果我们能够管理 XML,我们也能够管理 DOCX。要管理 WordXML,我们需要一些 API,而该 API 就是适用于 Microsoft Office 的 Open XML SDK,MSDN 说“API 简化了在包中操作 Open XML 包和底层 Open XML 架构元素任务。Open XML SDK 封装了开发人员在 Open XML 包上执行的许多常见任务,因此您只需几行代码即可执行复杂的操作。”
Open XML 相对于互操作的优势
- Open XML 是用于文字处理文档、演示文稿和电子表格的开放标准,可以由不同平台上的多个应用程序自由实现。
- Open XML 标准的目的是解耦由 Microsoft Office 应用程序创建的文档,以便它们可以被其他应用程序独立于专有格式进行操作,而不会丢失数据。
- 由于其轻量级,处理速度比互操作对象快。
- 它具有良好的互操作性、向后兼容性和可编程性。
- 由于文件大小较小,因此可以轻松管理各种文档存储,包括 Exchange 服务器、SharePoint,当然还有网络文件存储。
- 它是 IS29500 标准,供所有人免费使用,并且有极其完善的文档。
您可以解压缩 DOCX 文件。
您知道您可以解压缩 DOCX 文件吗?DOCX 是几个结构良好的.XML文件的组合,Open XML 文件以 ZIP 存档形式存储用于打包和压缩。您可以使用 ZIP 查看器查看任何 Open XML 文件的结构,Open XML 文档由多个文档部件构成。部件之间的关系本身存储在文档部件中,每个典型的 DOCX 文件都有以下不同的部件。
请参见下图,了解不同的 XML 部件。
正文是文档的主要部分,它包含如图所示的许多不同部分。
处理段落(第一个作业)
段落是WordprocessingML
文档中块级内容最基本单位,段落使用<p>
元素存储,段落具有不同的子元素,如ParagraphProperties
(可选)、Run
和Text
。
段落属性
段落属性用于文本格式设置,一些段落属性的示例包括对齐、边框、连字符覆盖、缩进、行距、底纹、文本方向。OXML SDK 段落属性类代表<
pPr>
元素。
Run
run
元素用于分隔文本区域。OXML SDK Run
类代表<r>
元素。
文本
此元素包含文档的实际Text
。与<r>
元素一起,文本(<t>
)元素是构成文档内容的文本的容器。
开始编写代码(创建新 word 文档并写入内容)
打开 Visual Studio,开始第一个 OpenXML 作业。
创建新项目/应用程序并添加 DLL 引用(DLL 应存在于已安装的 OpenXML API 文件夹中,例如,C:\Program Files\Open XML SDK\V2.0\lib)。
1. DocumentFormat.OpenXml
请参见下面的代码片段,我们使用 OpenXML 来创建新的 Word 文档。
using (WordprocessingDocument doc = WordprocessingDocument.Create
("D:\\test11.docx", DocumentFormat.OpenXml.WordprocessingDocumentType.Document))
{
// Add a main document part.
MainDocumentPart mainPart = doc.AddMainDocumentPart();
// Create the document structure and add some text.
mainPart.Document = new Document();
Body body = mainPart.Document.AppendChild(new Body());
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
// String msg contains the text, "Hello, Word!"
run.AppendChild(new Text("New text in document"));
}
在上面的简单代码片段中
- 我们使用了
'WordProcessingDocument'
类来创建新文档。 - 向文档添加
MainDocumentPart
。 - 然后将
Body
添加到主文档部分。 - 然后将
Paragraph
添加到Body
元素。 - 然后将
Run
添加到Paragraph
元素。 - 然后将
Text
添加到Run
元素。
就是这样。无需再保存文档了。
现在,如果您查看“test11.docx”,您会发现它包含文本“New text in document”。
现在尝试解压缩该 Docx 文件,您将获得以下文件夹结构,您会看到 _rels、docsProps、word 文件夹以及 [Content_Types].xml 文件。
打开 Word 文件夹并检查 document.xml。您将看到以下快照。
在上图中,您可以看到<w:body>
代表文档的MainBody
,<w:p>
是段落元素,<w:r>
是run
元素,<w:t>
是text
元素。
这就是 OpenXML 的工作原理。
关注点
OpenXML 确实是一项了不起的技术,它能够流畅地处理电子表格、图表、演示文稿和文字处理文档。Open XML 文件格式对开发人员很有用,因为它们采用了开放标准,并且基于众所周知的技术:ZIP 和 XML。
参考文献和事实书
以下是 OpenXML 的参考链接:
- https://msdn.microsoft.com/EN-US/library/office/bb456488.aspx
- https://msdn.microsoft.com/EN-US/library/office/bb456487.aspx
- http://blogs.msdn.com/b/ericwhite/archive/2008/10/20/eric-white-s-blog-s-table-of-contents.aspx
谢谢
OpenXML 并非一蹴而就,我将在本文章的下一版本中继续介绍另一个关于 OpenXML 的作业。在那之前,请享受这些内容。随时欢迎您的建议和疑问。