2012-12-21 55 views
2

是否可以在書籤和openXML的幫助下將多行添加到單詞文檔中?使用單個書籤將文本添加到單詞中的多行

我們有一個worddocument作爲報告模板。 在該模板中,我們需要添加多個事務行。 問題是行數不是靜態的。例如,它可以是0,1或42。

在當前模板(我們可以更改)中,我們添加了3個書籤 TransactionPart,TransactionPart2和TransactionPart3。 樹事務部分形成了具有三種不同數據內容(ID,描述,金額)的單行行

如果我們只有一個事務行,我們沒有問題將數據添加到這些書籤,但是我們應該如何添加第二排?沒有更多行的書籤。

有沒有這樣做的巧妙方法?

或者我們應該更改word文檔,以便行最終在表中?這會以更好的方式解決問題嗎?

回答

2

我會把一個書籤叫做「交易」在一個3 coloumn表內。 像這樣 tablelayout

當你知道這些表的設計,但行不數,知道你們需要最簡單的方法是添加一行數據的每一行你。

你可以完成與一個像這樣的代碼

//make some data. 
      List<String[]> data = new List<string[]>(); 

      for (int i = 0; i < 10; i++) 
       data.Add(new String[] {"this","is","sparta" }); 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("yourDocument.docx", true)) 
       { 
        var mainPart = wordDoc.MainDocumentPart; 
        var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>(); 
        var bookmark = 
         from n in bookmarks 
         where n.Name == "transactions" 
         select n; 

        OpenXmlElement elem = bookmark.First().Parent; 
        //isolate tabel 
        while (!(elem is DocumentFormat.OpenXml.Wordprocessing.Table)) 
         elem = elem.Parent; 
        var table = elem; //found 
        //save the row you wanna copy in each time you have data. 
        var oldRow = elem.Elements<TableRow>().Last(); 
        DocumentFormat.OpenXml.Wordprocessing.TableRow row = (TableRow)oldRow.Clone(); 
        //remove old row 
        elem.RemoveChild<TableRow>(oldRow); 
        foreach (String[] s in data) 
        { 
         DocumentFormat.OpenXml.Wordprocessing.TableRow newrow = (TableRow)row.Clone(); 
         var cells = newrow.Elements<DocumentFormat.OpenXml.Wordprocessing.TableCell>(); 
         //we know we have 3 cells 
         for(int i = 0; i < cells.Count(); i++) 
         { 
          var c = cells.ElementAt(i); 
          var run = c.Elements<Paragraph>().First().Elements<Run>().First(); 
          var text = run.Elements<Text>().First(); 
          text.Text = s[i]; 
         } 
         table.AppendChild(newrow); 
        } 
       } 

你結束了這個

final table

我測試過這個代碼在一個非常基本的文檔,並知道它的工作原理。 祝你好運,讓我知道,如果我可以進一步澄清。

相關問題