Как читать слово абзац построчно в C#? - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь прочитать содержание слова построчно. Но я столкнулся с проблемой. При попытке прочитать абзац. Если содержание абзаца многострочное. Я получаю одну строку внутри. Может ли кто-нибудь, пожалуйста, помогите мне в этом.

enter image description here

Ожидаемый результат:

Строка 1 -> TERM BHFKGBHFGFKJHGKJSHFKG АВС1 IOUTOYTIUYRUYTIREYTU B08

1015 * Line 2 -> NBHFBHDFGJDSBHKHDGFJGJGDJK 3993 JBHKJSFGSDKFJDGFJKDSBF3993 1019 * Line 3 -> JHBJKFHKJGDGFSFGB08 HGHGGFGFDGJFFFDSGFABC1 JJBVHGHDFTERM

Line 4 -> TERMBHFKGBHFGFKJHGKJSHFKG ABC1IOUTOYTIUYRUYTIREYTU B08NBHFBHDFGJDSBHKHDGFJGJGDJK

1027 * Line 5 -> 39931234567890987654321

Фактический выход:

1035 * Single Line -> TERM BHFKGBHFGFKJHGKJSHFKG АВС1 IOUTOYTIUYRUYTIREYTU B08 NBHFBHDFGJDSBHKHDGFJGJGDJK 3993 JBHKJSFGSDKFJDGFJKDSBF3993 JHBJKFHKJGDGFSFGB08 HGHGGFGFDGJFFFDSGFABC1 JJBVHGHDFTERM TERMBHFKGBHFGFKJHGKJSHFKG ABC1IOUTOYTIUYRUYTIREYTU B08NBHFBHDFGJDSBHKHDGFJGJGDJK 39931234567890987654321

Ниже мой пример кода: 1042 * Открыть Xml:

* 1 045 *

Office.Interop

               object nullobj = System.Reflection.Missing.Value;
                Word.Application app = new Word.Application();
                Word.Document doc = app.Documents.Open(FilePath, ref nullobj, FileAccess.Read,
                                                        ref nullobj, ref nullobj, ref nullobj,
                                                        ref nullobj, ref nullobj, ref nullobj,
                                                        ref nullobj, ref nullobj, ref nullobj,
                                                        ref nullobj, ref nullobj, ref nullobj);

                    foreach (Word.Paragraph paragraph in doc.Paragraphs)
                    {
                        var line = paragraph.Range.Text;
                    }

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Невозможно определить отдельные строки в закрытом файле. Линии генерируются динамически, когда документ открывается в 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;
0 голосов
/ 28 апреля 2020

В Word абзац представляет собой одну строку текста. Измените размер области печати (например, измените поля и / или размер страницы) или размер шрифта / точки, и текст будет соответственно переформатирован. Более того, поскольку Word использует активный драйвер принтера для оптимизации макета страницы, то, что существует в данной строке на одном компьютере, может не существовать в той же строке на другом компьютере.

Однако, в зависимости от ваших требований, вы можете использовать предопределенную закладку Word \ \ Line для перемещения между строками или свойство Rectangle.Lines.

...