2013-07-23 269 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(); 

这应该剥离出来的非打印字符。