2013-09-01 84 views
11


我正在尝试使用C#读取word文档。我能够获取所有文本,但我希望能够将逐行读取存储在列表中并绑定到gridview。目前我的代码只返回一个包含所有文本的项目列表(不是按需要逐行显示)。我正在使用Microsoft.Office.Interop.Word库来读取文件。下面是我的代码,直到现在:从word文档逐行读取

Application word = new Application(); 
    Document doc = new Document(); 

    object fileName = path; 
    // Define an object to pass to the API for missing parameters 
    object missing = System.Type.Missing; 
    doc = word.Documents.Open(ref fileName, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing); 

    String read = string.Empty; 
    List<string> data = new List<string>(); 
    foreach (Range tmpRange in doc.StoryRanges) 
    { 
     //read += tmpRange.Text + "<br>"; 
     data.Add(tmpRange.Text); 
    } 
    ((_Document)doc).Close(); 
    ((_Application)word).Quit(); 

    GridView1.DataSource = data; 
    GridView1.DataBind(); 
+0

这是所有上面列出的代码。他说,我将在本周末开始一个项目,该项目将读取一个word文件,然后取出双重代码之间的所有代码并插入一个变量“A”。然后,我必须用逗号“B”代替逗号。B.对于想要对他的代码进行一些统计的作者。我会把我的代码放在所有人看到的。是否有任何特殊的进口必须完成? –

+1

我会使用像DocX http://docx.codeplex.com这样的轻量级库。 – Hamdi

+0

@哈米迪谢谢我不知道这件事。我已经尝试过了,它确实很简单,与Interop相反。再次感谢。 –

回答

17

好的。我找到了解决方案here


最终的代码如下:

Application word = new Application(); 
    Document doc = new Document(); 

    object fileName = path; 
    // Define an object to pass to the API for missing parameters 
    object missing = System.Type.Missing; 
    doc = word.Documents.Open(ref fileName, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing); 

    String read = string.Empty; 
    List<string> data = new List<string>(); 
    for (int i = 0; i < doc.Paragraphs.Count; i++) 
    { 
     string temp = doc.Paragraphs[i + 1].Range.Text.Trim(); 
     if (temp != string.Empty) 
      data.Add(temp); 
    } 
    ((_Document)doc).Close(); 
    ((_Application)word).Quit(); 

    GridView1.DataSource = data; 
    GridView1.DataBind(); 
+0

在我的代码@ open方法中显示该路径无效,并且某些'COMException未处理' –

+0

从ASP.NET或其他服务器技术使用Office Interop是一个可怕的想法。这些API被编写用于桌面应用程序,用于自动化Office(一套桌面应用程序)。服务器应用程序在许多方面有所不同,因此在其中使用Office Interop是非常非常糟糕的主意。它也不受Microsoft的支持,并可能违反您的Office许可证。请参阅[服务器端自动化Office的注意事项](http://support.microsoft.com/kb/257757) –

6

上面的代码是正确的,但它的速度太慢。 我改进了代码,比上面的代码快得多。

List<string> data = new List<string>(); 
Application app = new Application(); 
Document doc = app.Documents.Open(ref readFromPath); 

foreach (Paragraph objParagraph in doc.Paragraphs) 
    data.Add(objParagraph.Range.Text.Trim()); 

((_Document)doc).Close(); 
((_Application)app).Quit(); 
1

这个怎么样哟。获取文档中的所有单词,并将它们分成回归或任何更适合您的文字。然后转入列表

List<string> lines = doc.Content.Text.Split('\n').ToList(); 
+1

其\ r \ a,但\ r会执行,而不是\ n – thang