2016-01-10 206 views
-1

我很沮喪......我昨天花了一整天創建從SQL數據庫檢索的Word文檔的方法,搜索包含在<變量文件>,然後保存將該文檔轉換爲另一個SQL表。這真是太好了,當我完成錯誤時,我非常高興。一旦完成了所有事情,我將它推送到Web服務器上,並且在開發過程中我還很新,沒有意識到要使該方法在服務器上工作,Office必須安裝在服務器上。毫無疑問,這是不可能的。的OpenXML查找Word文檔中的變量,並取代它們

話雖這麼說,我已經找到一個替代解決我的問題。問題是,我從來沒有使用Open XML。

我需要搜索一個文件用於封閉在<字符串>。因此,如果應用程序在文檔中找到變量,它將用DateTime.Today.ToShortDateString()替換該變量。例如:

string filename = "C:\\Temp\\" + appNum + "_ReceiptOfApplicationLtr.docx"; 
if (File.Exists((string)filename)) 
{ 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filename, true)) 
    { 
     var body = wordDoc.MainDocumentPart.Document.Body; 
     foreach (var text in body.Descendants<Text>()) 
     { 
      if (text.Text == "<TodaysDate>") 
      { 
       text.Text = text.Text.Replace("<TodaysDate>", DateTime.Today.ToShortDateString()); 
      } 
     } 
     using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
     { 
      sw.Write(filename); 
     } 
    } 
} 

那麼當它搜索後裔文本,找到的第一個<,然後TodaysDate,終於>。問題在於它不會找到字符串<TodaysDate>。誰能幫我嗎?

回答

0

的問題是,你有「<」,「TodaysDate」和「>」是分隔的文本的。我不知道這個原因,但它可能更糟糕 - 你的文本的一部分可以在不同的運行。所以解析它並不容易。好消息是它已經解決了 - here是文章,它很好地解釋了這個問題,並且有一些正在替換的代碼。

+0

是啊,我運行到這個問題現在。我在文檔中設定的變量之一被分解爲不同的運行。它抓住第一個<作爲一個單一的運行,然後TodaysD,然後吃,然後>。這令人沮喪。 – Kramb

+0

@Kramb爲何沮喪?我檢查了該文章的代碼,它工作正常。 –

0

的Open XML可以存儲相同的運行中在不同text標籤文本。如果我是你只是尋找到你的字符串存儲在Run和使用InnerText屬性查找運行中的所有文字,我會做什麼。 例如:

Run runToFind = body.Descendants<Run>() 
        .FirstOrDefault(r => r.Innertext.Contains("<TodaysDate>"); 

然後你就可以更換Run與另一個問題:

runToFind.Parent.Replace(new Run(new Text(DateTime.Now.ToShortDateString())),runToFind); 
相關問題