如何操作 Office Open XML 格式文档(转)_vb6 office openxml-程序员宅基地

技术标签: 文档  操作  xml  如何  office  open  格式  

原文地址为: 如何操作 Office Open XML 格式文档(转)

摘要: Office Open XML格式文件代替了早期的二进制Office系统文件。本文档向您介绍了包含在一个格式化文档中的组件以及展示这些文件功能的一些场景 。

Frank Rice,微软公司

适用于: Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007

下载2007OfficeManipulatingOpenXMLFilesSample.exe.

*
本页内容
概述 概述
创建一个Office Open XML格式文件 创建一个Office Open XML格式文件
浏览Office Open XML格式文件 浏览Office Open XML格式文件
手动编辑由Office Open XML格式创建的文档 手动编辑由Office Open XML格式创建的文档
通过编程来<a href='http://www.javaxxz.com/thread-286706-1-1.html'>操作</a>Office Open XML格式文档 通过编程来操作Office Open XML格式文档
结论 结论
额外资源 额外资源

概述

在Microsoft Office的早期版本中,由Microsoft Office Excel, Microsoft Office PowerPoint和Microsoft Office Word创建的文件以独有的,单一文件格式进行保存,它们称之为二进制文件。Microsoft Office System 2007的发布为Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007和Microsoft Office Word 2007引入了一个新的文件格式:Office Open XML格式。

Office Open XML格式是基于XML和ZIP归档技术创建的。和早期Microsoft Office版本类似,2007的文档保存在一个单一的文件或者容器中,所以管理这些文档的过程仍然是简单的。但是,与早期文件不同的是Office Open XML格式的文件能够被打开显示器中的组件,使得您能够访问此文件的结构。

在本文中,您可以手动的打开文件并且浏览组成此文档那个的每一个部件来查看Office Open XML格式文件。另外您也可以对此文档进行编程。在本文中适用到的文件可以通过下载获得, 2007OfficeManipulatingOpenXMLFilesSample.exe.如果您不能够下载,您可以使用自己的程序文件和图像文件进行替代。

创建一个Office Open XML格式文件

此部分中,您将检测一个包含文本,图像和属性的示例Word 2007文档的XML文件格式。

Word中创建一个Office Open XML 格式文档

1.

启动 Word 2007。

2.

在新建文档中,粘贴以下文本:

Soaring with the American Bald Eagle

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla rutrum. Phasellus feugiat bibendum urna. Aliquam lacinia diam ac felis. In vulputate semper orci. Quisque blandit. Mauris et nibh. Aenean nulla. Mauris placerat tempor libero.

Pellentesque bibendum. In consequat, sem molestie iaculis venenatis, orci nunc imperdiet justo, id ultricies ligula elit sit amet ante. Sed quis sem. Ut accumsan nulla vel nisi. Ut nulla enim, ullamcorper vel, semper vitae, vulputate vel, mi. Duis id magna a magna commodo interdum.

3.

高亮显示Soaring with the American Bald Eagle,然后在 开始标签,在样式组中,设置样式为标题。

4.

下一步,在文档中插入一张图片:

1.

将鼠标指针放置在第一段落的末尾,并且点击回车插入新行。

2.

然后,点击插入标签,点击图片,找到一个图片文件 (例如包含在下载中的Eagle1.gif文件),然后点击插入。

5.

现在添加一个文档属性:

1.

点击Microsoft Office按钮,指向准备,然后点击属性 。

2.

在文档属性面板中,添加作者名称,标题,主题和备注,类似于以下:

1.文档属性设置

属性 描述

作者

Nancy Davolio

标题

Soaring with the American Bald Eagle

主题

Bald Eagles

备注

A study of the bald eagle

6.

下一步,在文档中添加一些批注

1.

在审阅标签下,点击新建批注。

2.

在批注框中,输入This is my comment。此时您的文档类似于图1。

.

1. 示例Office Word 2007 文档

7.

下一步,保存文档:

1.

点击Microsoft Office 按钮,然后点击另存为。

2.

在另存为文件类型列表中,选择 Word Document (*.docx),然后在文件名称框中输入SampleWordDocument.docx。

3.

点击保存。

8.

关闭Word。

浏览Office Open XML格式文件

在此部分中,您将浏览您刚刚创建的示例文档。

浏览Office Open XML 格式文档

1.

打开Windows资源管理器。

2.

找到 SampleWordDocument.docx文件,右键点击此文件,然后选择重命名。

重要:

使用下面的三个步骤来抽取Office Open XML格式文件。根据您使用的操作系统不同(Windows XP或Windows Vista),第5步有所不同。

3.

在文件名称后面添加一个.zip扩展名,文件名称现在变为 SampleWordDocument.docx.zip。

4.

当弹出警告信息时,点击确定。

5.

抽取容器文件:

1.

(如果您使用Windows XP:) 右键点击SampleWordDocument.docx.zip文件,指向打开方式,然后点击Compressed (zipped) Folders。此时组成文档的文件夹和部件将会显示在资源管理器中。

2.

(如 果您使用Windows Vista:) 右键点击SampleWordDocument.docx.zip 文件,然后点击Extract All。 在Extract Compressed (Zipped) Folders 对话框中,接受默认位置或者选择一个新的位置,然后点击Extract。此时组成文档的文件夹和部件将会显示在资源管理器中。

在下面的步骤中,您将检测包含在文档中的关键部件。

6.

检测 [Content_Types].xml部件:

1.

使用Windows资源管理器,找到名为[Content_Types].xml的文件。

2.

右 键点击此文件,指向打开方式,然后点击Internet Explorer。每一个Office Open XML格式文档的根下都有一个 [Content_Types].xml 组件。 [Content_Types].xml组件的作用就是确定文档中每个唯一类型组件。每个组件需要在这个组件中列出它自己的类型。组件需要有可以识别的类 型,以便应用程序知道当渲染此文档时如何使用这个组件。类型也能够使您了解到组件的作用以及如何使用。

3.

关闭文件。

7.

检测.rels 文件夹:

关 联代表着两个组件之间的连接。关联是存储在_rels子文件夹中的组件。任何组件都有相关联的组件,包含在同结构的_rels文件夹中,此文件夹包含了一 个定义它们关系的.rels组件。子文件夹创建在与组件相同的文件夹下。一个关联的名称通过在原始组件的文件名后加上.rels扩展名获得 (用于文档文件的关联组件是一个例外;它的名称为“.rels”)。

1.

在Windows资源管理器中,双击_rels 文件夹,然后右键点击.rels 文件。

2.

指向打开方式,点击选择程序,点击Internet Explorer,然后点击确定。

3.

完成检测后,关闭IE。

8.

检测docProps 文件夹:

2007版本中的文档属性在三个Microsoft Office System程序中是始终保持结构化的。分成三个逻辑XML组件,它们被存储自docProps子文件夹下。这使得用户可以很容易的进行访问,因为他们它们在相同的位置并且不会和其它的文档内容混淆。

在Windows资源管理器中,双击docProps 文件夹,右键点击core.xml 文件,指向打开方式,然后点击Internet Explorer。

9.

检测core.xml 组件:

打开 core.xml 组件,然后观察显示的您之前输入的属性。 core.xml组件持有用户输入的用来标识文档的属性,例如标题,主题和作者。

10.

检测custom.xml 组件:

从Windows资源管理器中,在Internet Explorer中打开custom.xml。

custom.xml 组件包含了被用户,开发人员或者通过自定义逻辑添加到文档任何自定义文档属性。

11.

检测app.xml 组件:

从Windows 资源管理器中,在Internet Explorer中打开 app.xml。

app.xml 组件包括在应用程序级别指定到文档的唯一属性,例如文章的页数,文本行的数量,应用程序的版本等等。

12.

检测word文件夹:

大部分的内容组件都驻留在word子文件夹下面。另外,在里面也有一个_rels关联子文件夹。

双击 _rels 文件夹。

在_rels 子文件夹中,用于连接所有文档组件的关联名称为document.xml.rels。

13.

检测document.xml.rels 组件:

在Internet Explorer中打开document.xml.rels 。

关联使用IDs和Uniform Resource Identifiers (URIs)来定位组件。它允许在没有任何硬编码引用的前提下所有非关联的组件是无效的。在后面的章节中将会详细讨论。

在Word文件夹下面,注意styles.xml 组件。

14.

检测styles.xml组件:

在Internet Explorer中 styles.xml。

这个包含了一些可用的重音和底纹,您可以在文档中使用它们。

15.

必须的和可选的组件

16.

在Office Open XML格式文件中这些组件的使用使得文档能够以高度模块化的方式存储。一些组件对文档来说是必须有效的,例如document.xml组件和fontTable.xml组件。

17.

检测document.xml 组件:

1.

在Internet Eexplorer中打开document.xml 。 document.xml 组件包含了文档主体的文本。

2.

查看完此文件后,关闭Internet Explorer。

18.

检测fontTable.xml 组件:

1.

在Internet Explorer中打开fontTable.xml组件。

fontTable.xml组件包含了文档的字体设置。

2.

查看完此文件后,关闭Internet Explorer。

如果组件描述的功能在文档中使用不到的话,这些组件就不是必需的。示例中包括了备注,页眉组件和页脚组件,这些组件对Word文档来说是可选的。这就使得用户能够轻松的通过文档结构进行操纵,而不需要研究没有使用的内容。

XML 设计用于结构化的内容,并不会本地支持二进制的内容,例如图像或者OLE对象。二进制数据能够被编码到字符并且以XML形式进行存储,但是它需要一个编码 和解码的过程,这就使得对于应用程序或者开发人员来说效率低下。在2007发布之后,此时就不在需要编码二进制对象因为他们能够作为二进制组件以他们自身 的格式进行存储。因此在Office文档中访问二进制对象变得非常容易。媒体文件存储在media文件夹中。

19.

检测word"media和word"embeddings文件夹:

在Windows资源管理器中,双击media子文件夹。

注意.gif媒体文件表示您之前插入的图像。

备注:

您 可能注意到图像的文件名称已经从Eagle1.gif更改为image1.gif了。更改的目的是为了解决隐私考虑,因为一个恶意用户可以从文档中的组件 名称中获得关于此组件的一些内容,例如一个图像文件。例如,一个作者可能通过加密文档中的文本部件来保护文档内容。但是,如果两个图像 old_widget.gif and new_reenforced_widget.gif 被插入。即使文本被保护起来了,恶意用户也能够知道widget已经被更新了。使用像image1和image2这样的通用图像文件可以在Office Open XML格式文件中添加额外的保护。

20.

关闭SampleWordDocument.docx.zip ,不保存。

手动编辑由Office Open XML格式创建的文档

Office Open XML格式拥有很多的优势。其中一个优势就是具有可以在没有Office程序的情况下使用由Office 2007系统创建的文档的能力。这就使得您能够创建基于服务器的解决方案,用于在可伸缩的环境下集合,访问和编辑文档。

在下面的步骤中,您将手动的编辑一个Word 2007文档。请注意这些场景只是这个新的文件格式的一个很小的示例。在大部分的场景中,用户不会以这种方式手动编辑文档。但是对于开发人员,在不需要编 写代码的情况下浏览由Office 2007创建的文档将带来很大的好处,尤其是当设计解决方案或者编写程序模型的时候。如您之前看到的,在访问此文档的容器文件后,您能够轻松的浏览独立的 组件。这也就意味这您能够编辑,替换甚至添加组件。通常情况下,您可以修改文档的备注,更新文档属性。

利用XML修改Office Open XML格式文档

1.

在Word 2007中,打开SampleWordDocument.docx 文档。

备注:

在打开文件之前,请先删除文件的.zip扩展名

2.

点击Microsoft Office按钮,指向准备,然后点击属性。注意作者,标题,主题和备注框体,然后关闭文档。

3.

打开Windows资源管理器,浏览到SampleWordDocument.docx 文档。

4.

使用 steps described for your operating system抽取文档文件。

Word 2007文档中的备注存储在名称为comments.xml的组件中。这种文档主体的分离使您能够轻松的定位和修改组件。

5.

将comments.xml 组件从压缩文档中拖拽到Windows桌面。

6.

右键点击comments.xml 组件,指向打开方式,然后选择文本编辑器或者XML编辑器打开,例如记事本。

7.

定位到下面的文本:

<w:t>A study of the bald eagle</w:t>

8.

替换或者编辑<w:t>元素的文本,例如,将其更改为:

<w:t>A detailed study of the bald eagle</w:t>

9.

保存并且关闭文件。

10.

从Windows桌面中,将comments.xml 组件拖拽到压缩文件的word 文件夹中。

11.

当弹出确认文件替换警告消息时,点击确定。

下一步,您可以更改文档属性,然后确认更改的结果。文档属性存储在压缩文件根目录下面的子文件夹中,使得他们能够轻松的访问和编辑。

12.

双击docProps 文件夹。

13.

将core.xml 组件从压缩文档中拖拽到Windows桌面。

14.

在文本编辑器中打开core.xml。

15.

定位到下列文本:

<dc:creator>Nancy Davolio</dc:creator>

16.

替换或者编辑<dc:Creator> 元素的文本。例如,使用您自己的名字替换里面的文本。

17.

保存并且关闭文件,然后将其拖拽回docProps 文件夹。

18.

当弹出确认文件替换警告消息时,点击确定。

19.

通过点击回退箭头或者工具栏中的up图标导航到文档容器直到您定位到.zip文件。

20.

从文件名称中移出.zip 扩展名,然后在Word 2007中打开文件。

21.

点击 Microsoft Office 按钮,指向准备,然后点击属性。

注意备注文本已经更改了。同时作者属性也已经更改。

在以前的步骤中,您通过在文档中编辑XML组件的方式修改了文档。利用新的文件格式,您也可以替换整个文档组件来更改内容,格式或者属性。这就使得您使用存在的文档组件来更新单个的文档或者更新整个文档库。

使用存在的组件来修改文档的一个例子就是更改文档使用的样式。如果您需要管理多个文档的样式,但是希望保留一个物理的版本,这种方式将很有用。更改文档使用的所有类型就是替换styles.xml组件。

此场景使您能够为所有的文档编译样式组件集合,然后创建一个应用程序,使得用户能够自动的选择不同的样式。在后台,您的应用程序能够用一个预制的组件代替另外一个。在下面的步骤中,您将手动的执行此操作。

通过替换已存在组件的方式修改一个Office Open XML格式文档

1.

复制一份SampleWordDocument.docx 文档,然后将其命名为 AnotherSampleWordDocument.docx。

2.

在Word 2007中打开 AnotherSampleWordDocument.docx。

3.

在开始页面,点击更改样式,指向样式集,然后点击独特。此文档看上去类似于图2。

.

2. 在独特样式中的文档

4.

保存并且关闭文档。

5.

使用 steps described for your operating system.来提取出AnotherSampleWordDocument.docx文档文件。

6.

双击word 文件夹,然后将styles.xml 组件拖拽到Windows桌面。此组件将被用于更新您创建的第一个文档。

7.

点击工具栏中的回退箭头或者Up图标导航到文档容器,直到定位到.zip文件。

8.

现在,在Word 2007中打开SampleWordDocument.docx 文档,注意文档主体的样式。

9.

关闭文档。

10.

使用 steps described for your operating system提取SampleWordDocument.docx 文档文件。

11.

双击打开word 文件夹,然后将styles.xml 从Windows桌面拖拽到word 文件夹,替换原来的文件。

12.

当弹出确认文件复制警告消息时,点击确定。

13.

通过点击工具栏中的回退箭头或者Up图标导航到SampleWordDocument.docx 文件的文档容器,直到定位到.zip文件。

14.

从文件名中移出.zip 扩展名,然后在Word 2007中打开文件。

注意文档样式已经更改为在AnotherSampleWordDocument.docx中看到的那样。

请首先将AnotherSampleWordDocument.docx.zip文件名的.zip扩展名移出。

此样式场景的另外一个样子就是使用页眉页脚文档组件从一个Word 2007文档中快速的复制相同的设置到一个或者多个Word 2007文档中。页眉页脚组件能够被手动的更改,您将在后面的内容中了解到。当然,这个过程也能够使用代码进行自动化。这对于那些希望使用标准文档页眉和 页脚,并且不需要在每个基本文档中付出管理任务的组织来说非常有用。另外,如果您的页眉页脚格式更改后,替换页眉页脚是非常容易的。

在下面的步骤中,您将添加一个简单的页眉到SampleWordDocument.docx中。然后使用来自AnotherSampleWordDocument.docx文档的不同的页眉来更新它。

更新Office Open XML 格式文档的页眉

1.

在Word 2007中打开 SampleWordDocument.docx。

2.

在插入标签中,点击页眉按钮的下拉键头,然后选择字母表型页眉。页眉将被添加到文档的标题中。此文档看上去类似于图3。

.

3. 使用字母表型页眉的示例文档

3.

保存并且关闭文件。

4.

在Word 2007中打开AnotherSampleWordDocument.docx。

5.

在插入标签中,点击页眉按钮的下拉键头,选择年刊型页眉。页眉将被添加到文档的标题中,并且带有年份。此文档那个看上去类似于图4。

.

4. 带有年刊型页眉的示例文档

6.

保存并且关闭文件。

7.

使用steps described for your operating system.为AnotherSampleWordDocument.docx提取文档文件。

8.

双击word 文件夹,然后将header1.xml 文件拖拽到Windows桌面。

9.

通过点击工具栏中的回退箭头或者Up图标导航到文档容器,直到定位到.zip文件。

10.

从AnotherSampleWordDocument.docx.zip 文件名中移出.zip文件扩展名。

11.

使用 steps described for your operating system为SampleWordDocument.docx提取文档文件。

12.

双击word 文件夹打开它,将header1.xml 文件从Windows桌面拖拽到word 文件夹。

13.

当弹出确认文件替换警告消息时,点击确定。

14.

通过点击工具栏中的回退箭头或者Up图标导航到文档容器,直到定位到.zip文件

15.

Remove the .zip extension from the从 SampleWordDocument.docx.zip 文件名中移出.zip扩展名,然后在Word 2007中打开这个文件。

注意新的页眉。

文档中也能够包含二进制组件-例如图像文件或者Microsoft VBA项目,您可以将其作为XML组件那样轻松的访问。更换二进制组件会带来一些有趣的事情。例如您可以更换二进制组件来替换整个的OLE对象,如 Microsoft Office Visio图像。手动的操作没有价值,您需要考虑一个使得图像能够自动从服务器更新的场景。编写一个工具来完成这样的操作相对来说是简单的人物。在下面的 步骤中,您将使用一个图像来交换AnotherSampleWordDocument.docx 文档中的图像二进制文件。

Office Open XML格式文档中交换二进制组件

1.

使用 steps described for your operating system.为SampleWordDocument.docx提取文档文件。

2.

双击Word文件夹,然后双击media文件夹来定位到Eagle1.gif图像。

3.

右键点击Eagle1.gif 然后点击预览。这是出现在文档中的图像。

4.

在下载文件中定位到Eagle2.gif 图像,然后将其复制到Windows桌面。(或者您可以替换您自己的图像文件)

5.

在Windows桌面上,右键点击Eagle2.gif 图像,然后点击预览。这是您将使用替换当前图像的图像文件。

6.

关闭预览窗口,右键点击Eagle2.gif,然后点击重命名,将其名称更改为Eagle1.gif。

7.

将重新命名过的Eagle1.gif从Windwos桌面上拖拽到media文件夹中。

8.

当弹出确认文件替换警告消息时,点击确定。

9.

通过点击工具栏中的回退箭头或者Up按钮导航到文档容器,直到定位到.zip文件。

10.

将名称中的.zip扩展名移出掉,然后在Word 2007中打开文件。注意图像已经被更新了。

一些组件在Microsoft Office系统文档中是必须的,例如Word 2007中document.xml组件。但是,一些组件是可选的,只在需要某些功能的时候存在。这就意味着如果您不需要某些功能,您可以移出这些组件和 相关的关系。包含项目代码的2007 Office文档被称为“macro-enabled”文档(用于Word 2007的.docm 扩展名,用于Excel 2007的.xlsm扩展名和用于PowerPoint 2007的.pptm扩展名)。不像"macro-free"文档,macro-enabled 文档在组件中存储代码。组件的类型依赖于文档中代码的类型。例如,包含VBA代码的macro-enabled文档在vbaProject.bin 二进制组件中存储它的数据。

其他的项目类型包含使用Excel 4.0-style macro(XLM macros)的Excel 2007工作簿中或含有命令按钮的PowerPoint 2007幻灯。这些特性位于他们独立的组件中,以便他们能够被轻松的确认和移出。

在下面的步骤中,您将创建一个简单的macro-enabled 文档并且展示它的功能。然后,您将从文档中删除vbaProject.bin组件及其关系并且查看其效果。注意您也可以通过点击文件菜单中的另存为,或者 通过保存文件为macro-free文件(.docx, .pptx, or .xlsx)来移出macro-enabled文件中的项目组件。但是,这需要您在2007 Office系统程序中打开此文档。使用下面过程中的步骤可以使您在不使用Office程序的前提下移出项目。

Office Open XML格式文档中移出VBA项目

1.

使用Word 2007打开SampleWordDocument.docx。

2.

在开发工具标签中的代码组中,点击Visual Basic 来打开Visual Basic 编辑器。您也可以按ALT+F11来打开Visual Basic 编辑器。

备注:

如果您无法找到开发工具标签,您需要添加它。点击Microsoft Office 按钮,然后点击Word选项,然后在常用标签中,选择“在功能区显示开发工具选项卡”。

3.

在Visual Basic 编辑器代码窗口中,输入或者粘贴以下语句:

Sub SampleCode()
Msgbox("Hello World")
End Sub

备注:

如果您无法看到代码窗口,通过点击视图菜单,然后选择代码窗口。

4.

在运行菜单中,点击运行子过程/用户窗体来运行代码。您也可以点击F5。

5.

点击确定关闭消息窗口,然后关闭Visual Basic 编辑器。下一步,作为macro-enabled文档保存。

6.

点击Microsoft Office 按钮,指向另存为,然后点击Word 文档。

7.

在保存类型下拉列表中,选择Word Macro-Enabled Document (.docm),然后点击保存,关闭文档。

8.

使用steps described for your operating system.为SampleWordDocument.docm提取文档文件。

9.

双击word 文件夹,然后双击_rels文件夹。

10.

键点击document.xml.rels,点击打开方式,然后选择一个文本编辑器,例如Notepad。

备注:

这个文件可能是只读的。如果是只读的话,关闭文件,右键点击文件名称,点击属性。然后清除只读属性复选框。然后重新打开文件。

11.

定位并且删除掉以下XML标记:

<Relationship Id="rId1" Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" Target="vbaProject.bin"/>

12.

保存并关闭文件。

13.

右键点击document.xml.rels 然后选择复制。

14.

回到SampleWordDocument.docm.zip 文件,然后打开它。

15.

双击word 文件夹。

16.

右键点击vbaProject.bin 项目,然后点击删除。当提示消息时,点击确定来删除。

17.

双击_rels 文件夹。

18.

右键点击,然后选择粘贴。

19.

当提示确认文件替换消息时(在Windows Vista中为复制和替换警告消息),点击确定。

20.

通过点击工具栏中的回退箭头或者Up按钮导航到文档容器中,直到定位到.zip文件。

21.

右键点击SampleWordDocument.docm 文件夹,然后点击删除来删除它。当提示时,点击确定。

22.

从 SampleWordDocument.docm.zip 文件名中移出.zip扩展名。当提示时,在重命名警告框中点击确定,然后重新使用Word 2007打开此文件。

23.

按ALT+F11 查看VBA 项目。注意子程序已经丢失。

备注:

您可以将文件扩展名从.docm更改成.docx来获得相似的结果。带有macro-free 扩展名的文件从来不会执行代码。

通过编程来操作Office Open XML格式文档

Office Open XML格式的一个重要意义在于它对于自定义解决方案的无限潜能。您可以使用任何平台的能够处理XML或者ZIP文件的工具来访问并且修改文档内容。例如, 您可以在Microsoft Visual Studio中利用托管代码编写一个服务器端的应用程序来省城2007 Office系统文档。您可以使用Microsoft .NET Framework的强大XML类库来编辑Office Open XML格式文件中包含的任何XML文档组件。

操作文档组件及其关系的一个强大方式就是使用System.IO.Packaging名称空间,它包含在Microsoft Windows Software Development Kit中。System.IO.Packaging名称空间将在后面的内容中详细讨论。

备注:

您可以从微软的下载中心中下载Microsoft Pre-Release Software WinFX Runtime Components—Beta2。

在下面的步骤中,您将开发一个控制台应用程序在不使用Word 2007的前提下更改格式样式。这个项目通过利用从一个Word 2007文档中提取出来的样式组件来替换此文档中的样式组件来完成。结果就是目标文档采用了与提取样式那个文档相同的样式。

备注:

在此有很多这样的代码示例,您可以通过下载获得。在下载了这些预制的代码示例后,您将能够在Microsoft Visual Studio 2005(在工具菜单中)中使用这些Code Snippet Manager 特性来将它们插入到你的项目中。您可以下载2007 Office System Sample: Open XML File Format Code Snippets for Visual Studio 2005.

执行下面的步骤来更改一个文档的格式。

在一个Office Open XML格式文档中更改样式

1.

首先,创建一个文件夹和子文件夹来宿主您将更新的文档和styles.xml 组件。在这个练习中,命名文件夹为WordOpenXMLFormatSample。在文件夹中,添加一个名称为NewStylePart的子文件夹。

2.

复制SampleWordDocument.docx 到WordOpenXMLFormatSample 文件夹中。

3.

导航到AnotherSampleWordDocument.docx 文件,在文件名后添加.zip文件扩展名,然后打开文件。

4.

在word文件夹中导航到styles.xml 组件,右键点击它,然后点击复制。

5.

导 航到 WordOpenXMLFormatSample 文件夹,然后导航到NewStylePart 子文件夹。右键点击NewStylePart 子文件夹,然后点击粘贴。文件夹现在包含了默认样式组件的Word 2007文档,子文件夹中包含了来自带有名称为“Fancy”样式的文档中的styles.xml组件。

6.

启动Visual Studio 2005.

7.

在文件菜单中,点击新建项目。

8.

在新建项目对话框中,从左边的项目类型树视图中,点击其它语言,选择Visual C#,然后从模板列表视图中选择控制台应用程序。

9.

在名称对话框中,将项目命名为StyleSwapper,然后点击确定。Visual Studio在项目中创建了所有的文件,并且将他们存储在项目下面的目录中,例如drive"Visual Studio projects"StyleSwapper。

为了看到确切地项目保存的位置,或者更改位置,执行下面操作:

1.

在工具菜单中,点击选项。

2.

在选项对话框中,点击项目和解决方案树型视图,然后点击常规标签。 在此,您可以指定项目和模板存储的位置,或者设置其它选项。

3.

注意项目的位置,然后点击确定关闭窗口。

当您创建新的项目后,Visual Studio自动的创建新的程序,并带有三个容器:属性,引用和Program.cs。您可以在解决方案资源管理器中查看这三个容器。Visual Studio同时也创建了用于添加大部分代码的空类。

备注:

Microsoft .NET Framework 3.0 (WinFX)包含了System.IO.Packaging 名称空间。利用System.IO.Packaging 名称空间,您能够添加文档组件,获取和更新内容,或者创建新的关系,使您能够构建新文档或者修改现有的文档名称空间中一些重要的成员包含Package 对象,PackagePart 对象,和PackageRelationship 对象。关于System.IO.Packaging 名称空间的更多信息,请见System.IO.Packaging Namespace

下一步,您将从您的项目中添加一个引用到.NET Framework 3.0:

10.

点击项目菜单,点击添加引用。

11.

在浏览标签中,在查找框中,搜索到WindowsBase.dll。根据此文档发布的时间,文件的位置位于drive"Program Files"Reference Assemblies"Microsoft"WinFx"v3.0.

12.

选择WindowsBase.dll 文件,然后点击确定。通过点击解决方案资源管理器中的引用来验证引用已经被创建。

13.

在解决方案资源管理器中,右键点击Program.cs,然后选择查看代码。

14.

在代码窗口的名称空间上面输入下面代码:

using System.IO; 
using System.IO.Packaging;

要使用2007 Office系统文档的内容,您需要打开它。System.IO.Packaging有一个称为Package的顶级成员,它相当于文档。在您代开 Package项目后,您将检查它的结构,操作它的组件。Packages能够作为只读,只写或者读/写形式打开。

15.

在Class Program 语句的括号({)后面添加以下代码。以下行中设置了包含您Word文档和style.xml位置的变量。这些语句假设WordOpenXMLFormatSample 文件夹在C盘中创建。

private static String stylePath = @"C:"WordOpenXMLFormatSample"NewStylePart"styles.xml";
private static String packagePath = @"C:"WordOpenXMLFormatSample"SampleWordDocument.docx.zip";

备注:

以@符号开始的字符串被称为逐字字符串字面变量(verbatim string literals)。这就告诉程序使用获取文件时出现的那些确定的字符串。

16.

当运行项目时,Main 过程将自动的执行。在Main的开阔号({ )和闭括号(})之间,输入以下行:

SwapStylePart(packagePath, stylePath);

此行调用了SwapStylePart 过程,您将在下面添加。它将路径传输到了Word 2007文档和styles.xml 组件中。

17.

在Main后的闭括号(})之后添加下面的代码:

static void SwapStylePart(String packagePath, String stylePath)
{ }

下面步骤中,您将添加代码到SwapStylePart 程序中,此程序用于打开作为Package对象并且拥有读/写访问权限出现的文档。注意using 语句的使用。它的目的是自动的处理Package 对象并且在语句完成之后清空使用的内存。

18.

将下列代码输入到SwapStylePart 程序中:

using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.ReadWrite))
{ }

为了能够使用2007 Office系统文档的任何组件,您首先需要定位它。您可以使用URL来引用一个特定的文档组件,URL是对每个组件唯一的路径。

19.

在using 语句的括号之间输入下面的语句:

// Set the URI for the styles document part (/word/styles.xml). 
Uri uriPartTarget = new Uri("/word/styles.xml", UriKind.Relative);

在编写此文章的那个时刻,System.IO.Packaging名称空间还不允许您复制或者替换一个已 经存在的组件。为了交换组件,您必须首先删除已经存在的组件,然后使用相同的URL创建一个新的组件。注意删除组件不会影响任何组件的关系。任何关系都完 好无损并且仍然应用到一个新的组件。

20.

在您上个步骤中添加的行后面输入以下代码:

// Delete the existing document part (/word/styles.xml).
package.DeletePart(uriPartTarget);

在package中添加一个新的文档组件需要使用一个URL。在这种情况下,您仅仅需要重新使用相同的 URL来重新创建样式文档组件。当创建一个package时需要一个额外的参数:组件的内容类型。当前在文档中使用的内容类型可以在位于文档容器中的 [Content_Types].xml组件中发现。

21.

在您上个步骤中添加的行后面输入以下代码:

// Recreate a new document part for styles(/word/styles.xml). PackagePart
packagePartReplacement = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");

利用新创建的样式组件,最后一步就是从原始的styles.xml组件中的XML复制到新创建的组件中。 System.IO.Packaging名称空间不会在一个XML文档中本地的处理XML,所以在.NET Framework中复制内容的方式就是通过使用Streams。

在下面的步骤中,您将添加代码,这些代码以流的形式打开外部样式组件,并且将其写入到新的样式文档组件中。为了复制流,您将调用CopyStream程序,并且在源和目的流中传输。

22.

在您上个步骤中添加的行后面输入以下代码:

using (FileStream fileStream = new FileStream(stylePath, FileMode.Open, FileAccess.Read))
{// Load the new styles.xml
using a stream.CopyStream(fileStream,packagePartReplacement.GetStream());
}

23.

下一步,在SwapStylePart程序的闭括号后添加CopyStream程序:

private static void CopyStream(Stream source, Stream target)
{
const int bufSize = 0x1000;
const int bufSize = 1024;
byte[] buf = new byte[bufSize];
int bytesRead = 0;
while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
{
target.Write(buf, 0, (int)bytesRead);
}
source.Close();
target.Close();
}

这 个过程设置了内存中缓冲区的大小,来自于原始styles.xml组件的数据流存储在缓冲区中。当有读取字节操作时,这些字节会被写入到新的 styles.xml组件中。To see the application in action, you need to build the project: 要查看程序的效果,您需要生成项目:

24.

在生成菜单中,点击生成StyleSwapper。

备注:

如果在生成的时候发生错误,您将看到一个对话框问您是否希望运行上次的生成。点击否,您将看到错误列表中的错误描述。如果您没有看到错误列表,在视图菜单中,点击错误列表。

25.

假设没有错误发生, 您现在运行代码。但是首先,您可能想要查看当前的文档:

26.

在Word 2007中打开 SampleWordDocument.docx.

27.

关闭Word 2007然后在 SampleWordDocument.docx 文件名后添加.zip 扩展名。

28.

按F5. 您将看到Windows控制台出现,很快您就会看到它消失了。因为这是一个控制台应用程序,它没有用户界面,只是很简单的出现。

29.

从文件名中移出.zip 扩展名,然后在Word 2007中重新打开它。注意文档的样式已经更改为"独特"样式。

下面一个练习阐述在没有Word 2007情况下您如何使用自定义的应用程序来在Office Open XML格式文件中执行批量操作。在这个练习中,您将创建一个托管程序,这个程序搜索满足特定标准的文件夹和子文件夹,从而找到正确的文件。应用程序为了术 语和包含数据文件的出现来检测文档组件。您可以想象使用这个程序来确定包含特定客户名称的文档,或者是包含特定产品名称的文档。您也可以在应用程序中添加 额外的逻辑,使用其他的术语来替换现有的,本质上就是在不使用应用程序的地情况下复制Word 2007中的查找-替换特性。

根据关键字搜索一组Office Open XML格式文件

1.

启动Visual Studio 2005.

2.

在文件菜单中,点击新建项目。

3.

在新建项目对话框中,从左边的项目类型树型视图中,选择Visual C#.然后选择Windows 应用程序,更改项目的名称为KeywordSearch,然后点击确定。Visual Studio 创建了项目中所有的文件。

4.

在解决方案资源管理器中,右键点击Form1.cs,然后点击查看设计器。

5.

在 Form1.cs [Design] 标签中, 将下面的控件添加到窗体中,然后设置它们的属性,以至于窗体类似于图5。

.

5. KeywordSearch 窗体

表2. 用于Office Open XML 格式文档关键字搜索窗体的控件列表

类型 属性

Label

Text: Search Directory

TextBox

Name: txtPath

 

Text: C:"WordDocuments 注意这是搜索开始的默认目录。

Label

Text: Search Pattern

ComboBox

Name: cboMask

 

Items (Collection): *.docx *.docm

 

Text: *.docx

CheckBox

Name: ckbSubfolders

 

Text: Include Subfolders

Label

Text: Search Term

TextBox

Name: txtTerm

Button

Name: btnSearch

 

Text: Search

Button

Name: btnClose

 

Text: Close

Label

Text: Results

ListBox

Name: lbxResults

6.

在解决方案资源管理器中,右键点击Form1.cs,然后点击查看代码。

7.

在代码窗口中,在已存在的using 语句后面添加下面的语句:

using System.Xml; using System.IO; using System.IO.Packaging;

要使用System.IO.Packaging 名称空间,您需要添加一个到WindowsBase.dll库的引用,它位于.NET Framework 3.0 SDK (WinFX)中:

8.

在项目菜单中,点击添加引用。

9.

在浏览标签中的查找框中,搜索WindowsBase.dll 文件名。根据此文章发布的时间,文件位于drive"Program Files"Reference Assemblies"Microsoft"WinFx"v3.0目录中。

10.

点击确定。

11.

在 public partial class Form1 : Form的开括({)号后面,添加下面的类变量:

FileInfo[] tempfiles; List<FileInfo> files = new List<FileInfo>();

下一步,添加代码到搜索按钮中:

12.

在Form1.cs [Design] 标签中,双击搜索按钮添加Click事件。

13.

在 btnSearch_Click 过程的两个括号之间,添加下面的代码:

Boolean match = false; // Ensure that the user added a search term.
if (txtTerm.Text == "")
{
MessageBox.Show("Don't forget the search term.");
}
List<FileInfo> returnedFiles; // Get the starting directory.
DirectoryInfo dir = new DirectoryInfo(txtPath.Text); // Get the list of files.
returnedFiles = GetDirFiles(dir); // Loop through the file list.
foreach(FileInfo file in returnedFiles)
{
match = GetDocPart(file);
}
if(!match)
{ // No matching files were found.
lbxResults.Items.Add("No matches.");
}

在 这个代码中,声明了Boolean 变量用于显示是否搜索发现了任何匹配的内容。下一步,如果文本框是空的,代码将提示用户输入搜索的关键字。在窗体中的其它文本框都有默认值。下一步,定义 一个List 类来包含从搜索中返回的文件。List 类提供了一个数组,在此数组中可以动态的提升大小。变量 dirs 指向了搜索开始的目录。然后指向GetDirsFiles 过程的调用将在目录中返回文件列表。接下来代码将循环查询返回的文件集,调用GetDocPart 过程来为搜索关键字检测每一个文件。如果没有匹配的选项,一个消息将被添加到列表框中。

14.

添加 GetDirFiles 程序:

public List<FileInfo> GetDirFiles(DirectoryInfo dir)
{ // Get all files for the current directory.
Object selectedItem = cboMask.SelectedItem;
tempfiles = dir.GetFiles(selectedItem.ToString());// Add these files to the returned file list.
foreach (FileInfo file1 in tempfiles)
{
files.Add(file1);
}// Search subfolders if requested.
if (ckbSubfolders.Checked)
{// Get subfolders for the current directory.
DirectoryInfo[] dirs = dir.GetDirectories("*.*");
foreach (DirectoryInfo directory in dirs)
{
GetDirFiles(directory);
}
}
return files;
}

这 个程序设置selectedItem 变量等于显示在combo框中的搜索样式。下一步,在当前的目录中调用 GetFiles 方法来返回所有符合搜索样式的文件。返回的文件被添加到文件列表中。如果一个用户选择了Include Subfolders 复选框,每个当前目录的子目录通过递归行式调用GetDirFiles 程序(带有每个子文件夹名称的)而被搜索到。最后文件列表就被返回到调用(btnSearch_Click) 程序中。

15.

在 GetDirFiles 程序后面添加下面的代码:

private Boolean GetDocPart(FileInfo file)
{ // Retrieve the start part for the input file.
Boolean fileFound = false;
const String documentRelationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
const String dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";// Open the package with read access.
using (Package myPackage = Package.Open(file.DirectoryName + """" + file.Name, FileMode.Open, FileAccess.Read))
{ // Get the main document part (document.xml).
foreach (PackageRelationship relationship in myPackage.GetRelationshipsByType(documentRelationshipType))
{ // There should be only one document part in the package.
Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
PackagePart documentPart = myPackage.GetPart(documentUri);
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("w", dcPropertiesSchema);
XmlDocument doc = new XmlDocument(nt);
doc.Load(documentPart.GetStream());
if (doc.OuterXml.IndexOf(txtTerm.Text) >= 1)
{
lbxResults.Items.Add(file.DirectoryName + """" + file.Name);
fileFound = true;
}// There is only one document part, so exit the loop. break;
}
}
if (lbxResults.Items.Count >0)
{
return true;
}
else
{
return false;
}
}

此 程序初始时分别设置变量值为文档关系类型中的名称空间和文档属性的架构。接着文档作为Package 对象被打开。在System.IO.Packaging 名称空间中,您可以通过组件之间的关系(定义在关系组件中),通过包含组件结构路径的URL来访问package中各种各样的组件。 用于图像组件的一个URL示例就是 "word"media"picture.jpg. 如果您知道到2007 Office系统文档中特定文档组件的URL,您可以直接的访问,编辑或者删除组件。在GetDocPart 程序中,通过调用Package 对象中的GetPart 方法,然后传输到组件URL中从而返回document.xml 组件。

下一步, XmlDocument 对象指向了一个XML文件,此文件包含一个或多个到不同名称空间的引用。和所有的XML文件一样,XML解析器通过带有名称空间前缀的名字来访问文档中大量的元素和属性。

备注:

没有限定符的元素名称被认为是一个默认名称空间的组件。

这 些名称空间的限定符在运行时必须被解析到它们名称空间的引用。为了使此任务轻松并且一致,.NET Framework 包含了提供大量名称空间管理工具的XmlNamespaceManager。其中一个就是NameTable 类。NameTable 类在内部存储了属性和元素名称。当一个元素或者属性名称在一个XML文档中出现多次时,它只在NameTable 中存储一次。当一个名称空间限定符发生冲突时,它能够使用NameTable 中的字符串进行解析。

在下一个 语句中,创建了一个XmlDocument 对象,并且利用文档组件中的内容进行填充。下一步,为了搜索,对象的内容被扫描。注意C# IndexOf 方法与Visual Basic InStr 方法相同。如果找到搜索关键字,目录和文件名被添加到窗体中的列表框中,程序返回True。否则就是找不到匹配选项,程序返回False。

16.

最后,在Form1 Designer中,双击关闭按钮然后在程序中添加下面的语句:

Close();

测试程序:

17.

在磁盘C或者是您选择的任何位置上,创建一个名为WordDocuments 的文件夹。

18.

复制SampleWordDocument.docx 文档和AnotherSampleWordDocument.docx 文档到WordDocuments 文件夹中。

19.

打开Word 2007并且创建一个新的文档。

20.

添加一些文本(不要包含Eagle)并且将文档保存在WordDocuments文件夹下,名称为SearchSampleDocument.docx 。

21.

按F5 运行此项目。

22.

在窗体中,在Search Directory 框中,输入.docx 文档的位置。

23.

在Search Term 框中,输入Eagle,然后点击Search。

包含“Eagle”的两个文档显示在列表框中,如图6所示。SearchSampleDocument.docx 文档没有显示。

.

6. 运行关键字搜索的结果

24.

关闭窗口。

这就是您需要搜索文档的所有代码,此种情况不需要使用Word 2007。您需要添加一些小功能:计算搜索文档的个数 ,添加替换功能,或者搜索其它组件。

结论

在这篇文章中,您熟悉了Office Open XML格式文件的结构。您浏览了文件格式,同时演示了如何使用标准的XML和ZIP技术轻松的访问和编辑2007 Microsoft Office文档。您也学习到了如何手动和编写程序的方式操作Office Open XML 格式文件。通过这些内容,您具备了为组织创建自定义应用程序的基础


转载请注明本文地址: 如何操作 Office Open XML 格式文档(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dearbaba_8520/article/details/82414833

智能推荐

c语言中gets函数可以输入空格吗_c语言中gets()的详细用法-程序员宅基地

文章浏览阅读2.3k次。gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。读入成功,返回与参数buffer相同的指针;读入..._c++gets怎么添加空白行

windoes_cmd_powershell_powershell ISE-程序员宅基地

文章浏览阅读771次,点赞16次,收藏21次。=安装完成后尝试执行然后确定该module可以正常载入cmd:3、验证Microsoft Defender防病毒是否正在运行 Get-Service -Name windefend验证防火墙保护是否已打开 Get-Service -Name mpssvc若要查看未运行的所有服务,请运行以下 PowerShell cmdlet:Windows 命令提示符sc start WinDefend Enable #命令启动下一步======

Linux服务器集群系统(三)_linux 如何检测服务器群集运行状态-程序员宅基地

文章浏览阅读1k次。LVS集群中的IP负载均衡技术章文嵩 ([email protected]) 2002 年 4 月本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)的工作原理,以及它们的优缺点。1.前言在 前面文章中,讲述了可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)..._linux 如何检测服务器群集运行状态

[PHP]得推家政派单系统 v2.4_php上门家政系统-程序员宅基地

文章浏览阅读89次。[PHP]得推家政派单系统 v2.4_php上门家政系统

实现串并数据CRC校验的四种Verilog_crc verilog 串行计算-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏25次。目录我最推荐最后一种。1、CRC原理2.实现CRC校验的四种程序2.1并行实现 2.1.1模二除法实现CRC 2.1.2线性反馈移位寄存器LFSR实现CRC2.2处理串行数据 2.2.1模二除法实现CRC 2.2.2线性反馈移位寄存器LFSR实现CRC1、CRC原理模2运算原理模2加法:不考虑进位,按位加=按位异或---等价于---模2减法:不考虑借位,按位减=按位异或模2乘法:在将各个位乘的结果相加时按照模2加法来做模2除法:每一步商1后,减法使用的是..._crc verilog 串行计算

VMD-LSTM/LSTM基于变分模态分解和长短期记忆网络的时间序列预测(含LSTM、VMD-LSTM 模型的对比)。评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学_lstm模型中zim-程序员宅基地

文章浏览阅读414次。VMD-LSTM/LSTM基于变分模态分解和长短期记忆网络的时间序列预测(含LSTM、VMD-LSTM 模型的对比)。评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。_lstm模型中zim

随便推点

Cannot destructure property ‘username‘ of ‘undefined‘ as it is undefined-程序员宅基地

文章浏览阅读4.2k次。Cannot destructure property 'username' of 'undefined' as it is undefined_cannot destructure property

博图PLC程序 停车场控制系统_plc停车场车位控制系统-程序员宅基地

文章浏览阅读1.7w次,点赞28次,收藏163次。自动化PLC实训项目——基于PLC的停车场控制系统的设计_plc停车场车位控制系统

tensorrt+tensorflow+object_detection编译安装填坑教程!!_warning: no files found matching '*.pyd' under dir-程序员宅基地

文章浏览阅读3.1k次。tensorflow+tensorrt+object_detection (CUDA10.0 Cudnn7.4.1) 在anconda 环境下编译安装安装环境os: ubuntu 16.04cuda:10.0cudnn:7.4.1(其它版本也可以,eg:7.3.1)tensorflow:1.13.0rc(1.13.1版本容易编译失败)python:3.5 (3.7版本编译1.13.0..._warning: no files found matching '*.pyd' under directory '*

Win8系统108个运行命令 你能记住多少?-程序员宅基地

文章浏览阅读222次。Win8运行命令:程序和功能   取消了开始菜单的Win8让人感觉很不习惯,这才发现原来开始菜单可以做这么多事。不过Win8中的一些快捷键还沿用了Windows一直以来的习惯,比如按下Windows + R打开“运行”对话框。在这里我们可以通过命令来打开各种应用程序或系统设置,不过这需要你有超强的记忆力,能把Win8中所有的运行命令都记住。 以下这108条运行命令都是大家经常会用...

ethtool如何让接口闪灯_linux 网卡状态命令mii-tool 和 ethtool-程序员宅基地

文章浏览阅读1.9k次。linux下用mii-tool和ethtool 查看网线是否正确连接到网卡输入mii-tool可以查看网线是否连接到网卡mii-tooleth0: negotiated 100baseTx-FD, link ok有时驱动可能不支持会出错下列错误mii-toolSIOCGMIIPHY on 'eth0' failed: Operation not supportedno MII interfaces..._ethtool让接口闪烁的命令

QT总结_qtchar清除上一条线-程序员宅基地

文章浏览阅读1.2k次。总结(-)原文地址:http://www.cnblogs.com/cy568searchx/p/3501875.html1> 定时器的使用QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); // 设置定时器回调函数 timer->_qtchar清除上一条线

推荐文章

热门文章

相关标签