2016-07-28 1 views
0

У меня есть документ с большим текстом, который содержит некоторые заголовки. Эти заголовки имеют соответственно одну таблицу в качестве ребенка. (Изображен на скриншоте)Получить текст под пунктом программно

enter image description here

Поэтому я использовал библиотеку Microsoft Interop.Word. Мой код выглядит так. Как я могу получить детей в абзаце заголовка? Может быть, есть лучший способ сделать это.

Application word = new Application(); 
Document doc = new Document(); 
object missing = System.Type.Missing; 
doc = word.Documents.Open(ref m_FileName, 
     ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref missing); 

foreach (Paragraph paragraph in doc.Paragraphs) 
{ 
    Style style = paragraph.get_Style() as Style; 
    string text = paragraph.Range.Text; 
    paragraph.Range.Tables // does not get the table under the paragraph 
} 
+0

документа слово не иерархическая по своей внутренней структуре, а последовательность на уровне блоков элементы, такие как абзацы и таблицы, поэтому абзац заголовка не содержит таблицы. В вашем случае это означает, что вам нужно получить доступ к абзацу, следующему заголовку (или вы также можете просто перебрать все таблицы в документе с помощью 'doc . Таблицы') –

+0

В стороне: с .NET 4 вы можете написать свой код гораздо более компактным, нет необходимости указывать все отсутствующие параметры и использовать 'ref'. Вы можете просто написать:' word.Document.Open (m_FileName); ' –

+0

@dirk vollmar Но Мне нужен заголовок как ключ для таблицы. Должен быть способ сделать это. Или я ошибаюсь? –

ответ

0

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

Range r1 = doc.Content; 
Range r2 = doc.Content; 
r1.Find.Execute("Heading 1"); 
r2.Find.Execute("Heading 2"); 

Range chapter = doc.Range(r1.Start, r2.Start); 
//Console.WriteLine(chapter.Text); 

foreach (Table t in chapter.Tables) 
{ 
    foreach(Row r in t.Rows) 
    { 
     foreach (Cell c in r.Cells) 
     { 
      //Console.WriteLine(c.Range.Text); 
     } 
    } 
} 
+0

Это выглядит неплохо. Я об этом не думал. –

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

  • Нет связанных вопросов^_^