Как получить текст из номера строки в MS Word

Можно ли получить текст (строку или предложение) из заданного номера строки в 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 - сомнения Дракира, хотя текст в 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 строки.


person nawfal    schedule 07.02.2012    source источник
comment
Что считается новой линией? Например, это когда есть какой-то разрыв (строка, абзац, раздел и т.д.) или визуально, когда открываешь ворд и видишь страницу или что-то еще?   -  person Richard Marskell - Drackir    schedule 07.02.2012
comment
@RichardMarskell-Drackir Я ничего не говорил о новой линии. В MS Word каждая строка имеет номер строки. Даже пустая строка имеет номер строки. Если у меня есть номер строки int, можно ли получить саму строку?   -  person nawfal    schedule 07.02.2012
comment
Возможно, ему нужно посмотреть Range, проверить сайт MSDN msdn .microsoft.com/en-us/library/f1f367bx%28VS.80%29.aspx также, какой текст вы ищете, вы также можете выполнить поиск по слову, используя Microsoft.Interop msdn.microsoft.com/en-US/library/kw65a0we%28v =vs.80%29.aspx   -  person MethodMan    schedule 07.02.2012
comment
@DJKRAZE Мне не нужен поиск по словам. Я хочу, чтобы все, что есть в строке, скажем, 3. Я не знаю, что искать. Тем не менее, ваша ссылка дает некоторые идеи.   -  person nawfal    schedule 07.02.2012
comment
Мне кажется, что номера строк (и их содержимое) сильно зависят от полей документа, режима просмотра, размера шрифта и т. д. Возьмем, к примеру, если у вас есть абзац текста и вы переключаете режим просмотра на Web , или вы уменьшите размер шрифта, или измените ширину полей, все это изменит то, что вы видите в каждой строке. Возможно, я что-то упускаю, но мне кажется, что единственный способ выяснить, что находится в каждой строке, — это узнать, что на самом деле представляет собой строка.   -  person Richard Marskell - Drackir    schedule 07.02.2012
comment
если вам нужно, что находится в строке номер 3, почему бы не прочитать содержимое файла в строку List‹string› и получить позицию индекса List‹string› [2] этой переменной List‹T›. текстовый документ.. Я думаю, что этот вопрос нуждается в рефакторинге..   -  person MethodMan    schedule 07.02.2012
comment
@RichardMarskell-Drackir В приложении не имеет значения, какой размер шрифта используется для текста слова, или если другой размер шрифта изменит это. Просто хочу получить строку для текущего форматирования, соответствующую номеру строки.   -  person nawfal    schedule 07.02.2012
comment
@DJKRAZE точно, но как мне прочитать содержимое в список?   -  person nawfal    schedule 07.02.2012
comment
@DJKRAZE Вот почему я задаю свой вопрос. Я почти уверен, что в документе Word абзац хранится как длинная строка текста с разрывом абзаца в конце, а не как отдельные строки.   -  person Richard Marskell - Drackir    schedule 07.02.2012
comment
@nawfal Являются ли строки отдельными (разрывы между ними) или это абзацы текста (где одна строка текста может занимать несколько строк)?   -  person Richard Marskell - Drackir    schedule 07.02.2012
comment
Я думаю, что более медленный подход будет вашим лучшим выбором.. прочитайте каждую строку в List‹T› или Dictionary‹int,string[]›, который закончился kill, а затем, пока вы читаете до конца этого потока .. вы можете сказать что на линиях .. надеюсь, вы отлаживаете и проходите через это, чтобы вы могли видеть, какое содержимое возвращается. Мне было бы любопытно узнать, получаете ли вы то, что ожидаете, или думаете, что вы должны получать .. это полностью отличается для файла .TXT, надеюсь, вы знаете...   -  person MethodMan    schedule 07.02.2012
comment
Ниже я опубликую пример 1 строки кода, который будет считывать содержимое в List‹T›, вам решать написать код для проверки или циклического прохождения List‹T› после того, как я это сделаю.. достаточно честно   -  person MethodMan    schedule 07.02.2012
comment
@DJKRAZE Спасибо, с остальным я справлюсь.   -  person nawfal    schedule 07.02.2012
comment
@RichardMarskell-Drackir Дождитесь обновления в вопросе. Разрешите   -  person nawfal    schedule 07.02.2012
comment
не проблема, также причина, по которой мы задаем вопросы, заключается в том, что многие из нас здесь, чтобы помочь, и иногда трудно / трудно понять, чего на самом деле хочет ОП, не спрашивая, не пытаясь вызвать у ОП какое-либо разочарование. здесь много светлых умов, которые более чем готовы помочь тем, кто в затруднительном положении ... всем нам тоже когда-то приходилось начинать программировать ...   -  person MethodMan    schedule 07.02.2012
comment
@nawfal - Если бы третья строка пересекалась со следующей строкой, считалась бы она пятью строками или все же четырьмя, где одна пересекается?   -  person Richard Marskell - Drackir    schedule 07.02.2012
comment
Должно быть 5 строк. Вы можете проверить это с помощью приложения Word. Вы можете увидеть номер строки для каждой строки в документе. Проще говоря, та строка, которую Word естественным образом определяет как строку!   -  person nawfal    schedule 07.02.2012


Ответы (3)


К счастью, после эпических поисков я нашел решение.

    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;

Здесь это гений кода. Перейдите по ссылке, чтобы узнать больше о том, как это работает.

person nawfal    schedule 07.02.2012
comment
ваш wordObject = null, не будет избавляться от wordObject, который вам нужен для этого вместо System.Runtime.InteropServices.Marshal.ReleaseComObject(wordObject); - person MethodMan; 08.02.2012
comment
Вы так уверены? Я не получаю ни одного экземпляра "WINWORD" на панели задач, хотя я не использовал Marshal.ReleaseComObject - person nawfal; 08.02.2012
comment
хорошо подумайте о том, как вы выпускали COM-объекты в прошлом.. даже если это Interop, лучше всего использовать вызов Marshalling ReleaseComObject для освобождения объектов, это не то же самое, что в C# .net Objects.. проведите некоторое исследование, чтобы получить лучшее понимание .. плюс я знаю это из огромного опыта использования Microsoft.Office.Interop - person MethodMan; 08.02.2012
comment
@ РичардМарскелл-Дракир, спасибо. размер вашего имени помог мне опубликовать этот короткий комментарий :) - person nawfal; 08.02.2012

Используйте это, если вы хотите читать стандартные текстовые файлы .txt Вот то, что вы можете использовать для чтения файлов одним вызовом

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

если вы хотите просмотреть и посмотреть, какие элементы были возвращены, используйте что-то вроде этого

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

or

Я совсем забыл о чем-то, что документы Word, вероятно, в двоичном формате, поэтому посмотрите на это и прочитайте содержимое в RichTextBox, и оттуда вы можете либо получить номер строки, который хотите, либо загрузить его в список после слов. эта ссылка покажет вы Чтение из документа Word, если вы хотите прочитать XML-форматирование слова «Документ»: вот хорошая ссылка для оформления заказа Формат ReadXML документа Word

Это еще более простой пример чтения содержимого в буфер обмена. /а>

person MethodMan    schedule 07.02.2012
comment
Это будет работать только для текстовых документов. Новые документы Word хранятся в сжатом формате XML. - person Richard Marskell - Drackir; 07.02.2012
comment
Может быть, это должно помочь, учитывая, что моя цель - просто Word 2003. - person nawfal; 07.02.2012
comment
@nawfal На самом деле, я думаю, там еще хуже. Я не знаю формат, это может быть пользовательский двоичный формат. Попробуйте открыть его в блокноте, и вы увидите, что это далеко не простой текстовый файл. :( - person Richard Marskell - Drackir; 07.02.2012
comment
Я не думаю, что ваше новое редактирование будет работать по причинам, которые я указал в своем вопросе выше. В частности, форматирование, поля, вид и т. д. влияют на нумерацию строк. Это означает, что копирование их в текстовое поле также изменит их расположение. Тем более, что этот код, похоже, получает только текст из буфера обмена и ничего не форматирует (data.GetData(DataFormats.Text).ToString();). Хотя это ближе. - person Richard Marskell - Drackir; 07.02.2012
comment
На самом деле первый пример тоже не работает :( Список получает ряд строк, которые не соответствуют фактическому количеству строк. Но я думаю, что могу получить ответ, используя свойства диапазона и ревизии. - person nawfal; 07.02.2012
comment
@DJKRAZE Код копирования документов Word был на самом деле самым близким, я думаю, до сих пор. :П - person Richard Marskell - Drackir; 07.02.2012
comment
У меня все еще есть это, если вам нужно, чтобы я сделал репост - person MethodMan; 07.02.2012
comment
@RichardMarskell-Drackir Как это ближе? Он получает только цепочку длинных строк и ничего не связано с номером строки. - person nawfal; 07.02.2012
comment
Вы не можете получить номер строки, каждая строка сама по себе является номером строки.. nawfal Я полагаю, что у вас есть непонимание того, как читать строки/строку в тексте, он не будет явно говорить строку № 1 ....и т.д. вы следуете, если первая строка говорит 1. например, тогда вам придется выполнить поиск по слову, возможно, чтобы определить, на какой строке вы находитесь.. даже лучше искать 1. Я надеюсь, что это то, о чем вы говорите - person MethodMan; 08.02.2012
comment
Почему бы мне не получить строку из номера строки? Я разместил в вопросе, как я получаю номер строки каждой версии. Поэтому я подумал, почему бы мне не вернуть строку, если у меня изначально есть номер строки. Может я тебя не понял. Во всяком случае, у меня есть другое решение, которое я разместил в качестве ответа. - person nawfal; 08.02.2012

person    schedule
comment
дает ли это номер строки или что-то подобное? - person nawfal; 07.02.2013
comment
Возвращает текст строки в зависимости от номера строки - person shiba; 08.02.2013
comment
где я передаю номер строки? - person nawfal; 08.02.2013
comment
count - номер строки :) - person shiba; 11.02.2013
comment
о, хорошо, я не проверял себя, но давай, это именно то, что я разместил в качестве ответа. - person nawfal; 11.02.2013
comment
не забудьте добавить сборки microsoft.office.interop.word и System.Runtime.InteropServices.ComTypes; - person shiba; 11.02.2013