0

我正在尝试使用 openxml sdk 2.5 获取 word 文档模板的内部结构。

关键是,当我在添加 docproperty 的地方调用 docpart 的 innertext 属性时,它总是添加一个附加的“错误!未知文档属性名称”。细绳...

  /// <summary>
  /// Examines a word document to create the data structure of autotexts
  /// </summary>
  /// <param name="document">Word document to be processed</param>
  /// <returns>OpenXMLAutoTextContainer</returns>
  public static OpenXMLAutotextContainer GetAutotextContainer(WordprocessingDocument document)
  {
     OpenXMLAutotextContainer result = null;

     try
     {
        result = new OpenXMLAutotextContainer()
        {
           Name = document.ExtendedFilePropertiesPart.Properties.Template.InnerText
        };

        result.OpenXMLAutoTextList = new Dictionary<string, OpenXMLAutotext>();

        List<CIProField> CIProFields = null;

        foreach (DocPart _docPart in document.MainDocumentPart.GlossaryDocumentPart.GlossaryDocument.DocParts)
        {
           if (_docPart.DocPartProperties.Category.Gallery.Val == "autoTxt")
           {
              CIProFields = new List<CIProField>();

              result.OpenXMLAutoTextList.Add(
                 _docPart.DocPartProperties.DocPartName.Val,
                 new OpenXMLAutotext()
                 {
                    Name = _docPart.DocPartProperties.DocPartName.Val,
                    Content = _docPart.DocPartBody.InnerText,
                    CIProFields = CIProFields
                 });
           }
        }
     }
     catch (Exception ex)
     {
        OpenXMLCustomException e = new OpenXMLCustomException(ex, "GetAutotextContainer");
        throw e;
     }

     return result;
  }
}

OpenXML SDK 输出:

<w:docPart xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
   <w:docPartPr>
   <w:name w:val="W_DocProp01" />
   <w:style w:val="Normal" />
   <w:category>
     <w:name w:val="General" />
     <w:gallery w:val="autoTxt" />
   </w:category>
   <w:behaviors>
     <w:behavior w:val="content" />
   </w:behaviors>
   <w:guid w:val="{12809B83-5021-4211-A70D-EA3447274A83}" />
</w:docPartPr>
<w:docPartBody>
  <w:p w:rsidRPr="001E1D2D" w:rsidR="00F6185D" w:rsidP="001E1D2D" w:rsidRDefault="00F6185D">
    <w:pPr>
      <w:rPr>
        <w:lang w:val="es-ES" />
      </w:rPr>
    </w:pPr>
    <w:r>
      <w:rPr>
        <w:lang w:val="es-ES" />
      </w:rPr>
      <w:fldChar w:fldCharType="begin" />
    </w:r>
    <w:r>
      <w:rPr>
        <w:lang w:val="es-ES" />
      </w:rPr>
      <w:instrText>DOCPROPERTY "Test_W_DocProp01"</w:instrText>
    </w:r>
    <w:r>
      <w:rPr>
        <w:lang w:val="es-ES" />
      </w:rPr>
      <w:fldChar w:fldCharType="separate" />
    </w:r>
    <w:r>
      <w:rPr>
        <w:b />
        <w:bCs />
        <w:lang w:val="en-US" />
      </w:rPr>
      <w:t>Error! Unknown document property name.</w:t>
    </w:r>
    <w:r>
      <w:rPr>
        <w:lang w:val="es-ES" />
      </w:rPr>
      <w:fldChar w:fldCharType="end" />
    </w:r>
    </w:p>
    <w:p w:rsidR="00000000" w:rsidRDefault="00F6185D" />
  </w:docPartBody>
</w:docPart>

快看视觉工作室...

Word 模板视图

4

1 回答 1

2

您似乎正在引用文档中不存在的文档属性。您可以通过 Word 手动设置属性(对于 2007,请参阅http://office.microsoft.com/en-001/word-help/view-or-change-the-properties-for-an-office-document-HA010047524。 aspx#BM15 ) 或通过 openXML ( http://msdn.microsoft.com/en-us/library/ff936167(v=office.14).aspx )

更新

OpenXML 不刷新属性。如果您插入了一个属性并且没有要求 Word 刷新它,您将收到您所看到的消息 - 即使该属性已经存在。看看这个以获得更“官方”的答案 - http://social.msdn.microsoft.com/Forums/office/en-US/f72c9489-dc50-457b-8629-567f83882770/update-word-document-properties .

我认为,如果您打算使用 OpenXML,最好的选择是像您一样阅读属性。有了名称后,不要查看存储在那里的值,而是获取相应的文档属性值。这样,您将始终获得最新版本。您现在的工作方式将获得的值是在 word 中更新的最后一个值。

您可以使用以下方法获取自定义文档属性名称和值的字典 -

private static Dictionary<string, string> GetCustomDocumentProperties(WordprocessingDocument p_document)
    {            
        if (p_document.CustomFilePropertiesPart == null)
        {
            return new Dictionary<string, string>();
        }
        else
        {
            return p_document.CustomFilePropertiesPart.Properties.ToDictionary(p => ((CustomDocumentProperty) p).Name.InnerText,
                                                                          p => ((CustomDocumentProperty) p).InnerText);
        }
    }
于 2013-08-13T11:30:13.223 回答