Дата публикации статьи: 25.02.2004 20:35

Валерий Назаров
Работа с Word. Статья четвертая
Работа с таблицами в Word (часть 1)

При создании документов в Word рано или поздно возникает необходимость в каких-либо методах форматирования данных, вводимых в документ. Можно конечно использовать Tab-ы в параграфах или всё время новые строки, но это не решение всех проблем. Хорошим решением этой проблемы являются таблицы. Работа с таблицами в Word очень напоминает работу с книгой в Excel, методы практически одни и те же.
Перейдём к практике.
Основным элементом для работы с таблицами является коллекция Tables. Также как и все объекты Word, данную коллекцию нужно сначала объявить, а потом инициализировать. В данной статье не рассматриваются вопросы доступа к существующим таблицам, мы создаём новые и работаем с ними. Рассмотрим это на примере.

'объявляем объектную переменную в разделе
' Generals формы
Dim TableWord As Word.Table

Инициализируем коллекцию Tables и создаём новую таблицу. При этом нужно сразу определиться, какая таблица вам необходима, сколько в ней должно быть строк и столбцов, а также где она будет находиться. Если использовать первый код, то новая таблица перекроет весь текст который был в документе ("удалит" его). Если вы уже добавили текст в документ, то используйте второй код. Он вставит таблицу туда, где находится в данный момент "мигающий" курсор.

Код №1
'создаём таблицу 10 строк, 2 столбца
'во всю ширину области печати текста
Set TableWord = DocWord.Tables.Add(DocWord.Range(), 10, 2)

Код №2
'создаём таблицу 10 строк, 2 столбца
'во всю ширину области печати текста
Set TableWord = DocWord.Tables.Add(DocWord.Application.Selection.Range, 10, 2)

После этого мы можем добавлять текст в ячейки таблицы используя метод Cell.

'печатаем текст в ячейке с адресом
'(номер_строки, номер_столбца)
TableWord.Cell(1, 1).Range.Text = "Первая ячейка"
TableWord.Cell(2, 1).Range.Text = "Вторая ячейка"

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

Dim strText As String
'получаем текст из ячейки
strText= TableWord.Cell(1, 1).Range.Text

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

'делаем все строки высотой 24 пт
'если нужно в других единицах измерения, то
'используем функции перевода: например (CentimetersToPoints(Х.ХХ))
TableWord.Rows.Height = 24
'делаем определённую строку (5-тую) высотой 2 см
TableWord.Rows(5).Height = CentimetersToPoints(2)

Продолжаем форматирование таблицы - изменяем ширину столбцов.

Внимательно следите за общей шириной таблицы, чтобы её ширина не превысила ширину области печати. Иначе ваша таблица "уползёт" за границы листа. Также как высота строк, ширина столбцов может задаваться для конкретных столбцов по отдельности или всех столбцов сразу, со всеми вытекающими последствиями.

'делаем все столбцы шириной 5 см
TableWord.Columns.Width = CentimetersToPoints(5)

'делаем 1-вый столбец шириной 3 см
TableWord.Columns(1).Width = CentimetersToPoints(3)

По ходу выполнения программы вы можете изменять местоположение таблицы. При этом текст будет "обтекать" таблицу (по умолчанию). Помните, что позиция таблицы задается от левой и верхней границ места вставки.

'изменяем положение таблицы по вертикали
TableWord.Rows.VerticalPosition = CentimetersToPoints(5)

''изменяем положение таблицы по горизонтали
TableWord.Rows.HorizontalPosition = CentimetersToPoints(1.5) 

Для того чтобы эффективно работать с таблицей, нужно знать количество строк и столбцов, а также ячеек в таблице (особенно это касается тех таблиц, которые уже есть в документе, если вы работаете не с новым экземпляром Word-а, а с уже существующим). Для этого OLE automation предоставляет свойство Count (количество). Это свойство позволяет узнать количество строк, столбцов, ячеек в таблице, а также количество самих таблиц в документе (а также количество слов, параграфов "абзацев" и т.д).

Для получения количества строк в данной таблице воспользуемся коллекцией Rows.

'получаем количество строк в таблице
TableWord.Cell(2, 2).Range.Text = "Строк - " & TableWord.Rows.Count

Для получения количества столбцов в данной таблице воспользуемся коллекцией Columns.

'получаем количество столбцов в таблице
TableWord.Cell(3, 2).Range.Text = "Столбцов - " & TableWord.Columns.Count 

	А для получения количества ячеек в данной таблице воспользуемся коллекцией Cells.
	
'получаем количество ячеек в таблице
TableWord.Cell(3, 2).Range.Text = "Ячеек - " & TableWord.Range.Cells.Count

Коллекции Columns, Rows и Cells позволяют получить доступ к своим элементам через индекс. Например TableWord.Range.Cells(1).Text получит текст из первой ячейки. Однако помните, что обращение к несуществующему индексу вызовет ошибку времени исполнения. Поэтому перед обращением к коллекции через индекс проверьте, не выходит  ли он за допустимый диапазон свойством  .Count и не забудьте добавить в начало код обработчика ошибок. После этого вы можете использовать циклы для обработки каждого элемента коллекции.

 Для получения количества таблиц в документе воспользуемся коллекцией Tables.

'получаем количество таблиц в документе
TableWord.Cell(4, 2).Range.Text = "Таблиц - " & DocWord.Tables.Count

После этого вы можете получить доступ к любой таблице в данном документе, то есть ко всем её элементам также как мы это делали выше (с небольшим изменением конечно).

'печатаем текст в ячейке с адресом
'(номер_строки, номер_столбца)
DocWord.Tables(1).Cell(5, 2).Range.Text = "Привет"  

И так далее.
Пример Word_4.vbp