Невозможно определить отдельные строки в закрытом файле. Линии генерируются динамически, когда документ открывается в Word, и когда «разрыв» строки зависит от многих факторов - от системного профиля к системному профилю это не обязательно одинаково. Поэтому необходимо использовать взаимодействие, а не Open XML, чтобы определить, где строки прерываются на экране .
Более того, объектная модель Word не предоставляет объекты "Line" для эта самая причина - нет «линии», только визуальное представление о том, как будет печататься страница, учитывая текущий драйвер принтера и версию Windows.
Единственная часть объектной модели Word, которая распознает "линии" - Selection
, так как это работает исключительно с тем, что отображается на экране.
Следующий код демонстрирует, как это можно сделать.
Во-первых, поскольку Selection
работает и это видно на экране, ScreenUpdating
отключен, чтобы уменьшить мерцание экрана и ускорить обработку. (Обратите внимание, что работа с выделениями обычно намного медленнее, чем при обработке других объектных моделей.)
При использовании ComputeStatistics
определяется количество строк в абзаце. Создается массив (вы также можете использовать список или что-то еще) для хранения строк. Диапазон абзаца «свернут» до начальной точки и выбран визуально.
Теперь строки в абзаце зациклены на основе количества строк. Выделение расширяется (MoveEnd
метод) на одну строку (опять же, перемещение по строкам доступно только выделению), а выделенный текст записывается в массив (или что-либо еще).
Наконец, обновление экрана снова включен.
wdApp.ScreenUpdating = false;
foreach (Word.Paragraph para in doc.Paragraphs)
{
Word.Range rng = para.Range;
int lNumLines = rng.ComputeStatistics(Word.WdStatistic.wdStatisticLines);
string[] aLines = new String[lNumLines];
rng.Collapse(Word.WdCollapseDirection.wdCollapseStart);
rng.Select();
for (int i = 0; i < lNumLines; i++)
{
wdApp.Selection.MoveEnd(Unit: Word.WdUnits.wdLine, Count: 1);
aLines[i] = wdApp.Selection.Text;
wdApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
}
for (int i = 0; i < aLines.Length; i++)
{
Debug.Print(aLines[i]);
}
}
wdApp.ScreenUpdating = true;