2013-07-23 538 views
1

我有一個程序讀取Microsoft Word 2010文檔,並將從每個表的第一列讀取的所有文本放入數據表中。但是,生成的文本還包含特殊的格式化字符(在原始Word文檔中通常不可見)。通過C#將純文本格式轉換爲純文本格式?

有沒有一種方法可以讀取我讀過的文本字符串,並從中刪除所有格式化字符?

該程序非常簡單,並使用Microsoft.Office.Interop.Word程序集。這裏是我從文件抓取文本主循環:

 // Loop through each table in the document, 
     // grab only text from cells in the first column 
     // in each table. 
     foreach (Table tb in docs.Tables) 
     { 
      for (int row = 1; row <= tb.Rows.Count; row++) 
      { 
       var cell = tb.Cell(row, 1); 
       var listNumber = cell.Range.ListFormat.ListString; 
       var text = listNumber + " " + cell.Range.Text; 

       dt.Rows.Add(text); 
      } 
     } 

編輯:這裏是文本(「1.導言」)看起來像在Word文檔中: enter image description here

這就是它看起來像在投入之前,我的數據表: enter image description here

這是個什麼樣子,當放到數據表所示:

enter image description here

所以,我想弄清楚一個簡單的方法來擺脫似乎出現的控制字符(\ r,\ a,\ n等)。

編輯:這是我正在嘗試使用的代碼。我創建了一個新的方法將字符串轉換:

private string ConvertToText(string rtf) 
    { 
     using (RichTextBox rtb = new RichTextBox()) 
     { 
      rtb.Rtf = rtf; 
      return rtb.Text; 
     } 
    } 

當我運行程序時,它的炸彈,出現以下錯誤: enter image description here

變量RTF,在這一點上,看起來是這樣的: enter image description here

解決方案:在將它們寫入數據表之前,我修剪了不需要的字符。

 // Loop through each table in the document, 
     // grab only text from cells in the first column 
     // in each table. 
     foreach (Table tb in docs.Tables) 
     { 
      for (int row = 1; row <= tb.Rows.Count; row++) 
      { 
       var charsToTrim = new[] { '\r', '\a', ' ' }; 
       var cell = tb.Cell(row, 1); 
       var listNumber = cell.Range.ListFormat.ListString; 
       var text = listNumber + " " + cell.Range.Text; 
       text = text.TrimEnd(charsToTrim); 
       dt.Rows.Add(text); 
      } 
     } 
+0

什麼字符你需要剝離? –

+0

根據[Range.Text]文檔(http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.range.text.ASPX),文本是* plain,無格式文本的選擇或範圍*,所以我不確定你在說什麼格式。 –

+0

http://stackoverflow.com/questions/188545/regular-expression-for-extracting-text-from-an-rtf-string – slfan

回答

1

替代方案可以是您需要在窗體中添加一個富文本框(如果您不想顯示該窗體,可以隱藏它)以及何時讀取所有數據,只需將其分配給richtextbox即可。像

//rtfText is rich text 
//rtBox is rich text box 
rtBox.Rtf = rtfText; 
//get simple text here. 
string plainText = rtBox.Text; 
+0

這將是偉大的,但當我試圖把字符串放入rtBox.Rtf時,我得到一個「無效的格式」。我正在研究爲什麼會發生這種情況。 – Kevin

+0

你能給出你的確切例外嗎? – Ehsan

+0

當然可以!我將它添加到上面的主要問題。 – Kevin

1

你爲什麼不試試這個:

using System; 
using System.Text.RegularExpressions; 

public class Example 
{ 
    static string CleanInput(string strIn) 
    { 
     // Replace invalid characters with empty strings. 
     try { 
      return Regex.Replace(strIn, @"[^\w\[email protected]]", "", 
           RegexOptions.None, TimeSpan.FromSeconds(1.5)); 
     } 
     // If we timeout when replacing invalid characters, 
     // we should return Empty. 
     catch (RegexMatchTimeoutException) { 
      return String.Empty; 
     } 
    } 
} 

下面是它的鏈接也是如此。

http://msdn.microsoft.com/en-us/library/844skk0h.aspx

+0

嘿,這似乎工作,但它似乎也刪除空格!如果我能弄清楚爲什麼它這樣做,這將起作用。 – Kevin

+0

嘗試刪除\ w。不是百分之百肯定這會解決你的問題,而只是試驗[]中的字符。 Goodluck :)並且不要忘記提供適合你的答案! (不一定是我的)哈哈 – trueamerican420

1

我不知道到底是什麼格式你想刪除,但你可以嘗試這樣的:

text = text.Where(c => !Char.IsControl(c)).ToString(); 

這應該剝離出來的非打印字符。