Delphi word ширина столбца
Как создать таблицу в Word'е? Так же просто, как это делается в обычном объектно-ориентированном языке. В объекте Document мы имеем коллекцию Tables, с помощью методов и объектов которой можем создать таблицу и получить доступ к ее свойствам, ячейкам и тексту в ячейках. Если в нашем отчете несколько таблиц, то к любой из них мы имеем доступ с помощью коллекции Tables и индекса таблицы.
Чтобы более ясно представить процесс создания таблицы, используя объектные модели MS Office, создадим документ, аналог которого после простой доработки можно будет использовать в своих программах для вывода информации. Одним из самых распространенных отчетов, содержащих таблицу, является документ типа "Прайс-лист". Его мы и будем создавать. Попробуем создать его без шаблона, т.е. с чистого листа. Определимся, каким набором функций нужно владеть для создания этого документа. Во-первых, нам нужна будет функция создания таблицы, затем потребуется задать(изменить) размеры этой таблицы, вписать данные в ячейки, объединить ячейки. Возможно, потребуется еще несколько вспомогательных функций. Творчески используя материал статьи, вы сможете сами определить и создать для себя еще несколько функций для работы с таблицами.
Определим функцию создания таблицы CreateTable. Так как количество таблиц в документе может быть больше одной, то для идентификации каждой таблицы используем ее номер. Для создания применим метод ADD коллекции Tables. Метод ADD имеет аргументы: область, где создается таблица, количество строк и количество столбцов. Наша функция будет создавать таблицу там, где расположен курсор, и иметь еще один аргумент: числовую переменную, через которую будет возвращаться порядковое значение(индекс) таблицы в документе. Функция выглядит следующим образом:
Function CreateTable(NumRows, NumColumns:integer;
var index :integer):boolean;
var sel_:variant;
W.ActiveDocument.Tables.Add (Range:=sel_.Range,NumRows: =NumRows,
index :=W.ActiveDocument. Tables.Count;
Первый оператор определяет область выделения или положения курсора, второй оператор создает таблицу и третий возвращает количество таблиц в документе или порядковый номер вновь созданной таблицы, который будет использоваться другими функциями для доступа к этой таблице.
Наша функция создаст таблицу произвольного размера, но для корректного представления данных необходимо задать определенные размеры строк и столбцов. Чтобы задать размер таблицы или строки(столбца), нужно получить доступ к таким свойствам таблицы, как коллекции Columns и Rows (список столбцов и строк), через которые сможем получить доступ к конкретной строке или(и) столбцу, к ячейкам и к параметрам ячейки(строки, столбца). Для этого используем объект ActiveDocument.Tables.Item(table), где table - номер таблицы в документе. Создадим функцию, которая будет задавать ширину и высоту всех ячеек таблицы.
Function SetSizeTable(Table:integer; RowsHeight,
Аналогично мы можем задавать высоту любой строки или(и) ширину любого столбца на выбор. Для доступа к размерам ячейки используем также коллекции Rows, Columns объекта Table. Чтобы воспользоваться этими возможностями из нашего приложения, создадим следующие функции.
Function SetHeightRowTable(Table,Row:integer;
Function SetWidthColumnTable(Table,Column: integer;
Возможно, нам придется не только задавать размеры таблицы, но и определять(считывать) размеры ячеек таблицы. Для этого используем те же коллекции, объекты и свойства таблицы, что и в функции SetSizeTable, но немного изменим внутренние операторы таким образом, что в возвращаемые переменные RowsHeight и ColumnsWidth будут записываться значения размеров строк и столбцов таблицы.
Function GetSizeTable(Table:integer; var RowsHeight,
Также можно считать и размеры строки или столбца на выбор, для этого достаточно использовать коллекции Rows, Columns объекта Table (Tables.Item(Table)).
Следующим этапом формирования табличного документа определим запись текстовой информации в выбранную ячейку таблицы. Одним из способов такой записи является доступ к полю Text ячейки, но и в этом случае текст записывается не напрямую, а в объект Range ячейки таблицы. Функция SetTextToTable выполняет такую запись.
Function SetTextToTable(Table:integer;Row, Column:integer;
text: string ):boolean;
И последнее действие, которое необходимо произвести над таблицей для создания простого табличного документа, это объединение ячеек. Для этого воспользуемся методом Merge объекта Cell (ячейка). Первый оператор функции объединения ячеек возвращает указатель на объект - конечную ячейку (Cel). Второй оператор объединяет начальную ячейку Row1,Column1 с конечной ячейкой, табличные координаты которой уже заданы и равны Row2,Column2.
Function SetMergeCellsTable(Table:integer;Row1,
var Cel:variant;
Переходим к заключительной стадии - созданию документа.
Для этого все определенные в этой части статьи функции объединим с ранее созданными и перенесем во вновь созданную библиотеку процедур и функций. Например, это будет файл MyWord.pas, в разделе interface которого будут описаны заголовки всех наших функций, а в разделе implementation - сами функции (в дальнейшем будем пользоваться этой библиотекой). Не забудьте после implementation вставить строки uses ComObj; var W:variant;.
Создадим новый проект, в программном модуле которого сделаем ссылку на нашу библиотеку uses MyWord;. На форме разместим кнопку и в процедуру обработки нажатия ее впишем следующий программный код.
procedure TForm1.Button1Click(Sender: TObject);
var tablica_:integer;
if CreateWord then begin
If AddDoc then begin
// c создаем таблицу
If CreateTable( 5 , 3 ,tablica_) then begin
Messagebox( 0 ,pchar( ' Таблица создана =' +inttostr(tablica_)), '' , 0 );
// изменяем размеры таблицы
SetSizeTable(tablica_, 25 , 37 );
SetWidthColumnTable(tablica_, 1 , 300 );
SetWidthColumnTable(tablica_, 2 , 80 );
SetWidthColumnTable(tablica_, 3 , 80 );
Messagebox( 0 , 'Размер таблицы изменен' , '' , 0 );
// записывает информацию в ячейки таблицы
SetTextToTable(tablica_, 1 , 1 ,
'ПРОЦЕССОРЫ (данные от 27.05.2003) ' );
SetTextToTable(tablica_, 2 , 1 , 'Наименование' );
SetTextToTable(tablica_, 2 , 2 , ' Стоимость ' );
SetTextToTable(tablica_, 2 , 3 , ' Гарантия ' );
SetTextToTable(tablica_, 3 , 1 ,
' ПРОЦЕССОР AMD K7- 1333 ATHLON 266MHz (Socket-A)' );
SetTextToTable(tablica_, 3 , 2 , '47.52 $' );
SetTextToTable(tablica_, 3 , 3 , '12 мес .' );
SetTextToTable(tablica_, 4 , 1 ,
' ПРОЦЕССОР AMD K7- 800 DURON (Socket-A)' );
SetTextToTable(tablica_, 4 , 2 , '23.54 $' );
SetTextToTable(tablica_, 4 , 3 , '12 мес .' );
// объединяем необходимые ячейки таблицы
SetMergeCellsTable(tablica_, 1 , 1 , 1 , 3 );
Messagebox( 0 , ' Текст сохранен ' , '' , 0 );
Messagebox( 0 , ' Текст закрыт ' , '' , 0 );
В результате выполнения приведенной выше процедуры получим результат, который выглядит, как показано на рисунке.
Мы сформировали достаточно простую таблицу, но редактор Word позволяет создавать очень сложные документы (см. как пример бланки налоговых деклараций). Практика показывает, что для таких документов лучше использовать шаблоны, которые можно заполнять информацией из программы. Причем такие шаблоны не обязательно создавать самому, они есть в любых правовых справочных системах. В следующей части статьи будет рассмотрен пример создания сложного документа, который сочетает заполнение шаблона и заполнение таблицы переменной длины, для этого понадобится ряд дополнительных функций, которыми будет дополнена наша библиотека.
Василий КОРНЯКОВ
Литература: Н. Елманова, С. Трепалин, А.Тенцер "Delphi 6 и технология COM" "Питер" 2002.
Вождь, сейчас вопрос не по XML. Вот в справке по команде SetWidth написано для параметра RulerStyle:=wdAdjustFirstColumn:Adjusts the left edge of the first column only, preserving the positions of the other columns and the right edge of the table. |
Я так перевёл с помощью переводчика из программы Word (переводчик работает через интернет):
Регулирует левый край первого столбца, сохраняя позиции других столбцов и правый край таблицы.
Регулируется же правый край столбца, а не левый. Ошибка в справке или я не понимаю?
Вождь: Переименуйте "Файл.docx" в "Файл.docx.zip", распакуйте, и посмотрите. |
- Width
- PreferredWidth
- SetWidth
Прежде, чем выбрать, каким инструментом изменять ширину ячейки, протестируйте все три инструмента на скорость. Может какой-то инструмент будет быстрее работать.
Параметр RulerStyle команды SetWidth
Ширина строки изменяется только при использовании "wdAdjustNone".
wdAdjustFirstColumn - Изменяется ширина изменяемой ячейки и ячейки справа.
Аналогичное действие в программе “Word”: перемещение вертикальной границы ячейки левой кнопкой мыши.
wdAdjustNone - Изменяется ширина изменяемой ячейки.
Аналогичное действие в программе “Word”: выделить ячейку, переместить вертикальную границу ячейки левой кнопкой мыши.
wdAdjustProportional - Изменяется ширина всех ячеек в строке. Ширина ячеек, кроме ячейки, в которой меняем ширину, изменяется в соответствии с шириной ячеек.
Аналогичного действия в программе “Word” нет.
wdAdjustSameWidth - Изменяется ширина всех ячеек в строке. Ширина во всех ячейках, кроме ячейки, в которой меняем ширину, становится одинаковой.
Аналогичного действия в программе “Word”нет.
Слово "возвращает" не отображает смысла, какой имеет это слово в русском языке. В программировании означает "даёт результат", "даёт информацию".
Каждый, наверное, хоть раз сталкивался с необходимостью выдачи отчета. В Delphi имеются для этого специальные компоненты, но они налагают на нас достаточно строгие ограничения на форму представления данных. Одним из выходов может служить использование программы MS Word. Здесь не будем подробно обсуждать простейший вопрос, как открыть документ и добавить в него нужную строку текста, это есть практически в каждом учебнике по Delphi, приведем только самые необходимые сведения. А из литературы на эту тему особенно рекомендуется найти книжку А.Я. Архангельского "Язык SQL в Delphi 5". Но что может придать отчету такую читабельность, как представление результатов в систематизированном табличном виде? В данной статье и обсуждается вопрос программной работы с таблицами документа Word.
Тут могут быть два пути. Первый - если мы знаем заранее структуру данных отчета, можем приготовить шаблон, куда в ячейки таблицы затем просто занесем нужные данные. И второй - создаем отчет с нуля, рисуем в документе таблицу, заполняем ее. При этом мы можем программно добавить или удалить строки и столбцы, объединить или разбить ячейки - почти все, что мы делаем в самом Word'e. Все, что понадобится - компоненты WordApplication и WordDocument с палитры Servers
Теперь все по порядку - открываем файл и приступаем. Предварительно объявляем переменную FileName, типа OleVariant, которой присваиваем строку с именем файла.
Обратите внимание на количество параметров - "пустышек". Их число не совпадает с тем, что обычно приводится в книжках. Объясняется это тем, что "книжная" функция предназначена для MS Word 97, а такая запись для Word 2000 и Word XP.
Создание нового документа выглядит проще: Здесь также ставим на пару "пустышек" больше - по тем же самым причинам. Кроме того, полезно будет сразу же отключить проверку орфографии, чтобы Word не тратил время понапрасну: По окончании работы нам надо сохранить или распечатать наш отчет: где переменная в скобках типа OleVariant , ей присваиваем строку с именем файла.
В документе нас пока больше всего интересует объект Range, который нам понадобится при создании таблицы. Он представляет из себя кусок текста, который может включать в себя как весь текст документа, так и любую его часть. То есть: Первый наш объект включает в себя весь текст документа, у второго мы ограничили пределы 5-м и 15-м символами, третий представляет из себя весь последующий текст документа, начиная с 5-го символа. Объект имеет несколько полезных методов, например, с его помощью можем добавить текст в документ: Это мы вставили текст после выделенного Range . Точно также можем вставить текст и перед ним, для этого служит метод InsertBefore() . Текст, заключенный в объекте Range , можем получить так: Кроме того, с помощью Range можем изменить шрифт в пределах объекта. Пример: Если хотим отменить выделение жирным шрифтом, присваиваем 0. Аналогично можно сделать шрифт курсивом, подчеркнутым - наберите WordDocument1.Range.Font., и среда сама подскажет, какие могут быть варианты. Методы Select, Cut, Copy и Paste работают как в обычном тексте. С помощью Paste можем на место выбранного Range вставить не только строки, но и рисунок, находящийся в буфере обмена.
Т а б л и ц ы
Таблицы в документе Word образуют коллекцию Tables . Их количество можем узнать так: к отдельной таблице обращаемся по ее номеру: где i - целое число. В данном случае мы обращаемся к первой таблице, а вообще i может принимать значения от 1 до WordDocument1.Tables.Count . Если нам необходимо создать таблицу самим, следует поступить так: Эта таблица - единственное, что будет в документе, так как она заменяет собой указанный в числе параметров объект Range . В данном случае получаем таблицу на i строк и j столбцов. Если уже еcть какой-то текст, который надо сохранить, совершенно аналогичным образом можем указать пределы объекта Range : Переменные a и b должны быть объявлены как OleVariant .
Ну вот, теперь у нас есть таблица. Неважно, содержалась она уже в документе или мы создали ее сами. Посмотрим, что же мы с ней можем сделать. Число столбцов и строк узнаем так:
Здесь мы опять обратились к первой таблице, но можем работать с любой - надо только правильно указать ее номер. Теперь изменим ширину столбцов или высоту строк: Аналогично можем задавать размеры отдельных строк и столбцов:
Здесь j - опять таки целое число, начинается от 1. Можем обратится к отдельной ячейке, прочитать или изменить содержащийся в ней текст :
Здесь j и k целые переменные, изменяются от 1 до числа строк или столбцов соответственно. Присвоив данной величине строковое выражение, увидим, что оно появилось в ячейке (j,k) . Несколько непривычно, но в таблицах Word на первом месте стоит именно номер строки. Можем также задать программно отступы от края ячеек, как для всей таблицы сразу, так и для отдельной ячейки: В данном случае мы задали одинаковые отступы для всей таблицы, но аналогичные четыре свойства есть и у отдельной ячейки. Выделить нужную ячейку, столбец или строку можем следующим образом: Кроме того, можем подогнать размеры ячеек по содержимому. Для этого вызываем метод AutoFit : Добавить строку или столбец также не представляет сложностей:
Мы добавили строку внизу и столбец справа. Теперь вставим столбец в определенном месте таблицы:
Совершенно аналогично поступаем и со строками. Вообще в скобках указаны строка или столбец, перед которыми происходит вставка. Однако явно указать в скобках почему-то нельзя, надо через переменную.
Теперь про объединение ячеек. Довольно просто: Мы объединили две соседние по горизонтали ячейки (j,k) и (j,k+1) . При этом получается, что большая ячейка как бы имеет два "адреса". Аналогично надо действовать и при объединении по вертикали. Все точно так же, но с нумерацией ячеек после объединения двух соседних по вертикали начинается путаница и при попытке заполнить таблицу возникают ошибки.
Теперь разобьем ячейки.
Здесь мы разбили ячейку (j,k) на две по горизонтали. Переменные varcol и varrow типа OleVariant , это количество столбцов и строк, на которые разбивается данная ячейка. Здесь снова с нумерацией начинается чехарда, так что этот вопрос разбиения и объединения ячеек представляет скорее чисто теоретический интерес. В таких случаях лучше заранее приготовить шаблоны.
Теперь для примера удалим из таблицы второй столбец или третью строку:
Простейшая таблица, конечно, смотрится не очень. Теперь посмотрим, как мы можем ее приукрасить. При желании все сделать посимпатичнее можем использовать текстуру . Выглядеть это будет так: Совершенно аналогично можем сделать текстуру в целом столбце или строке: Текстура задается шестнадцатиричной константой, список констант можно найти заголовочном файле Word2000.pas . Можно их использовать как в шестнадцатеричном, так и в символьном виде. Чтобы не загромождать материал, значения констант будут выноситься в "Приложение" в конце статьи. Сразу оговорюсь, что заливка будет черно-белая или в шкале серого. Заливку определенным цветом пока так и не удалось обнаружить. Самая первая константа означает отсутствие заливки. Ее можно использовать, чтобы отменить текстуру.
Чтобы выделить что-нибудь важное, можем изменить шрифт текста в определенной ячейке. Для этого воспользуемся свойствами объекта Selection : В данном примере мы сделали цвет текста в ячейке (1,2) красным, выделили его курсивом и изменили размер на 16. Кроме того, можем сделать шрифт подчеркнутым, перечеркнутым и т.п.
Еще один способ изменить внешний вид таблицы - использовать стилевые шаблоны Word'a. У таблицы имеется метод AutoFormat, который меняет внешний вид таблицы в соответствии с некими предопределенными стилями. В заголовочном файле он описан следующим образом:
Первый параметр представляет из себя собственно константу, задающую стиль, а остальные показывают, будут ли требования нового стиля применяться конкретно к границам, тени, шрифту, цвету, первой строке, последней строке, первому столбцу и последнему столбцу. Последний параметр в списке указывает, надо ли подгонять размер ячеек по их содержимому - лучше самому потом вызвать AutoFit .
Как показала практика, работают только два первых параметра. Все остальные заменяем "пустышками". То есть это скорее будет просто способ изменения стиля границ, но и на том спасибо. Некоторые стили таблиц даны в приложении, полный же список ищите в заголовочном файле. Для примера применим к нашей таблице стиль "Вэб3". Вместо второго параметра ставим вариантную переменную, которой присваиваем wdTableFormatApplyBorders . То есть на практике это выглядит так:
Людям, интересующимся работой с MS Word, возможно, тоже попадались в интернете компоненты, превращающие в таблицу соответствующим образом отформатированный текст. Вот мы как раз и разберемся, как же они устроены. Здесь нам опять надо вспомнить про объект Range , а именно про имеющийся у него метод ConvertToTable . В заголовочном файле это выглядит так: Здесь опять видим все те же константы применения стиля, что и в автоформате. Только в отличие от него тут они ошибок не вызывают. Правда, есть у меня жуткое подозрение, что они все равно не работают и можем со спокойной совестью поставить вместо них "пустышки" - всех, кроме опять-таки, первых двух параметров "применения изменений". Теперь по порядку. Первый параметр у нас задает символ, которым будут отделяться ячейки одной строки нашей будущей таблицы, второй - число строк таблицы, третий - число столбцов, затем идет ширина столбцов. Следующая группа параметров задает стиль таблицы и особенности его применения, необходимые значения констант есть в таблице "Приложения". Последние три параметра задают подгонку размера ячеек по содержимому, но на самом деле не работают. Так что ставим вместо них EmptyParam . И, наконец, практический пример. Предположим, мы открыли новый документ и занесли в него нужный текст:
Такую операцию повторим трижды, и у нас будет заготовка для таблицы на 4 столбца и 3 строки. Будущие столбцы отделяются символами табуляции, а строки - переходами на новую строку. Теперь выделяем объект Range - в данном случае это весь текст документа, и превращаем его в таблицу:
В общем-то, мы можем задавать только первые шесть параметров, а все остальные заменить на "пустышки". Единственное, что здесь новенькое, это параметр "разделителя". В данном случае в качестве разделителя будет использоваться символ табуляции. Другие варианты смотрите в последней таблице "Приложения", но мне кажется, особой практической пользы от них нет.
Проделав все это, обнаруживаем, что наш текст превратился в таблицу. Все это несколько напоминает создание таблиц в HTML.
Приложения
Список некоторых констант. Смотрите файл Word2000.pas
Смотрите также материалы по темам: [Работа с MS Word]
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.
Настраивать размер таблицы, ширину столбцов и высоту строк вручную или автоматически. Вы можете изменить размер нескольких столбцов или строк и пространство между ячейками. Если вам нужно добавить таблицу в документ Word, см. в этой таблице.
В этой статье
Изменение ширины столбца
Чтобы изменить ширину столбца, выполните одно из следующих действий:
Чтобы использовать мышь, найте указатель на правой стороне границы столбца, который вы хотите переместить, пока он не станет курсором , а затем перетащите границу до нужной ширины столбца.
Чтобы задать точное значение для ширины столбца, щелкните ячейку в нем. На вкладке Макет в группе Размер ячейки щелкните в поле Ширина столбца таблицы, а затем укажите нужные параметры.
Чтобы автоматически изменять ширину столбцов по содержимому, щелкните таблицу. На вкладке Макет в группе Размер ячейки нажмите кнопку Автоподбор, а затем щелкните Автоподбор по содержимому.
Чтобы использовать линейку, выберите ячейку в таблице, а затем перетащите маркеры на линейке. Если вы хотите увидеть точную ширину столбца на линейке, при перетаскивании маркера удерживайте нажатой клавишу ALT.
Изменение высоты строки
Чтобы изменить высоту строки, выполните одно из следующих действий:
Чтобы использовать мышь, наберите указатель мыши на границе строки, которые вы хотите переместить, пока она не станет указателем , а затем перетащите границу.
Чтобы задать точное значение для высоты строки, щелкните ячейку в ней. На вкладке Макет в группе Размер ячейки щелкните в поле Высота строки таблицы, а затем укажите нужную высоту.
Чтобы использовать линейку, выберите ячейку в таблице, а затем перетащите маркеры на линейке. Если вы хотите увидеть точную высоту строки на линейке, при перетаскивании маркера удерживайте нажатой клавишу ALT.
Придание нескольким столбцам или строкам одинакового размера
Выделите столбцы или строки, у которых должен быть одинаковый размер. Чтобы выбрать несколько разделов, которые не расположены рядом друг с другом, нажмите и удерживайте клавишу CTRL.
На вкладке "Макет" в группе "Размер ячейки" нажмите кнопку "Распределить столбцы " или "Вы распределить строки .
Нажимайте указатель мыши на таблицу, пока не появится перемещения таблицы, а затем щелкните его.
Одна или несколько строк
Щелкните слева от строки.
Столбец или несколько столбцов
Щелкните верхнюю линию сетки или границу столбца.
Щелкните левый край ячейки.
Автоматическое изменение размера столбца или таблицы с помощью автоподбора ширины
С помощью кнопки "Автоподбор" можно автоматически изменить размер таблицы или столбца по размеру содержимого.
На вкладке Макет в группе Размер ячейки нажмите кнопку Автоподбор.
Выполните одно из следующих действий.
Чтобы автоматически настроить ширину столбца, щелкните Автоподбор по содержимому.
Чтобы автоматически настроить ширину таблицы, щелкните Автоподбор по ширине окна.
Примечание: Высота строки будет автоматически изменяться по размеру содержимого, если не задать ее вручную.
Отключение автоподбора ширины
Если вы не хотите, чтобы ширина таблицы или столбца настраивалась автоматически, можно отключить автоподбор.
На вкладке Макет в группе Размер ячейки нажмите кнопку Автоподбор.
Щелкните Фиксированная ширина столбца.
Изменение размеров всей таблицы вручную
Наберитесь курсора на таблице, пока в ее правом нижнем углу появится его .
Надождите, пока не станет двунаправивная стрелка на .
Перетащите границу таблицы до нужного размера.
Добавление и изменение места в таблице
Чтобы добавить пустое место в таблицу, можно настроить поля ячеек или интервал между ячейками.
Поля ячейки находятся внутри ячейки таблицы, как синяя стрелка в верхней части рисунка. Интервалы между ячейками ( например, оранжевая стрелка внизу)
На вкладке Макет в группе Выравнивание нажмите кнопку Поля ячейки, а затем в диалоговом окне Параметры таблицы:
Выполните одно из указанных ниже действий.
В разделе Поля ячеек по умолчанию введите значения для верхнего, нижнего, левого и правого полей.
В разделе Интервал между ячейками по умолчанию установите флажок Интервалы между ячейками и введите нужные размеры.
Примечание: Выбранные параметры будут применяться только к активной таблице. Для всех новых таблиц будет использоваться исходное значение.
Читайте также: