2

是否可以使用办公自动化从 MS Word 中的给定行号获取文本(行或句子)?我的意思是,如果我可以获得给定行号中的文本或作为该行一部分的句子本身,那就可以了。

我没有提供任何代码,因为我完全不知道如何使用办公自动化读取 MS Word。我可以像这样打开文件:

var wordApp = new ApplicationClass();
wordApp.Visible = false;
object file = path;
object misValue= Type.Missing; 
Word.Document doc = wordApp.Documents.Open(ref file, ref misValue, ref misValue,
                                           ref misValue, ref misValue, ref misValue,
                                           ref misValue, ref misValue, ref misValue,
                                           ref misValue, ref misValue, ref misValue);

//and rest of the code given I have a line number = 3 ?

编辑:澄清@Richard Marskell - Drackir 的疑问,虽然 MS Word 中的文本是一长串字符串,但办公自动化仍然让我们知道行号。实际上,我从另一段代码中获取了行号本身,如下所示:

Word.Revision rev = //SomeRevision
object lineNo = rev.Range.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);

例如说 Word 文件如下所示:

fix grammatical or spelling errors

clarify meaning without changing it correct minor mistakes add related resources or links
always respect the original author

这里有4行。

4

3 回答 3

4

幸运的是,经过一番史诗般的搜索,我找到了解决方案。

    object file = Path.GetDirectoryName(Application.ExecutablePath) + @"\Answer.doc";

    Word.Application wordObject = new Word.ApplicationClass();
    wordObject.Visible = false;

    object nullobject = Missing.Value;
    Word.Document docs = wordObject.Documents.Open
        (ref file, ref nullobject, ref nullobject, ref nullobject,
        ref nullobject, ref nullobject, ref nullobject, ref nullobject,
        ref nullobject, ref nullobject, ref nullobject, ref nullobject,
        ref nullobject, ref nullobject, ref nullobject, ref nullobject);

    String strLine;
    bool bolEOF = false;

    docs.Characters[1].Select();

    int index = 0;
    do
    {
        object unit = Word.WdUnits.wdLine;
        object count = 1;
        wordObject.Selection.MoveEnd(ref unit, ref count);

        strLine = wordObject.Selection.Text;
        richTextBox1.Text += ++index + " - " + strLine + "\r\n"; //for our understanding

        object direction = Word.WdCollapseDirection.wdCollapseEnd;
        wordObject.Selection.Collapse(ref direction);

        if (wordObject.Selection.Bookmarks.Exists(@"\EndOfDoc"))
            bolEOF = true;
    } while (!bolEOF);

    docs.Close(ref nullobject, ref nullobject, ref nullobject);
    wordObject.Quit(ref nullobject, ref nullobject, ref nullobject);
    docs = null;
    wordObject = null;

是代码背后的天才。请点击链接以获取有关其工作原理的更多说明。

于 2012-02-07T20:29:20.177 回答
1

如果您想读取标准文本 .txt 文件,请使用此选项 这是您可以使用一次调用读取文件的内容

List<string> strmsWord = 
    new List<string>(File.ReadAllLines(yourFilePath+ YourwordDocName));

如果您想循环并查看返回的项目使用类似这样的东西

 foreach (string strLines in strmsWord )
 {
   Console.WriteLine(strLines);
 }     

或者

我完全忘记了 Word 文档可能是二进制格式的内容,因此请查看此内容并将内容读入 RichTextBox,然后从那里您可以获取所需的行号或将其加载到单词之后的列表中。此链接将显示如果您 想阅读 Word 文档的 XML 格式,请从 Word Doc 中阅读:这里有一个很好的链接,用于结帐以及 ReadXML Format of a Word Document

这是一个更简单的例子 将内容读入剪贴板 将 字加载到剪贴板

于 2012-02-07T18:05:08.180 回答
0
var word = new Word.Application();
object miss = Missing.Value;
object path = @"D:\viewstate.docx";
object readOnly = true;
var docs = word.Documents.Open(ref path, ref miss, ref readOnly, ref miss, 
                               ref miss, ref miss, ref miss, ref miss, ref miss, 
                               ref miss, ref miss, ref miss, ref miss, ref miss, 
                               ref miss, ref miss);
string totaltext = "";

object unit = Word.WdUnits.wdLine;
object count = 1;
word.Selection.MoveEnd(ref unit, ref count);
totaltext = word.Selection.Text;

TextBox1.Text = totaltext;
docs.Close(ref miss, ref miss, ref miss);
word.Quit(ref miss, ref miss, ref miss);
docs = null;
word = null;
于 2013-02-07T10:03:11.513 回答