Поскольку "линии" не являются объектами в объектной модели Word, из-за ее динамических алгоритмов компоновки c, к этому нужно подходить с помощью старой технологии WordBasi c, все еще встроенной в API. (WordBasi c работал на основе выборок, а не объектов, поэтому эта возможность присутствует в этих старых методах.)
В этом случае перечисление Word.WdInformation
предлагает параметры, которые работают с «строками» более конкретно для этой проблемы wdFirstCharacterLineNumber
.
В следующем примере кода содержится фрагмент кода, который вызывает IsParaOneLine
для указанного c абзаца документа.
IsParaOneLIne
дублирует абзац Range
пропустил два его дважды : один раз для начальной точки и один раз для конечной точки. Эти диапазоны затем свернуты до их начальной и конечной точек, соответственно, и определен номер строки. Если они совпадают, true
возвращается к вызывающему коду, в противном случае false
.
Примечания:
rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1);
перемещает конечную точку назад на один символ, потому что после свертывания до конца абзаца Range
, Range
находится в начале следующего абзаца. Это возвращает его к исходному абзацу.
В примере применяется стиль, а не «прямое форматирование». Вместо форматирования с выравниванием по центру и левому краю документа настоятельно рекомендуется использовать Styles . Если нет встроенного стиля с требуемым форматированием, создайте нужные стили. Если вы знакомы с CSS, вы знаете преимущества использования стилей. У Word есть еще одна причина: он значительно сокращает временные файлы, которые генерирует Word, так что у вас меньше шансов исчерпать память.
Word.Range rng = doc.Paragraphs[2].Range;
if (IsParaOneLine(rng))
{
rng.set_Style(Word.WdBuiltinStyle.wdStyleHeading1);
}
else
{
Debug.Print("Not one line");
}
public bool IsParaOneLine(Word.Range rng)
{
Word.Range rngStart = rng.Duplicate;
rngStart.Collapse(Word.WdCollapseDirection.wdCollapseStart);
Word.Range rngEnd = rng.Duplicate;
rngEnd.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1);
int posLineStart = (int) rngStart.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);
int posLineEnd = (int) rngEnd.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);
bool isSameLine = false;
if (posLineStart == posLineEnd)
isSameLine = true;
return isSameLine;
}