以编程方式将OpenXml文档保存为早期版本(Word 2007)
本文关键字:版本 Word 2007 方式 编程 OpenXml 保存 文档 | 更新日期: 2023-09-27 18:19:40
我有一些代码可以创建一个要在MS Word中查看的文档。一些XML通过XSLT运行,然后添加到OpenXML文档中。生成的文档在Word2010中看起来不错,但在Word2007中无法打开,我需要能够支持它。如何创建有效的Word 2007文档?
使用Open XML Format SDK 2.0(2.0.5022.0版)
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
...
using (WordprocessingDocument package = WordprocessingDocument.Create(outputPath, WordprocessingDocumentType.Document))
{
package.AddMainDocumentPart();
MainDocumentPart mainPart = package.MainDocumentPart;
mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document();
// code ... XML translation and append to document
package.MainDocumentPart.Document.Save();
}
这篇文章有一些有用的信息:
Word2010和Word2007之间存在差异,它们遵循OOXML标准的不同版本。很可能您包含了在Word 2010中有效的内容,但Word 2007无法处理。您没有提供任何有用的信息来说明这可能是什么,但当Word 2010创建文档时,它会使用"AlternateContent"标记为不同版本的Word提供不同版本的xml,您可能不得不这样做,或者将自己限制为与Word 2007兼容的内容。
我如何提前知道什么是"Word2007兼容内容"?
出现这种症状的最常见原因之一是文档在Office 14命名空间中包含元素/属性。
例如,您可能有这样的标记:
<w:rPr>
<w:color w:val="5B9BD5"
w:themeColor="accent1"/>
<w14:shadow w14:blurRad="38100"
w14:dist="25400"
w14:dir="5400000"
w14:sx="100000"
w14:sy="100000"
w14:kx="0"
w14:ky="0"
w14:algn="ctr">
<w14:srgbClr w14:val="6E747A">
<w14:alpha w14:val="57000"/>
</w14:srgbClr>
</w14:shadow>
您可能已经声明了w14命名空间,但也需要在根元素中有一个属性:
mc:Ignorable="w14 w15 wp14"
您需要声明此属性:
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
mc:Ignorable="w14 w15 wp14">
这也意味着您需要专门使用这些名称空间前缀。
如果这不是问题所在,如果你愿意,我可以看看你的文件。我可能很快就能告诉你为什么它不会在2007年开业。如果你在论坛OpenXMLDeveloper.org上发帖,问题/示例文档会自动引起我的注意。
干杯,Eric
在Word2007中打开我的文档显示行
<w:tblW w:w="auto" w:type="pct" />
造成了问题。使用OpenXMLSDK工具进行验证时,我发现了几个导致验证错误的错误:
- 双打用作Int32
- 元素的顺序很重要(根据模式和这个问题)
w:w="auto"
不是有效的Int32
运行时验证也可以执行,如下所示。
将w:tblPr
更改为:
<w:tblPr>
<w:tblW w:type="auto" />
</w:tblPr>
在修复了验证错误后,文档仍然无法打开,这导致了tblW标签:
表格的首选宽度由<w: <w: tblPr>元素。表中的所有宽度都被视为首选,因为列的宽度可能会冲突,并且表布局规则可能需要重写首选项。如果省略此元素,则单元格宽度为auto类型。
删除w:tblW
元素解决了问题。
展望未来,似乎没有任何方法可以验证OpenXml,使其与Word2007兼容。