OpenXML При получении внутреннего текста DocParts возвращается "ошибка! Неизвестное имя свойства документа"

Я пытаюсь получить внутреннюю структуру шаблона документа Word, используя OpenXML SDK 2.5.

Дело в том, что когда я вызываю свойство innertext у docpart, куда я добавил docproperty, оно всегда добавляет дополнительное "Ошибка! Неизвестное имя свойства документа". строка...

  /// <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>

QuickWatch Visual Studio

Шаблон Word View

1 ответ

Решение

Кажется, вы ссылаетесь на свойство документа, которого нет в документе. Вы можете установить свойства вручную через Word (для 2007 см. http://office.microsoft.com/en-001/word-help/view-or-change-the-properties-for-an-office-document-HA010047524.aspx) или через openXML ( http://msdn.microsoft.com/en-us/library/ff936167%28v=office.14%29.aspx)

ОБНОВИТЬ

OpenXML не обновляет свойства. Если вы вставили свойство и не попросили Word обновить его, вы увидите сообщение, которое видите, даже если свойство уже существует. Взгляните на это для более "официального" ответа - http://social.msdn.microsoft.com/Forums/office/en-US/f72c9489-dc50-457b-8629-567f83882770/update-word-document-properties,

Я думаю, что если вы планируете работать с OpenXML, лучшим вариантом будет прочитать свойства, как вы. Когда у вас есть имя, не смотрите на значение, которое там хранится, а получите соответствующее значение свойства документа. Таким образом, вы всегда получите самую последнюю версию. Значение, которое вы получите, как вы работаете сейчас, является последним значением, которое было обновлено в слове.

Вы получаете следующий метод, чтобы получить словарь имен и значений пользовательских свойств документа -

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);
        }
    }
Другие вопросы по тегам