2012-06-13 4 views
1

Я читаю документ Word в C# (3.5), используя Microsoft.Office.Interop.Word. Чтение строки за строкой, разбиение строки на массив [] и обработка каждого слова строки и на основе некоторой бизнес-логики, заменяющей некоторые слова и после замены слов, заменяя полную строку на преобразованную строку.Как читать содержание абзаца и содержимого MS Word по строке

До сих пор все прекрасно работает.

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

Update


Использование автоматизации Office

1. Opening word file. 
2. Moving cursor to top of the document 
3. Selecting first line using (`wordApp.Selection.endKey`) and processing all words 
4. After processing the words replacing the selected line with the processed line. 
5. Using wordApp.Selection.MoveDown(ref lineCount, ref countPage, ref MISSING);  
    moving next line processed further. 

Проблема: 1. При чтении таблицы читается только первый столбец при использовании wordApp.Selection.endKey

Я хочу, чтобы обрабатывать все колонки данные. Есть ли способ определить, является ли контент абзацем или таблицей?

enter image description here

+2

http://stackoverflow.com/questions/10696591/retrieving-table-data-from-a-doc-file-using-c-sharp. См. Это для извлечения значений из таблицы – gout

+1

В дополнение к ответу, связанному с @gout, интерфейс таблицы Word interop содержит свойство Columns, которое очень похоже на свойство Rows, используемое в этой ссылке –

ответ

2

Я нашел обходной путь для того же. Подход указан ниже.

1. Открыть документ Word с помощью WordApp.Documents.Open()
2. Использование Selection.MoveDown, чтобы пересечь линию документов по линии
3. Пропуск содержимого ячеек таблицы
4. На последней обработки только таблицы документа

//Process all Paragraphs in the documents 
while (doc.ActiveWindow.Selection.Bookmarks.Exists(@"\EndOfDoc") == false) 
{ 
    doc.ActiveWindow.Selection.MoveDown(ref wdLine, ref wdCountOne, ref wdMove); 
    doc.ActiveWindow.Selection.HomeKey(ref wdLine, ref wdMove); 

    //Skiping table content 
    if (doc.ActiveWindow.Selection.get_Information(WdInformation.wdEndOfRangeColumnNumber).ToString() != "-1") 
    { 
    while (doc.ActiveWindow.Selection.get_Information(WdInformation.wdEndOfRangeColumnNumber).ToString() != "-1") 
    { 
     if (doc.ActiveWindow.Selection.Bookmarks.Exists(@"\EndOfDoc")) 
     break; 

     doc.ActiveWindow.Selection.MoveDown(ref wdLine, ref wdCountOne, ref wdMove); 
     doc.ActiveWindow.Selection.HomeKey(ref wdLine, ref wdMove); 
    } 
    doc.ActiveWindow.Selection.HomeKey(ref wdLine, ref wdMove); 
    } 

    doc.ActiveWindow.Selection.EndKey(ref wdLine, ref wdExtend); 
    currLine = doc.ActiveWindow.Selection.Text; 
} 

//Processing all tables in the documents 
for (int iCounter = 1; iCounter <= doc.Tables.Count; iCounter++) 
{ 
    foreach (Row aRow in doc.Tables[iCounter].Rows) 
    { 
    foreach (Cell aCell in aRow.Cells) 
    { 
     currLine = aCell.Range.Text; 
     //Process Line 
    } 
    } 
} 
+0

, что означает этот «doc»? любезно обновите ответ с полным кодом. –

4

Использование выбора для сканирования документа должно быть довольно дорогостоящим по производительности. Я хотел бы предложить следующий код:

 List<Word.Range> TablesRanges = new List<Word.Range>(); 

     wordApp = new Microsoft.Office.Interop.Word.Application(); 
     doc = wordApp.Documents.OpenNoRepairDialog(FileName: @"c:\AAAAA.docx", ConfirmConversions: false, ReadOnly: true, AddToRecentFiles: false, NoEncodingDialog: true); 


     for (int iCounter = 1; iCounter <= doc.Tables.Count; iCounter++) 
     { 
      Word.Range TRange = doc.Tables[iCounter].Range; 
      TablesRanges.Add(TRange); 
     } 

     Boolean bInTable; 
     for (int par = 1; par <= doc.Paragraphs.Count; par++) 
     { 
      bInTable = false; 
      Word.Range r = doc.Paragraphs[par].Range; 
      foreach (Word.Range range in TablesRanges) 
      { 
       if (r.Start >= range.Start && r.Start <= range.End) 
       { 
        Console.WriteLine("In Table - Paragraph number " + par.ToString() + ":" + r.Text); 
        bInTable = true; 
        break; 
       } 

      } 

      if (!bInTable) 
       Console.WriteLine("!!!!!! Not In Table - Paragraph number " + par.ToString() + ":" + r.Text); 
     } 
Смежные вопросы