按行从Word文档中读取内容

19


我正在尝试使用C#读取Word文档。我能够获取所有文本,但我想要逐行读取,并将其存储在列表中并绑定到GridView上。目前我的代码仅返回一个项的列表,其中包含所有文本(而非按照期望的逐行读取)。我正在使用Microsoft.Office.Interop.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();

以上列出的是全部代码吗?我将在本周末开始一个项目,该项目将读取一个单词文件,然后取出所有双引号之间的代码并插入变量"A,",他说。然后我必须用"A,B"替换逗号后面的部分,以便作家可以对他的代码进行一些统计。我会把我的代码公开展示给大家。是否需要进行特殊的导入操作? - Doug Hauf
1
我会使用像DocX http://docx.codeplex.com这样的轻量级库。 - Hamdi
@Hamdi 谢谢,我之前不知道这个。我已经尝试过了,相比于Interop,它确实很简单易用。再次感谢。 - Bat_Programmer
1
在ASP.NET或其他服务器技术中使用Office Interop是一个可怕的想法。这些API是为桌面应用程序编写的,用于自动化Office(一套桌面应用程序)。服务器应用程序在许多方面都不同,因此在其中使用Office Interop是非常糟糕的想法。这也不受Microsoft支持,并且可能违反您的Office许可证。请参阅考虑在服务器端自动化Office时的注意事项 - John Saunders
3个回答

26

好的。我找到了解决方法这里


最终代码如下:

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();

在我的代码中,@ open 方法显示路径无效,并出现“COMException 未处理”的错误。 - Shyam Dixit
在ASP.NET或其他服务器技术中使用Office Interop是一个可怕的想法。这些API是为桌面应用程序编写的,用于自动化Office(一套桌面应用程序)。服务器应用程序在许多方面都不同,因此在其中使用Office Interop是非常糟糕的想法。这也不受Microsoft支持,并且可能违反您的Office许可证。请参阅考虑在服务器端自动化Office时的注意事项 - John Saunders

9
上面的代码是正确的,但是它太慢了。 我已经改进了代码,现在比上面那个要快得多。
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();

6

这样怎么样?从文档中获取所有单词,按照回车或更好的方式进行分割。然后转换成列表。

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

2
它是\r\a,但\r就可以了,不要用\n。 - thang
据我所知,\r\a表示表格单元格的结尾,而\r表示行的结尾。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接