Получить текст над таблицей MS Word - PullRequest
7 голосов
/ 15 ноября 2011

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

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 15 ноября 2011

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

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 сработало. Похоже, так и должно быть, потому что это прямо перед столом, но с одним я получил странный специальный символ: , который выглядит как женский индикатор.

3 голосов
/ 15 ноября 2011

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

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
...