2012-02-07 3 views
1

Возможно ли получить текст (строку или предложение) из заданного номера строки в MS Word с помощью автоматизации делопроизводства? Я имею в виду его ok, если я могу получить либо текст в указанном номере строки, либо сам предложение (-ы), которое является частью этой строки.Как получить текст из номера строки в 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 ? 

Edit: Для того, чтобы уточнить @Richard Marskell - сомнение Drackir, хотя текст в MS Word является длинной цепочкой строки, автоматизация делопроизводства делает еще дайте нам знать номер строки. На самом деле я сам номер строки из другой части кода, как это:

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

Например говорят, что файл Слово выглядит следующим образом:

fix grammatical or spelling errors 

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

Здесь есть 4 строки.

+0

Что считается новой линией? Например, это когда есть какой-то разрыв (строка, абзац, раздел и т. Д.) Или визуально, когда вы открываете слово и видите «страницу» или что-то еще? –

+0

@ RichardMarskell-Drackir Я ничего не говорил о новой линии. В MS Word каждая строка имеет номер строки. Даже пустая строка имеет номер строки. Если у меня есть номер строки 'int', можно ли получить линию? – nawfal

+0

Возможно, ему нужно взглянуть на Range, где находится сайт MSDN http://msdn.microsoft.com/en-us/library/f1f367bx%28VS.80%29.aspx, также, какой именно текст вы ищете, вы также можете сделать поиск по словам также с использованием Microsoft.Interop http://msdn.microsoft.com/en-US/library/kw65a0we%28v=vs.80%29.aspx – MethodMan

ответ

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; 

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

+0

ваш wordObject = null, не будет избавляться от объекта wordObject, вам нужно сделать это вместо System.Runtime.InteropServices.Marshal.ReleaseComObject (wordObject); – MethodMan

+0

Вы уверены? Я не получаю экземпляр '' WINWORD '' на панели задач, хотя я не использовал Marshal.ReleaseComObject – nawfal

+0

хорошо подумал о том, как вы выпускаете COM-объекты в прошлом ... хотя это Interop, лучше всего использовать его Marshalling ReleaseComObject для вызова релиз объектов, это не то же самое, что и в объектах C# .net. Проведите некоторое исследование, чтобы получить лучшее понимание. Кроме того, я знаю это из тонны опыта при использовании Microsoft.Office.Interop – MethodMan

1

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

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

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

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

или

Я совершенно забыл о чем-то документы Word, вероятно, в двоичном формате, смотреть на т его и прочитать содержимое в RichTextBox, и оттуда вы можете либо получить нужный номер строки, либо загрузить его в список после слов .. эта ссылка покажет вам Reading from a Word Doc , если вы хотите прочитать XML-форматирование слова Документ: здесь хорошая ссылка, чтобы оформить и ReadXML Format of a Word Document

Это Onne является еще проще пример читает содержимое в буфер обмена Load Word into ClipBoard

+0

Это будет работать только для текстовых документов. Новые документы Word хранятся в сжатом формате XML. –

+0

Может быть, это должно помочь считать мою цель просто Word 2003 – nawfal

+0

@nawfal На самом деле, я думаю, что это еще хуже. Я не знаю формат, это может быть пользовательский двоичный формат. Попробуйте открыть его в блокноте, и вы увидите, что он нигде не находится рядом с простым текстовым файлом. :( –

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; 
+0

Это дает номер строки или что-то подобное? – nawfal

+0

Он возвращает текст строки в зависимости от номера строки – shiba

+0

, где я прохожу номер строки? – nawfal

Смежные вопросы