2015-12-30 95 views
1

我有一個Word文檔存儲在我希望用作模板的服務器上。我需要用數據庫中的數據替換某些文本。使用模板生成Word文檔

我遇到的兩個問題是: 服務器上沒有辦公室使用Microsoft.Office.Interop,我無法將任何文檔保存到服務器。

我認爲我走在正確的軌道上,但不能拿出一個可行的解決方案。我想我的最佳途徑是讀入內存並使用字節數組來允許用戶保存文件。

我正在做這樣的事情,但我目前難住。

Dim path As String = HttpContext.Current.Request.PhysicalApplicationPath & "Letters\Test.docx" 
     Dim docBA As Byte() = File.ReadAllBytes(path) 

     Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Open(path, True) 
     Using (wordDoc) 
      Dim docText As String = Nothing 
      Dim sr As StreamReader = New StreamReader(wordDoc.MainDocumentPart.GetStream) 

      Using (sr) 
       docText = sr.ReadToEnd 
      End Using 

      Dim regexText As Regex = New Regex("FIRST_NAME") 
      docText = regexText.Replace(docText, "TESTING!!!") 

      Dim sw As StreamWriter = New StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)) 
      Dim modBA As Byte() 
      Using (sw) 
       sw.Write(docText) 
       modBA = sw.Encoding.GetBytes(sw.BaseStream, 0, sw.BaseStream.Length) 
       HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename= DownloadSample.docx") 
       HttpContext.Current.Response.ContentType = "application/octectstream" 
       HttpContext.Current.Response.BinaryWrite(modBA) 
       HttpContext.Current.Response.End() 
      End Using 
+0

我試過這樣一次,放棄了。由於.docx基本上是一個XML文檔,所以可以設想做一個XSLT(我有一些成功,但是太麻煩了,沒有用處)。*你可以*在服務器上有Office,但它不是線程安全的,所以你那裏也有麻煩。我的最終解決方案是將Word文檔轉換爲可填寫的PDF,在Post上將用戶的Web數據寫入FDF並在後端使用PDFTk以在運行時合併兩者。 – Duston

回答

1

你在正確的軌道上,與開放式XML文件格式的工作,而不是試圖在服務器環境中的Word應用程序來編輯文檔。

但是,您將要擁有的一個步驟是,您無法可靠地讀取內容,因爲您的示例代碼並使用RegEx。原因在於,底層的Word Open XML文本運行可以(通常是)通過直接格式化命令,拼寫錯誤,語言格式和其他各種各樣的事情來分解。

由於您選擇RegEx的目的是將數據寫入「佔位符」,更好的方法是使用內容控件(std elements)作爲「目標」。這些可以直接定位並寫入數據。內容控件甚至可以綁定到文檔中嵌入的自定義XML部件中的節點,以便您可以編輯該XML文件,而不是Word文檔。在MSDN上有這樣的例子,以及MSDN和其他論壇中的討論。

+0

編輯XML文件效果很好,謝謝! –

0

正如其他人所建議的,您可以使用Open XML SDK來解析文檔,並通過創建自己的查找/替換引擎來對其進行修改,該引擎可以在Open XML SDK上運行。您還應該考慮使用標籤(內容控件,合併域,書籤)標記動態部分並創建搜索邏輯,以搜索這些標籤而不是文本。我會說Content Control是最好的選擇,因爲它們在設計模板文檔時是最容易解析和提供最佳用戶體驗的。如果你的預算允許,看看commercial .NET library這已經完全符合你的需求(可能還有更多)。