以编程方式将OpenXml文档保存为以前的版本(Word 2007)

时间:2013-06-24 19:40:08

标签: c# ms-word openxml

我有一些代码可以创建要在MS Word中查看的文档。一些XML通过XSLT运行,然后添加到OpenXML文档中。生成的文档在Word 2010中看起来很好,但不会在Word 2007中打开,我需要能够支持它。如何创建有效的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();
}


This post有一些有用的信息:

  

Word 2010和Word 2007之间存在差异,它们遵循不同版本的OOXML标准。您很可能已包含在Word 2010中有效但Word 2007无法处理的内容。您没有提供任何有用的信息来说明可能的内容,但是当Word 2010创建文档时,它使用“AlternateContent”标记为不同版本的Word提供不同版本的xml,您可能必须执行相同或限制自己使用与Word 2007兼容的内容。

我如何提前知道“Word 2007兼容内容”是什么?

2 个答案:

答案 0 :(得分:0)

此症状的最常见原因之一是该文档包含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论坛上发帖,问题/样本文件会自动引起我的注意。

干杯,埃里克

答案 1 :(得分:0)

在Word 2007中打开我的文档显示该行

<w:tblW w:w="auto" w:type="pct" />

造成了问题。使用OpenXML SDK工具进行验证,我发现了几个导致验证错误的错误:

  • 双打用作Int32
  • 元素顺序很重要(根据schemathis question
  • w:w="auto"不是有效的Int32

运行时验证也可以按here所示执行。

w:tblPr更改为:

<w:tblPr>
    <w:tblW w:type="auto" />
</w:tblPr>

修复验证错误后,文档仍然无法打开,从而导致tblW tag

  

表格的首选宽度是使用&lt; w:tblPr&gt; 元素中的&lt; w:tblW&gt; 元素指定的。表中的所有宽度都被认为是首选,因为列的宽度可能会发生冲突,并且表布局规则可能需要覆盖首选项。如果省略此元素,则单元格宽度为auto。

删除w:tblW元素解决了问题。

展望未来,似乎没有任何方法可以验证OpenXml,使其与Word 2007兼容。