Word программно вставить таблицу
Публикация - своего р ода памятка, содержащая примеры кода для:
1. заполнение шаблона Word данными из 1С;
2. заполнение колонтитулов Word данными из 1С;
3. заполнение таблицы в Word данными из 1С;
Начало работы
В большинстве случаев перед нами ставится следующая задача:
Нужно открыть документ Word, заполненный данными из 1С.
Для этого нам нужно подготовить шаблон документа Word. Не путайте это с Word Template, специальные файлы Word, которые содержат настройки документов для многократного использования. Нам нужен обычный вордовский документ с расширениеми *.docx или *.doc. А далее поместить этот документ в макет с двоичными данными.
Читатель может справедливо заметить, что используется модальный вызов, и погрозить автору пальцем. И будет прав.
Далее я обычно создаю структуру полей, которые будут заполняться в шаблоне. Такой подход позволяет унифицировать процедуру заполнения шаблона, а также упростить последующее его изменение.
Углубимся немножко в принципы работы Word.
Каждый документ Word разделен на разделы, которые состоят из страниц.
Для каждого раздела есть возможность создавать свою нумерацию элементов, уникальные колонтитулы и настройки параметров страницы. Так, например, чтобы повернуть одну из страниц (вывести на печать как альбомную), нужно создать под неё отдельный раздел.
Каждая страница Word разделена на несколько областей:
- Верхний колонтитул
- Основной текст
- Нижний колонтитул
Нужно заметить, что в каждом разделе может быть уникальный колонтитул для первой страницы.
Заполнение пользовательских параметров
При обращении к этим коллекциям мы можем выполнять в них поиск и получать встроенные объекты, например, таблицы.
Теперь мы более-менее поняли, как обращаться к областям Word, можем в них пошуровать и выполнить замену наших параметров:
Рассмотри подробнее метод Execute. Его параметры идентичны диалоговуму окну при замене/поиске непоседресвенно из MS Word:
А вот и основные параметры (вольный перевод справки MSDN):
- Искомый текст - Строка - Текст для замены. Текст может содержать специальные параметры. Например, ^p - абзац, ^t - табуляция
- Чувствительность к регистру - Булево - Если истина, то поиск будет осуществляться с учетом регистра
- Слова целиком - Булево - Если истина, то ищутся слова целиком. Вхождение слов не учитываются. Например, при поиске слова дом будет пропущено слово домашний
- Использовать подстановочные знаки - Булево - Если истина, то используются встроенные регулярные выражения.
- Искать похожие - Булево - Если истина, то результат поиска будет содержать похожие слова
- Искать все формы - Булево - Если истина, то результат поиска будет содержать различные формы слов.
- Поиск сначала - Булево - Если истина, то будет осуществляться с начала до конца документа
- Охват - WdFindWrap - Опредяляет направление поиска
- Формат - Format - Формат искомого текста
- Строка замены - Строка - Строка, на которую будет заменен исходный текст
- Количество замен - WdReplace - Определяет сколько раз выполнять замену
- и т.д.
WdReplace - Constant Value:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1
Данный метод не позволяет получить "Строка замены" как выделенную область, но он работает где-то в 10 раз медленнее. Для получения выделенной области можно воспользоваться немножко откорректированной типовой функцией:
Уже получив выделенную область можно отредактировать стиль текста, шрифт и т.д.
Также есть второй подход, использующий такой объект Word, как поля. Мне он не очень нравится, т.к. в больших документах, порядка 100 страниц, эти поля начинают глючить (исчезать, не подставлять нужные значения) и прочая ерунда. Ну по крайней мере в Word 2007. Но я его все равно приведу:
При подготовке шаблона в тело документа необходимо навставлять полей с типом DOCVARIABLE (можно вставлять горячими клавишими Ctrl+F9).
Доступ к таким полям можно получить следующим нехитрым образом:
Заполнение таблиц по шаблону
Итак, мы заполнили параметры в основном тексте документа, заменили параметры в колонтитулах, но у нас еще есть одна неприятность - нужно заполнить таблицу.
Подход, описанный ниже, годится только для таблиц с заранее известным форматом. Т.е. мы можем как угодно отформатировать таблицу и её строки изначально. Но потом изменять довольно-таки проблематично.
К таблицам можно получить доступ через области документа.
Далее, получив таблицу, мы работаем с ней по привычной схеме - строки, столбцы.
Для задания форматирования легче в шаблоне создать таблицу с пустой первой строкой, которую мы в последующем удалим.
Вот, в принципе, и все. Основные вопросы, возникающие при работе с Word, я постарался осветить. Надеюсь, данный обзор поможет вам в работе =)
Спасибо за советы и комментарии:
v3rter, monkbest
Критика только приветствуется. Чем больше замечаний, тем лучше будет гайд =)
Коллекция Tables является членом классов Document, Document, Selection и Range. Это означает, что таблицу можно создать в любом из их контекстов. Для добавления таблицы в указанном диапазоне можно использовать метод Add коллекции Tables.
Применимо к: Сведения в этом разделе относятся к - проектам уровня документа и добавлению VSTO - в проектах для Word. Дополнительные сведения см. в разделе доступность функций по типам приложений Office и проектов.
Создание таблиц в настройках уровня документа
Добавление таблицы в документ
Для добавления таблицы, состоящей из трех строк и четырех столбцов, в начало документа используйте метод Add.
Чтобы использовать следующий пример кода, выполните его из класса ThisDocument в своем проекте.
При создании таблицы она автоматически добавляется в коллекцию Tables ведущего элемента Document. Затем на таблицу можно ссылаться по номеру ее элемента с помощью свойства Item[], как показано в следующем коде.
Ссылка на таблицу по номеру элемента
Используйте свойство Item[] и укажите номер элемента таблицы, на которую необходимо ссылаться.
Чтобы использовать следующий пример кода, выполните его из класса ThisDocument в своем проекте.
Каждый объект Table также имеет свойство Range, которое позволяет настроить атрибуты форматирования.
Применение стиля к таблице
Для применения одного из встроенных стилей Word к таблице используйте свойство Style.
Чтобы использовать следующий пример кода, выполните его из класса ThisDocument в своем проекте.
создание таблиц в VSTO надстройках
Добавление таблицы в документ
Для добавления таблицы, состоящей из трех строк и четырех столбцов, в начало документа используйте метод Add.
Следующий пример кода добавляет таблицу в активный документ. Чтобы использовать этот пример, запустите код из класса ThisAddIn в своем проекте.
При создании таблицы она автоматически добавляется в коллекцию Tables в Document. Затем на таблицу можно ссылаться по номеру ее элемента с помощью свойства Item[], как показано в следующем коде.
Ссылка на таблицу по номеру элемента
Используйте свойство Item[] и укажите номер элемента таблицы, на которую необходимо ссылаться.
В следующем примере кода используется активный документ. Чтобы использовать этот пример, запустите код из класса ThisAddIn в своем проекте.
Каждый объект Table также имеет свойство Range, которое позволяет настроить атрибуты форматирования.
Применение стиля к таблице
Для применения одного из встроенных стилей Word к таблице используйте свойство Style.
В следующем примере кода используется активный документ. Чтобы использовать этот пример, запустите код из класса ThisAddIn в своем проекте.
Настоящая документация является предварительной и может быть изменена. В этом разделе показан порядок использования классов пакета Пакет Open XML SDK 2.5 для Office для программного добавления таблицы в текстовый документ. Для иллюстрации данной задачи в разделе приведен пример метода AddTable.
Чтобы использовать пример кода в этом разделе, необходимо установить SDK Open XML 2.0. Необходимо явно ссылаться на следующие сборки в проекте:
DocumentFormat.OpenXml (устанавливается вместе с пакетом Open XML SDK).
Для компиляции кода, представленного в этом разделе, необходимо также использовать следующие директивы using или инструкции Imports:
Метод AddTable
Метод AddTable используется для добавления простой таблицы в текстовый документ. Метод AddTable принимает два параметра, указывающие следующие данные:
Имя изменяемого документа (строковое значение).
Двумерных массив строк, вставляемый в документ в виде таблицы.
Вызов метода AddTable
Метод AddTable изменяет заданный документ, добавляя таблицу, которая содержит данные в виде заданного двумерного массива. Чтобы вызвать метод, передайте значения двух параметров, как показано в следующем примере кода:
Как работает код
Сначала приведенный ниже код открывает документ, используя метод WordprocessingDocument.Open и указывая, что документ должен быть открыт для чтения и записи (значение последнего параметра true). Затем код получает ссылку на корневой элемент части основного документа при помощи свойства Document и свойства MainDocumentPart текстового документа.
Создание объекта таблицы и настройка его свойств
Прежде чем вставить в документ таблицу, необходимо создать объект Table и настроить его свойства. Чтобы задать свойства таблицы, необходимо создать и заполнить значениями объект TableProperties. Класс TableProperties предоставляет множество свойств, применимых к таблицам, например Shading, TableBorders, TableCaption, TableCellSpacing, TableJustification и т. д. Пример метода включает следующий код:
Конструктор класса TableProperties позволяет указать необходимое количество дочерних элементов (подобно конструктору XElement). В этом случае код создает дочерние элементы TopBorder, BottomBorder, LeftBorder, RightBorder, InsideHorizontalBorder и InsideVerticalBorder, каждый из которых описывает один из граничных элементов таблицы. Для каждого элемента код задает свойства Val и Size в составе вызова конструктора. Вы можете с легкостью задать размер, но настройка свойства Val требует несколько больших усилий: это свойство для данного конкретного объекта представляет стиль границы, и ему необходимо присвоить перечислимое значение. Для этого необходимо создать экземпляр универсального типа EnumValue , передавая конструктору в качестве параметра определенный тип границы (Single). После установки всех необходимых границ таблицы код вызывает метод AppendChild таблицы, указывая, что универсальным типом является TableProperties. Таким образом, он добавляет экземпляр класса TableProperties, используя переменную props в качестве значения.
Заполнение таблицы данными
После создания таблицы и ее свойств необходимо заполнить таблицу данными. Приведенная в примере процедура сначала проходит через все строки данных в заданном массиве строк, создавая экземпляр TableRow для каждой строки данных. В следующем коде не приведены подробности, касающиеся заполнения строки данными, но показан процесс создания и добавления строки в таблицу:
Для каждой строки код перебирает все столбцы в заданном массиве строк. Для каждого столбца код создает новый объект TableCell , заполняет его данными и добавляет его в строку. В следующем коде не приведены подробности, касающиеся заполнения ячеек данными, но показан процесс создания столбца и добавления его в таблицу:
Затем код выполняет следующие действия:
создает объект Text, содержащий значение из массива строк;
передает объект Text в конструктор нового объектаRun;
передает объект Run в конструктор нового объектаParagraph;
передает объект Paragraph в метод Append ячейки.
Другими словами, следующий код добавляет текст в новый объект TableCell:
Затем код добавляет в ячейку новый объект TableCellProperties. Этот объект TableCellProperties, подобно уже описанному объекту TableProperties, может принимать в конструкторе любое необходимое число объектов. В этом случае код передает только один новый объект TableCellWidth со свойством Type, имеющим значение Auto (чтобы таблица автоматически изменяла ширину столбцов).
Завершение работы
Следующий код завершается добавлением таблицы в тело документа и сохранением документа.
Пример кода
Возвращает объект Table , который представляет новую пустую таблицу, добавленную в документ.
Синтаксис
выражения. Добавление (Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior)
выражение (обязательно). Переменная, представляюная коллекцию "Таблицы".
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Range | Обязательный | Объект Range | Диапазон, в котором нужно отображать таблицу. Таблица заменяет диапазон, если диапазон не свернут. |
NumRows | Обязательный | Long | Количество строк, которые необходимо включить в таблицу. |
NumColumns | Обязательный | Long | Количество столбцов, которые необходимо включить в таблицу. |
DefaultTableBehavior | Необязательный | Variant | Задает значение, которое указывает, Microsoft Word автоматически размер ячейки в таблицах, чтобы соответствовать содержимому ячеек (AutoFit). Может быть любой из следующих констант: wdWord8TableBehavior (отключен автофит) или wdWord9TableBehavior (включено AutoFit). Константа по умолчанию — wdWord8TableBehavior. |
AutoFitBehavior | Необязательный | Variant | Задает правила AutoFit для таблиц размеров Word. Может быть одним из констант WdAutoFitBehavior . |
Возвращаемое значение
Пример
В этом примере добавляется пустая таблица с тремя строками и четырьмя столбцами в начале активного документа.
В этом примере добавляется новая пустая таблица с шестью строками и десятью столбцами в конце активного документа
В этом примере в новый документ добавляется таблица с тремя строками и пятью столбцами, а затем вставляется информация в каждую ячейку таблицы.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Помогите пжл решить такую проблему. Из программы создаю Word-кий документ, в котором сначала идет какой-то небольшой текст, а после него надо вставить таблицу с данными. Так вот, после длительного поиска нашел только как вставить таблицу на чистый лист, а мне надо ее вставить после какой-либо строки.
Подскажите пожалуйста как это можно сделать?
Заранее благодарен.
← →KSergey ( 2003-12-16 08:32 ) [1]
Пример вставки таблицы, параграфов
procedure TForm1.Button1Click(Sender: TObject);
begin
// если заголовок "Выход", то закрываем программу
if button1.caption="Выход" then
begin
Application.Terminate;
exit
end
// иначе (при первом начатии, когда у нас заголовок "Старт")
//переименовываем заголовок в "Выход"
else button1.caption:="Выход";
panel1.Visible:=true;
// создаем экземпляр ворда
WordApp:=CoApplication_.Create;
// делаем его видимым
WordApp.Visible:=true;
// шаблон
template:="Normal";
// создать шаблон
OpenAsTemplate:=false;
// что-то типа оператора with, можно было и напрямую обратиться
Docs:=WordApp.Documents;
// добавляем документ
Doc:=Docs.Add(template,OpenAsTemplate);
// выделить все
ARange:=Doc.Range(EmptyParam,EmptyParam);
// массив параграфов
pars:=doc.Paragraphs;
// переменная - параметр
template:=arange;
// новый параграф
par:=pars.Add(template);
// цвет зеленный
par.Range.Font.ColorIndex:=11;
// вставляем текст
par.Range.InsertBefore("Привет . ");
// переменная - параметр
template:=par.Range;
// новый параграф, чтобы таблица не потерла текст
par:=pars.Add(template);
// цвет черный
par.Range.Font.ColorIndex:=0;
// вставляем текст
par.Range.InsertBefore("Переключившись в программу, можно программно менять текст ячеек !");
// переменная - параметр
template:=par.Range;
// новый параграф, чтобы таблица не потерла текст
par:=pars.Add(template);
// выделяем параграф
arange:=par.Range;
// шрифт - жирный
ARange.Font.Bold:=1;
// шрифт - рукописный
ARange.Font.Italic:=1;
// получить массив таблиц
tabls:=aRange.Tables;
// добавляем новую таблицу размером 5 на 5
tabl:=tabls.Add(arange,5,5);
// в цикле
for i:=1 to 5 do
// задаем значение ячеек
tabl.Cell(i,1).Range.Text:=inttostr(i);
Завершающие действия, сохранение файла
procedure TForm1.FormDestroy(Sender: TObject);
var
// для параметров
SaveChanges:olevariant;
begin
// если Word не закрыт
if not VarIsEmpty(WordApp) then begin
< а можно сохранить автоматом:
// имя файла в оле
template:="Имя.doc";
// если не сохранен, то
if doc.Saved=false then
// сохраняем
Doc.SaveAs(template, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
короче, пишешь имя объекта, ставишь точку и нажимаешь
"ctrl"+" " и изучаешь существующие методы и св-ва
>
//изменения не сохранять
SaveChanges:=false;
// то закрыть сначала документ
Doc.Close(SaveChanges,EmptyParam,EmptyParam);
// а потом и ворд
WordApp.Quit(SaveChanges,EmptyParam,EmptyParam)
end;
KSergey ( 2003-12-16 08:40 ) [2]
Да, код не мой
Источник где потырил - не помню.
Tumcoat ( 2003-12-16 08:50 ) [3]
За код конечно спасибо, хорошая штука.
Я примерно так и пытался делать недавно, но все время получаю такую ошибку:
Method "Range" not supported by automation object
и честно говоря не представляю как от этого избавиться, не подскажешь?
← →KSergey ( 2003-12-16 09:07 ) [4]
Да ну?
А попробуйте не примерно так, а именно так. Вроде на первый взгляд тут все правильно.
Хотя не проверял.
Н оу меня есть опять же похожий код, где все нормально. Только таблиц я там не добавляю - читаю и подправляю текст в существующих.
И, к стати, а в каком именно месте у вас ошибка? Для какого именно объекта он не находит Range?
← →Tumcoat ( 2003-12-17 02:25 ) [5]
Ну именно так не получится, переменные разные, опять же разный текст вставляется, и т.д. :-)))
И кстати, с текстом у меня тоже все нормально, и вставляется и редактируется, и все что надо делается, а вот в этой операции:
и возникает эта ошибка.
← →Романов Р.В. ( 2003-12-17 07:56 ) [6]
На королевстве дельфи есть статья по работе с wordom
← →xli ( 2003-12-17 10:44 ) [7]
Хорошо еще помогает включение записи действий в VBA макрос. А потом разбор данного макроса.
Вот только не надо забывать про возможные различия между разными версиями офисов, а то можно нарваться на неподдерживаемые функции.
← →Tumcoat ( 2003-12-18 05:23 ) [8]
> Романов Р.В. ©
Был я на королевстве, читал. Там есть: как создать таблицу на весь (причем на чистый) лист, как ее редактировать, как превратить в таблицу определенным образом отредактированный текст (кстати, как его так определенно отредактировать тоже не сказано). Кстати в ответе KSergey описано тоже самое, только более понятно. Но нигде нету ответа на мой вопрос.
← →Tumcoat ( 2003-12-18 05:24 ) [9]
> xli
Word у меня 2000-й
WordApp.ActiveDocument.Tables.Add(Range:=WordApp.Selection.Range, NumRows:=5, NumColumns:= 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitFixed);
← →Tumcoat ( 2003-12-18 10:12 ) [11]
> Shirson ©
Спасибо, попробую.
Читайте также: