2011-11-15 4 views
6

Это, наверное, немного глупо, но мне это действительно нужно. У меня есть документ с 5 таблицами, в каждой таблице есть заголовок. Заголовок - это обычный текст без специального стиля, ничего. Мне нужно извлечь данные из этих таблиц + плюс заголовок. В настоящее время, используя MS Interop я смог перебирать каждую ячейку каждой таблицы, используя что-то вроде этого:Получить текст над таблицей MS Word

app.Tables[1].Cell(2, 2).Range.Text; 

Но теперь я изо всех сил на том, чтобы выяснить, как получить текст прямо над столом. Вот скриншот: enter image description here

Для первой таблицы мне нужно получить «мне это нужно TEXT» и secnd таблицы мне нужно получить: «И это один также, пожалуйста,»

Таким образом, в основном мне нужно в последний раз перед каждой таблицей. Любые предложения о том, как это сделать?

ответ

3

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

var tIndex = 1; 
var tCount = oDoc.Tables.Count; 
var tblData = oDoc.Tables[tIndex].Cell(1, 1).Range.Text; 
var pCount = oDoc.Paragraphs.Count; 
var prevPara = ""; 
for (var i = 1; i <= pCount; i++) { 
    var para = oDoc.Paragraphs[i]; 
    var paraData = para.Range.Text; 

    if (paraData == tblData) { 
     // this paragraph is at the beginning of the table, so grab previous paragraph 
     Console.WriteLine("Header: " + prevPara); 
     tIndex++; 
     if (tIndex <= tCount) 
      tblData = oDoc.Tables[tIndex].Cell(1, 1).Range.Text; 
     else 
      break; 
    } 
    prevPara = paraData; 
} 

Пример вывод:

Header: I NEED THIS TEXT 

Header: AND THIS ONE also please 
+0

Большое спасибо за помощь! Ваше решение дало мне представление о том, как это реализовать. Проведя некоторое время, я понял, как это сделать проще. Я отправлю это как ответ. – user194076

9

Mellamokb в своем ответе дал мне намек и хороший пример того, как искать в параграфах. Выполняя его решение, я столкнулся с функцией «Предыдущий», которая делает именно то, что нам нужно. Вот как это использовать:

wd.Tables[1].Cell(1, 1).Range.Previous(WdUnits.wdParagraph, 2).Text; 

Предыдущее принимает два параметра. Сначала - блок, который вы хотите найти из этого списка: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdunits.aspx , а второй параметр - сколько единиц вы хотите пересчитать. В моем случае 2 работал. Похоже, это должно быть, потому что это прямо перед столом, но с одним я получил странный особый характер: , который выглядит как женский индикатор.

+0

Я думал, что googling для «Как получить текст над таблицей в слове» будет совершенно бесполезным, но я был в отчаянии, и я попробовал. Это привело меня к решению. Благодаря! I C# с netoffice, вы хотите использовать метод previousSibling() в таблице. – user1815201

+0

Отличный ответ большое спасибо! –

+0

Ничего себе! действительно умный трюк, он отлично работает –

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

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