2016-10-17 73 views
1

編輯: 現在的問題已解決,它是有名爲'名稱',我不小心改變的XML代碼。該解決方案是在DOCX文件當使用打開的XML我的文件損壞


我創建使用的Open XML,但每次程序運行該文件得到腐敗,我不知道是什麼原因或時間修改word文檔的程序有一個不起眼的名字如果有任何解決方法呢?

我有一看,有一件事我看到的是太確保我已經關閉了連接,但我想,但我不知道,如果連接仍然打開

編輯:

的輸出文件說,腐敗的,但是當在MS Word恢復運行這些文件是理所應當的

從圖像

/代碼 的原始文件被複制到temp.docx和文件中有「名」

我需要用另一個詞取代「名字」的程序。

該程序是半工作的,因爲它改變了文檔的值,但它正在破壞文檔。

鏈接的照片:https://drive.google.com/open?id=0B130JvN0ZPPRODJpZWZENTNUX0E

CODE

private void gen_btn_Click(object sender, EventArgs e) 
    { 

     if (System.IO.File.Exists(@"C:\invoices\temp.docx")) 
     { 
      // Use a try block to catch IOExceptions, to 
      // handle the case of the file already being 
      // opened by another process. 
      try 
      { 
       System.IO.File.Delete(@"C:\invoices\temp.docx"); 
      } 
      catch (System.IO.IOException exception) 
      { 
       Console.WriteLine(exception.Message); 
       return; 
      } 
     } 
     File.Copy(@"C:\invoices\template.docx", @"C:\invoices\temp.docx"); 
     SearchAndReplace("name", "asdsadsadasdasdas"); 
    } 

    public static void SearchAndReplace(string wordtoreplace, string replace) 

    { 
     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"C:\invoices\temp.docx", true)) 
     { 
      string docText = null; 
      using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
      { 
       docText = sr.ReadToEnd(); 
      } 

      //Regex regexText = new Regex(wordtoreplace); 
      docText = docText.Replace(wordtoreplace, replace); 

      using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
      { 
       sw.Write(docText); 

      } 
      wordDoc.Close(); 


     } 
    } 
+1

'該文件被損壞了 - 如何?你似乎很少會找到和替換,你確定你不是通過更換一個不好的價值來腐蝕它嗎?什麼是你的輸入,你想要的輸出是什麼,你的實際輸出是什麼?由於缺乏細節而投票結束。 –

+0

你能否提供更多關於你正在使用的文件的細節,其顯示.docx文件,而不是你可能需要使用xml文件? –

+0

嗨,我編輯我的文章鏈接到我的文檔照片。希望它能更好地瞭解我的問題。 – R1CH101

回答

0

的問題是要打開的文件流是一個XML文檔。它包含的內容遠遠多於文檔中輸入的單詞。有一些名爲「name」的XML屬性正在被您的代碼取代,這使得文檔不再能夠針對該模式進行驗證。

如果您使用更多獨特術語,則可以繼續進行純文本替換。例如,如果您的搜索字詞是「asdf」,那麼替換就會很安全,因爲該值不會出現在XML模式中。

要正確執行此操作,您需要解析XML文檔。包含實際文本的XML元素被命名爲「w:t」。如果循環遍歷所有「w:t」XML元素,則可以對其「InnerText」值進行純文本替換。這將保證您的XML將保持有效。

請注意,如果您嘗試直接解析XML,那麼您仍然會遇到問題...如果您鍵入您的標記文本(本例中爲「name」),則在中間應用某種格式(如粗體)的單詞,你將不再能夠在單個「w:t」元素中找到「名稱」。通過應用格式,文本「名稱」將被分解爲多個「w:t」元素。爲了在我的項目中實現這一點,我申請了一箇中間步驟,在搜索令牌之前合併「w:t」元素。這裏的訣竅是知道何時由於格式化差異而無法合併元素。

+0

謝謝,我將文件中的文本名稱更改爲'name123456789asd'並且它工作正常。 :) – R1CH101

+0

*改變(語法錯誤) – R1CH101

相關問題