2014-04-23 64 views
2

我是一位經驗豐富的C#開發人員,他在項目的這個特定階段吸取了大量的時間,並開始處理文檔生成(團隊中沒有人對此有特別的體驗) )。在循環中創建MS Word內容控件

對於Word輸出,到目前爲止,我一直在使用內嵌在文檔中的內容控件和DocumentFormat.OpenXml包中的一些方法來創建我可以在代碼中識別的字段並動態替換相應的數據。因此,我通過這樣的內容控件加載模板和循環:

string template = serverRoot + @"Templates\MyTemplate.docx"; 
string path = serverRoot + @"DataOut\\" + clientName + "\\MyDocument.docx"; 
File.Copy(template, path, true); 

using (WordprocessingDocument newDoc = WordprocessingDocument.Open(path, true)) 
{ 
    MainDocumentPart mainPart = newDoc.MainDocumentPart; 
    var placeHolders = mainPart.Document.Body.Descendants<SdtElement>(); 

    foreach (var sdtRun in placeHolders) 
    { 
     Console.WriteLine("Found Field: " + sdtRun.SdtProperties.GetFirstChild<Tag>().Val.Value); 
     switch (sdtRun.SdtProperties.GetFirstChild<Tag>().Val.Value) 
     { 
      //check the content control values and replace them 
     } 
    } 
} 

然而,我的下一個文件,需要根據具體情況重複元素的數量不定。或者換一種方式,對於文件中的包就需要輸出像這樣成DOC:

Filename: <insert filename> 
Quantity: <insert quantity> 
Date:  <insert date> 

但是,我們事先不知道有多少文件會出現。

AFAIK我不能用一個標準的內容控件來做到這一點,至少在保留任何形式的合理格式時都是如此。

這裏最好的辦法是什麼?我是否應該將整個文本生成爲一個塊,添加換行符等,並將它們全部整合到一個內容控制中?即時創建新的內容控制(如果有,如何)?或者,還有更好的方法?

+0

根據需要,爲什麼不添加內容控制? –

回答

1

我把懦夫的出路這一次到底,並用於我加建了一個循環內的詳細運行對象一個內容控制:

private Run ParseForOpenXML(string textualData) 
{ 
    Run run = new Run(); 

    //split string on paragraph breaks, and create a Break object for each 
    string[] newLineArray = { Environment.NewLine, "\n" }; 
    string[] textArray = textualData.Split(newLineArray, StringSplitOptions.None); 
    bool first = true; 

    foreach (string line in textArray) 
    { 
     if (!first) 
     { 
      run.Append(new Break()); 
     } 
     first = false; 

     //split string on tab breaks, and create a new TabChar object for each 
     bool tFirst = true; 
     string[] tabArray = line.Split('\t'); 
     foreach(string fragment in tabArray) 
     { 
      if (!tFirst) 
      { 
       run.Append(new TabChar()); 
      } 
      tFirst = false; 

      Text txt = new Text(); 
      txt.Text = fragment; 
      run.Append(txt); 
     } 
    } 

    return run; 
}