Смекни!
smekni.com

Delphi: работа с MS WORD (стр. 4 из 4)

WordDocument1.Tables.Item(i).Cell(j,k).Select;

WordDocument1.Tables.Item(i).Columns.Item(j).Select;

WordDocument1.Tables.Item(i).Rows.Item(j).Select;

Кроме того, можем подогнать размеры ячеек по содержимому. Для этого вызываем метод AutoFit:

WordDocument1.Tables.Item(i).Columns.AutoFit;

Добавить строку или столбец также не представляет сложностей:

WordDocument1.Tables.Item(i).Columns.Add(EmptyParam);

WordDocument1.Tables.Item(i).Rows.Add(EmptyParam);

var i, j: Integer;

varcol: OleVariant;

...

j:=2;

varcol:=WordDocument1.Tables.Item(i).Columns.Item(j);

WordDocument1.Tables.Item(i).Columns.Add(varcol);

Совершенно аналогично поступаем и со строками. Вообще в скобках указаны строка или столбец, перед которыми происходит вставка. Однако явно указать в скобках почему-то нельзя, надо через переменную.

Теперь про объединение ячеек. Довольно просто:

WordDocument1.Tables.Item(i).Cell(j,k).Merge(WordDocument1.Tables.Item(i).Cell(j,k+1));

Мы объединили две соседние по горизонтали ячейки (j,k) и (j,k+1). При этом получается, что большая ячейка как бы имеет два "адреса". Аналогично надо действовать и при объединении по вертикали. Все точно так же, но с нумерацией ячеек после объединения двух соседних по вертикали начинается путаница и при попытке заполнить таблицу возникают ошибки. Теперьразобьемячейки.

varrow:=1;

varcol:=2;

WordDocument1.Tables.Item(i).Cell(j,k).Split(varrow, varcol);

Здесь мы разбили ячейку (j,k) на две по горизонтали. Переменные varcol и varrow типа OleVariant, это количество столбцов и строк, на которые разбивается данная ячейка. Здесь снова с нумерацией начинается чехарда, так что этот вопрос разбиения и объединения ячеек представляет скорее чисто теоретический интерес. В таких случаях лучше заранее приготовить шаблоны.

Теперь для примера удалим из таблицы второй столбец или третью строку:

WordDocument1.Tables.Item(i).Columns.Item(2).Delete;

WordDocument1.Tables.Item(i).Rows.Item(3).Delete;

Внешний вид таблицы

Простейшая таблица, конечно, смотрится не очень. Теперь посмотрим, как мы можем ее приукрасить. При желании все сделать посимпатичнее можем использовать текстуру. Выглядеть это будет так:

WordDocument1.Tables.Item(i).Cell(j,k).Shading.Texture:=wdTexture20Percent;

Совершенно аналогично можем сделать текстуру в целом столбце или строке:

WordDocument1.Tables.Item(i).Columns.Item(j).Shading.Texture:=wdTexture20Percent;

WordDocument1.Tables.Item(i).Rows.Item(j).Shading.Texture:=wdTexture20Percent;

Текстура задается шестнадцатеричной константой, список констант можно найти заголовочном файле Word2000.pas. Можно их использовать как в шестнадцатеричном, так и в символьном виде. Чтобы не загромождать материал, значения констант будут выноситься в "Приложение" в конце статьи. Сразу оговорюсь, что заливка будет черно-белая или в шкале серого. Заливку определенным цветом пока так и не удалось обнаружить. Самая первая константа означает отсутствие заливки. Ее можно использовать, чтобы отменить текстуру.
Чтобы выделить что-нибудь важное, можем изменить шрифт текста в определенной ячейке. Дляэтоговоспользуемсясвойствамиобъекта Selection:

WordDocument1.Tables.Item(i).Cell(1,2).Select;

WordApplication1.Selection.Font.Color:=clRed;

WordApplication1.Selection.Font.Italic:=1;

WordApplication1.Selection.Font.Size:=16;

В данном примере мы сделали цвет текста в ячейке (1,2) красным, выделили его курсивом и изменили размер на 16. Кроме того, можем сделать шрифт подчеркнутым, перечеркнутым и т.п.

Еще один способ изменить внешний вид таблицы - использовать стилевые шаблоны Word'a. У таблицы имеется метод AutoFormat, который меняет внешний вид таблицы в соответствии с некими предопределенными стилями. В заголовочном файле он описан следующим образом:

procedure AutoFormat(var Format: OleVariant; var ApplyBorders: OleVariant;

var ApplyShading: OleVariant; var ApplyFont: OleVariant;

var ApplyColor: OleVariant; var ApplyHeadingRows: OleVariant;

var ApplyLastRow: OleVariant; var ApplyFirstColumn: OleVariant;

var ApplyLastColumn: OleVariant; var AutoFit: OleVariant);

Первый параметр представляет из себя собственно константу, задающую стиль, а остальные показывают, будут ли требования нового стиля применяться конкретно к границам, тени, шрифту, цвету, первой строке, последней строке, первому столбцу и последнему столбцу. Последний параметр в списке указывает, надо ли подгонять размер ячеек по их содержимому - лучше самому потом вызвать AutoFit.

Как показала практика, работают только два первых параметра. Все остальные заменяем "пустышками". То есть это скорее будет просто способ изменения стиля границ, но и на том спасибо. Некоторые стили таблиц даны в приложении, полный же список ищите в заголовочном файле. Для примера применим к нашей таблице стиль "Вэб3". Вместо второго параметра ставим вариантную переменную, которой присваиваем wdTableFormatApplyBorders. То есть на практике это выглядит так:

var tformat, tappbrd: OleVariant;

...

tformat:=wdTableFormatWeb3;

tappbrd:=wdTableFormatApplyBorders;

i:=1;

WordDocument1.Tables.Item(i).AutoFormat(tformat, tappbrd, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,

EmptyParam, EmptyParam, EmptyParam);

И еще об одном способе создания таблиц

Людям, интересующимся работой с MS Word, возможно, тоже попадались в интернете компоненты, превращающие в таблицу соответствующим образом отформатированный текст. Вот мы как раз и разберемся, как же они устроены. Здесь нам опять надо вспомнить про объект Range, а именно про имеющийся у него метод ConvertToTable. Взаголовочномфайлеэтовыглядиттак:

function ConvertToTable(var Separator: OleVariant; var NumRows: OleVariant;

var NumColumns: OleVariant; var InitialColumnWidth: OleVariant;

var Format: OleVariant; var ApplyBorders: OleVariant;

var ApplyShading: OleVariant; var ApplyFont: OleVariant;

var ApplyColor: OleVariant; var ApplyHeadingRows: OleVariant;

var ApplyLastRow: OleVariant; var ApplyFirstColumn: OleVariant;

var ApplyLastColumn: OleVariant; var AutoFit: OleVariant;

var AutoFitBehavior: OleVariant; var DefaultTableBehavior: OleVariant)

Здесь опять видим все те же константы применения стиля, что и в автоформате. Только в отличие от него тут они ошибок не вызывают. Правда, есть у меня жуткое подозрение, что они все равно не работают и можем со спокойной совестью поставить вместо них "пустышки" - всех, кроме опять-таки, первых двух параметров "применения изменений". Теперь по порядку. Первый параметр у нас задает символ, которым будут отделяться ячейки одной строки нашей будущей таблицы, второй - число строк таблицы, третий - число столбцов, затем идет ширина столбцов. Следующая группа параметров задает стиль таблицы и особенности его применения, необходимые значения констант есть в таблице "Приложения". Последние три параметра задают подгонку размера ячеек по содержимому, но на самом деле не работают. Так что ставим вместо них EmptyParam. И, наконец, практический пример. Предположим, мы открыли новый документ и занесли в него нужный текст:

WordDocument1.Range.InsertAfter('column1');

WordDocument1.Range.InsertAfter(#9);

WordDocument1.Range.InsertAfter('column2');

WordDocument1.Range.InsertAfter(#9);

WordDocument1.Range.InsertAfter('column3');

WordDocument1.Range.InsertAfter(#9);

WordDocument1.Range.InsertAfter('column4');

WordDocument1.Range.InsertAfter(#13);

Такую операцию повторим трижды, и у нас будет заготовка для таблицы на 4 столбца и 3 строки. Будущие столбцы отделяются символами табуляции, а строки - переходами на новую строку. Теперь выделяем объект Range - в данном случае это весь текст документа, и превращаем его в таблицу:

var tsepar, tnumrows, tnumcols, tincolw, tformat,

tappbrd, tappshd, tappfnt, tappclr, tapphr, tapplr,

tappfc, tapplc: OleVariant;

...

tsepar:=wdSeparateByTabs;

tnumrows:=3;

tnumcols:=4;

tincolw:=150;

tformat:=wdTableFormatNone;

tappbrd:=wdTableFormatApplyBorders;

tappshd:=wdTableFormatApplyShading;

tappfnt:=wdTableFormatApplyFont;

tappclr:=wdTableFormatApplyColor;

tapphr:=wdTableFormatApplyHeadingRows;

tapplr:=wdTableFormatApplyLastRow;

tappfc:=wdTableFormatApplyFirstColumn;

tapplc:=wdTableFormatApplyLastColumn;

WordDocument1.Range.ConvertToTable(tsepar, tnumrows, tnumcols, tincolw, tformat,

tappbrd, tappshd, tappfnt, tappclr, tapphr, tapplr,

tappfc, tapplc, EmptyParam, EmptyParam, EmptyParam);

В общем-то, мы можем задавать только первые шесть параметров, а все остальные заменить на "пустышки". Единственное, что здесь новенькое, это параметр "разделителя". В данном случае в качестве разделителя будет использоваться символ табуляции. Другие варианты смотрите в последней таблице "Приложения", но мне кажется, особой практической пользы от них нет.
Проделав все это, обнаруживаем, что наш текст превратился в таблицу. Все это несколько напоминает создание таблиц в HTML.

Приложения

Список некоторых констант. Смотрите файл Word2000.pas