Вопрос по c#, office-interop, .net, ms-word – Как читать абзацы и содержимое MS Word построчно

1

Я читаю документ Word в C # (3.5), используяMicrosoft.Office.Interop.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

stackoverflow.com/questions/10696591/…, Смотрите это для получения значений из таблицы gout
В дополнение к ответу, связанному с @gout, интерфейс Table взаимодействия Word содержит свойство Columns, которое очень похоже на свойство Rows, используемое в этой ссылке. Francesco Baruchelli

Ваш Ответ

2   ответа
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);
        }
2

Подход указан ниже.

1. Open the Word Document using 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
    }
  }
}
что это за "док" относится ?? пожалуйста, обновите ответ полностью с кодом.

Похожие вопросы