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 に答える