2016-06-08 46 views
0

是否有可能複製與OpenXML的Word文檔元素,而無需「副本ID」的任何問題?重複使用的OpenXML(word文檔)和ID問題

實際上,複製,克隆我的身體裏面的元素和追加在體內的克隆元素。但是,如果任何元素都有ID,那麼當我用word打開文檔時會出錯。

下面是從處理OpenXML驗證錯誤的一個示例:

  • [60]描述= 「屬性的 'id' 應具有獨特的價值及其 電流值 '矩形11' 與 他人重複」

這裏是我的代碼:

 Document document = wordDocument.MainDocumentPart.Document; 
     Body body = document.Body; 
     IEnumerable<OpenXmlElement> elements = ((Body)body.CloneNode(true)).Elements(); 

     foreach (var element in elements) 
     { 
      OpenXmlElement e = (OpenXmlElement)element.CloneNode(true); 

      body.AppendChild(e);    
     } 

回答

0

你不能只是複製的元素有一個id,你要複製件太(搜索OpenXmlPart更多信息)。

您可以通過組合功能AddPart()GetIdOfPart()(從MainDocumentPart訪問)做到這一點

首先嚐試: 當你有一個id的元素,使用AddPart(OpenXmlPart part)要添加的元素部分,並檢索生成的新與GetIdOfPart(OpenXmlPart part)

後,該部分的ID,您可以通過新的

在克隆OpenXmlElement的ID替換第二個嘗試: 或者你可以想像這樣的其他方式:

  • 檢查現有零件的最高ID(並保存)
  • 克隆從一開始各地,並選擇自己的ID(通過增加最高存儲ID)
  • 當您複製的每個元素,並找到一個id,添加保存最高的ID,以配合新的零件

我希望這種方式會幫助你一個,但在任何情況下,你會需要克隆部分

+0

工作,你有什麼例子嗎?我不知道如何改變元素的ID。關於這些部分,我只需要AddPart(e)在我的情況下? –

+0

您需要添加零件的副本(使用AddPart),檢索複製零件的新Id(使用GetIdOfPart)並將複製的元素中的id替換。要替換Id,你必須檢查你的元素(將你的OpenXmlElement轉化爲真實的對象,並使用Id屬性來影響新的Id。 –

+0

我必須複製哪部分?因爲我正在迭代openxmlelement的列表嗎?真的不知道該怎麼做。 –

0

DocIO是一個.NET類庫,可以讀,寫和呈現Microsoft Word文檔。使用DocIO,您可以克隆元素,如段落,表格,文本運行或整個文檔,並在需要追加它。

的控制整個套件,如果你有資格是免費提供的(商業應用也)通過community license program。社區許可證是完整的產品,沒有任何限制或水印。

。由此,我們有一個給定的簡單示例代碼片段克隆其所有的段落和表格文檔主體,並在同一文檔的末尾添加他們。

using Syncfusion.DocIO.DLS; 

namespace DocIO_Clone 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     using (WordDocument document = new WordDocument(@"InputWordFile.docx")) 
     { 
      int sectionCount = document.Sections.Count; 
      for (int i = 0; i < sectionCount; i++) 
      { 
       IWSection section = document.Sections[i]; 
       int entityCount = section.Body.ChildEntities.Count; 
       for (int j = 0; j < entityCount; j++) 
       { 
        IEntity entity = section.Body.ChildEntities[j]; 
        switch(entity.EntityType) 
        { 
         case EntityType.Paragraph: 
          IWParagraph paragraph = entity.Clone() as IWParagraph; 
          document.LastSection.Body.ChildEntities.Add(paragraph); 
          break; 
         case EntityType.Table: 
          IWTable table = entity.Clone() as IWTable; 
          document.LastSection.Body.ChildEntities.Add(table); 
          break; 

        } 
       } 
      } 
      document.Save("ResultDocument.docx"); 
     } 
    } 
} 
} 

欲瞭解更多信息,請參閱我們的help documentation

注:我爲Syncfusion

相關問題