Как узнать координаты ячеек в Microsoft Word

Microsoft Word — мощный инструмент для создания документов, который часто используется в офисной работе. Одной из важных возможностей программы является работа с таблицами, которые позволяют структурировать информацию и делать ее более удобной для восприятия.

Когда в таблице есть несколько строк и столбцов, может возникнуть необходимость быстро найти конкретную ячейку, чтобы внести в нее изменения или скопировать данные. Для этого в Ворде предусмотрен специальный инструмент – абсолютный адрес ячейки.

Абсолютный адрес ячейки состоит из координат столбца и строки. Столбцы в таблице обозначаются буквами от A до Z, затем от AА до AZ, и т. д. Строки обозначаются цифрами от 1 до 9999.

Описание абсолютного адреса ячейки в Ворде и его значение

В программе Microsoft Word абсолютный адрес ячейки представляет собой уникальное обозначение конкретной ячейки в таблице. Он состоит из комбинации букв и цифр, которая позволяет точно определить положение ячейки в таблице.

Абсолютный адрес ячейки состоит из двух ключевых элементов — буквенной части и цифровой части. Буквенная часть обозначает столбец, в котором находится ячейка, а цифровая часть обозначает строку, в которой находится ячейка.

Например, если абсолютный адрес ячейки составлен из буквы «A» и цифры «1», это означает, что ячейка находится в первом столбце и первой строке таблицы. Если абсолютный адрес составлен из буквы «C» и цифры «2», это означает, что ячейка находится в третьем столбце и второй строке таблицы.

Значение абсолютного адреса ячейки заключается в том, что он позволяет быстро и точно определить положение нужной ячейки в таблице, а также использовать этот адрес для различных манипуляций с содержимым ячейки, например, изменения значения, форматирования и других операций в программе Microsoft Word.

ABC
1A1B1C1
2A2B2C2

Методы определения абсолютного адреса ячейки в Ворде

В Microsoft Word существует несколько способов определить абсолютный адрес ячейки в таблице. Это может быть полезным при использовании макросов или работы с формулами. Ниже представлены несколько методов, которые помогут вам определить абсолютный адрес ячейки в Ворде.

1. Использование координатной системы:

Абсолютный адрес ячейки в таблице можно определить, указав номер строки и номер столбца ячейки. Например, адрес ячейки в виде «A1» указывает на ячейку в первой строке и первом столбце таблицы.

2. Использование команды «Ссылка на ячейку»:

Вы также можете использовать команду «Ссылка на ячейку» в меню «Вставка». При выборе этой команды открывается диалоговое окно, где вы можете выбрать нужную ячейку и увидеть ее абсолютный адрес.

3. Использование функции «Адрес»:

В формулах можно использовать функцию «Адрес», которая возвращает абсолютный адрес ячейки. Например, функция «=Адрес(1, 1)» вернет адрес ячейки «A1».

4. Использование активного документа:

Если вы работаете в макросе, то можете использовать методы объекта «АктивныйДокумент». Например, вы можете получить абсолютный адрес активной ячейки с помощью кода:

re>Set Cell = ActiveDocument.Tables(1).Cell(RowIndex, ColumnIndex) Address = Cell.Range.Information(wdActiveEndAdjustedPageNumber).ToString()

Здесь «RowIndex» и «ColumnIndex» — это номера строки и столбца ячейки соответственно.

Используя эти методы, вы сможете определить абсолютный адрес ячейки в таблице Microsoft Word.

Метод с помощью формулы-ссылки

Для определения абсолютного адреса ячейки в Ворде можно использовать метод с помощью формулы-ссылки. Этот метод позволяет легко определить адрес ячейки, используя формулу и ссылку на нужную ячейку. Чтобы использовать этот метод, необходимо выполнить следующие шаги:

1. Выделите ячейку, адрес которой нужно определить.

2. Откройте формулу-ссылку. Нажмите на поле формулы над таблицей, где отображается адрес текущей ячейки.

3. Скопируйте адрес ячейки. Выделите адрес ячейки, который отображается в поле формулы, и скопируйте его в буфер обмена.

4. Вставьте адрес ячейки в нужное место. Вставьте скопированный адрес ячейки в нужное место, где необходимо использовать абсолютный адрес.

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

Метод с помощью ячейки-координаты

Для того чтобы определить абсолютный адрес ячейки на основе координат, нужно указать номер строки и столбца ячейки, разделив их двоеточием. Например, ячейка находящаяся во второй строке и третьем столбце, будет иметь адрес «B3».

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

Преимущества использования абсолютного адреса ячейки в Ворде

Абсолютный адрес ячейки в Microsoft Word позволяет точно определить позицию необходимой ячейки в таблице. Использование абсолютного адреса имеет свои преимущества:

  1. Точность и надежность. Абсолютный адрес ячейки позволяет избежать ошибок при указании позиции ячейки, так как он указывает на конкретное место в таблице. Это особенно важно при работе с большими и сложными таблицами или при изменении структуры таблицы.
  2. Удобство в редактировании. При использовании абсолютного адреса ячейки, можно легко и быстро переходить к нужной ячейке для редактирования или вставки данных. Это упрощает работу с таблицами и увеличивает производительность.
  3. Гибкость. Абсолютный адрес ячейки остается неизменным, даже если изменяется размер или структура таблицы. Это позволяет использовать ссылки на ячейки в различных частях документа без опасности потерять исходную информацию.
  4. Универсальность. Абсолютный адрес ячейки можно использовать не только внутри одного документа Microsoft Word, но и для связи между разными документами. Это полезно при создании сводных таблиц или при управлении данными из разных источников.

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

Обеспечение точности данных

Абсолютный адрес ячейки в Ворде позволяет однозначно указать на конкретную ячейку в таблице, не зависимо от ее расположения. Задание абсолютного адреса позволяет обращаться к ячейке независимо от связей и ссылок на нее.

Если в документе есть таблица размером 10×10, и нужно получить данные из ячейки в четвертом столбце, пятой строке, то можно задать абсолютный адрес ячейки как «D5». Это позволит получить данные из указанной ячейки вне зависимости от изменений в таблице.

Определение абсолютного адреса ячейки в Ворде обеспечивает надежность и точность работы с данными. Это особенно важно при наличии многочисленных таблиц и формул, где отсутствие точности может привести к непредсказуемым результатам. Поэтому важно учитывать и использовать абсолютный адрес ячейки при работе с данными в Microsoft Word.

Упрощение работы с формулами

1. Используйте абсолютные адреса ячеек

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

Например, вместо =A1+B1 используйте = $A$1 + $B$1. Таким образом, при копировании формула сохранит абсолютные адреса ячеек и будет корректно работать в любой ячейке.

2. Используйте именованные диапазоны

Для упрощения работы с формулами можно использовать именованные диапазоны. Это позволяет задать символьное имя для определенной области ячеек, например, для столбца с данными или для диапазона строк. Использование именованных диапазонов делает формулы более понятными и гибкими, а также упрощает их создание и редактирование.

3. Используйте функции и формулы

Microsoft Word предлагает множество встроенных функций и формул, которые могут значительно упростить выполнение вычислительных операций. Например, функция SUM позволяет быстро сложить значения в заданном диапазоне ячеек, а функция AVERAGE вычисляет среднее значение. Используйте эти функции и формулы, чтобы упростить свою работу и сэкономить время.

Практические примеры использования абсолютного адреса ячейки в Ворде

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

  1. Форматирование определенной ячейки: при использовании абсолютного адреса ячейки, вы можете легко применить определенное форматирование только к этой ячейке. Например, вы можете применить шрифт Times New Roman, размер 12 к ячейке A1. Другие ячейки в таблице останутся неизменными.
  2. Вычисления в ячейках: абсолютный адрес позволяет вам использовать содержимое одной ячейки в другой ячейке для выполнения вычислений. Например, если ячейка A1 содержит число 5, а ячейка B1 содержит число 10, вы можете использовать формулу «=A1+B1» в ячейке C1, чтобы получить сумму этих двух чисел.
  3. Создание ссылок на ячейки: абсолютный адрес может быть использован для создания ссылок на конкретную ячейку в документе. Например, вы можете создать гиперссылку на ячейку A1, чтобы быстро переместиться к этой ячейке при клике на ссылку.

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

Использование таблиц в документах MS Word

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

Ячейки таблицы могут содержать текст, графические объекты, вложенные таблицы. Для вставки таблицы используют вкладку Вставка.

Для работы с таблицами в Microsoft Word 2007 применяют контекстные вкладки Конст-руктор и Макет группы вкладок Работа с таблицами. Эти вкладки автоматически отображают-ся, когда курсор находится в какой-либо ячейке существующей таблицы.

Вставка таблицы в документ Microsoft Word 2007

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

Таблицу в документ Word 2007 можно вставлять несколькими способами.

Для быстрой вставки простой таблицы на вкладке Вставка нажмите кнопку Таблица и в появившемся табло при нажатой левой кнопке мыши выделите необходимое число столбцов и строк (рисунок 5.1). При наведении указателя мыши срабатывает функция предпросмотра, и соз-даваемая таблица отображается в документе. Таблица занимает всю ширину страницы и имеет столбцы одинаковой ширины.

Рисунок 5.1 – Вставка простой таблицы

Можно заранее установить некоторые параметры для создаваемой таблицы. Для этого:

1. Установите курсор туда, где будет находиться создаваемая таблица.

2. Щёлкните кнопку Таблица на вкладке Вставка и выберите команду Вставить таблицу.

3. В окне Вставка таблицы (рисунок 5.2) выберите требуемое количество строк и столб-цов, а также способ автоподбора. При выборе режима постоянный можно установить ширину столбцов таблицы.

При создании таблицы можно воспользоваться имеющимися заготовками Microsoft Word или собственными, ранее созданными таблицами.

1. Установите курсор туда, где будет находиться создаваемая таблица.

2. Нажмите кнопку Таблица на вкладке Вставка и выберите команду Экспресс-таблицы.

3. Прокрутите список таблиц и выберите нужную. Пользовательские таблицы, занесённые

в список экспресс-таблиц, обычно располагаются в разделе Общие в конце списка.

Рисунок 5.2 – Выбор парамет-ров вставляемой таблицы

В результате в документ будет вставлена готовая, содержащая текст и оформление таблица. Оформление встроенных экспресс- таблиц Microsoft Word зависит от выбранной темы документа. Вставленная таблица может иметь заголовок. Ненужный текст можно удалить. Можно также из-менить оформление таблицы.

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

Для определения координат ячейки необходимо сначала определиться с номером строки – 1, 2, 3 и т. д. (считать сверху вниз), а затем в этой строке отсчитать нужный столбец – A, B, C и т.д. (считать слева на право). Пример определения координат ячейки приведен на рисунке 5.3.

АВCD
А1В1С1D1
А2B2
А3В3С3

Рисунок 5.3 – Адресация в таблицах

5.3 Преобразование текста в таблицу

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

1. Выделите фрагмент документа, преобразуе-мый в таблицу.

2. Щёлкните кнопку Таблица на вкладке

Вставка и выберите команду Преобразовать в таб-лицу.

3. В окне Преобразовать в таблицу (рисунок

5.4) в счётчике Число столбцов установите число столбцов создаваемой таблицы (число строк устанав-ливается автоматически); в разделе Автоподбор ши-рины столбцов выберите способ изменения шириныстолбцов таблицы (при выборе параметра постоян-ная можно указать ширину столбцов);выберите знакразделителя.

Рисунок 5.4 – Преобразование текста в таблицу

Изменение таблицы

Добавление строк

Для добавления строк в таблицу можно воспользоваться соответствующими кнопками кон-текстной вкладки Макет следующим образом:

1. Установите курсор в любую ячейку строки таблицы, выше или ниже которой требуется вставить новую строку.

2. Нажмите кнопку Вставить сверху или Вставить снизу группы Строки и столбцы.

При работе в других вкладках для вставки строк можно воспользоваться контекстнымменю. Для этого:

1. Щёлкните правой кнопкой мыши по любой ячейке строки таблицы, выше или ниже ко-торой требуется вставить новую строку, и выберите из контекстного меню команду Вставить.

2. В подчинённом меню выберите команду Вставить строки сверху или Вставить строки

снизу.

Если в таблицу требуется вставить сразу несколько новых строк, то следует выделить в таблице такое же число строк, а затем воспользоваться любым из описанных выше способов.

При работе с клавиатурой для вставки строки можно поставить курсор справа от самой правой ячейки строки и нажать клавишу Enter.

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

Добавление столбцов

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

1. Установите курсор в любую ячейку столбца таблицы, левее или правее которого требу-ется вставить новый столбец.

2. Нажмите кнопку Вставить слева или Вставить справа группы Строки и столбцы.

При работе в других вкладках для вставки столбцов можно воспользоваться контекстным меню. Для этого:

1. Щёлкните правой кнопкой мыши по любой ячейке столбца таблицы, левее или правее которого требуется вставить новый столбец, и выберите из контекстного меню команду Вста-

вить.

2. В подчиненном меню выберите команду Вставить столбцы слева или Вставить столб-

цы справа.

Если в таблицу требуется вставить сразу несколько новых столбцов, то следует выделить в таблице такое же число столбцов, а затем воспользоваться любым из описанных выше способов.

Удаление строк и столбцов

Для удаления строк и столбцов таблицы можно воспользоваться соответствующими кноп-ками контекстной вкладки Макет следующим образом:

1. Установите курсор в любую ячейку удаляемой строки или удаляемого столбца таблицы.

2. Нажмите кнопку Удалить группы Строки и столбцы и в меню выберите соответст-

вующую команду (Удалить строки или Удалить столбцы).

При работе в других вкладках для удаления строк и столбцов можно воспользоваться кла-виатурой или контекстным меню. Для этого:

1. Выделите удаляемую строку (удаляемый столбец).

2. Нажмите клавишу BackSpace или щёлкните правой кнопкой мыши по выделенному элементу таблицы и выберите команду Удалить строки (Удалить столбцы).

Если в таблице требуется удалить сразу несколько строк или столбцов, то следует их выде-лить, а затем воспользоваться любым из описанных выше способов.

Клавиша Delete не удаляет строки и столбцы таблицы, а только очищает их содержимое. Однако если выделить одновременно строку текста над таблицей и строку (или строки) таблицы и нажать Delete, то удалится и строка текста, и выделенная часть таблицы. То же самое будет при выделении части таблицы и текста ниже таблицы.

Удаление ячеек

Удаление ячеек может потребоваться для иборьбы структуры таблицы.

1. Установите курсор в ячейку, нажмите кнопку Удалить группы Строки и столбцы, и выберите команду Удалить ячейки или щёлкните правой кнопкой мыши по ячейке и выберите команду контекстного меню Удалить ячейки.

В появившемся окне (рисунок 5.5) выберите направление сдвига существующих ячеек таблицы.

Рисунок 5.5 – Удаление ячейки таблицы

Удаление таблицы

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

1. Установите курсор в любую ячейку таблицы.

2. Нажмите кнопку Удалить группы Строки и столбцы и в меню выберите команду Уда-

лить таблицу.

Таблицу также можно удалить, удалив все её строки или столбцы.

Как определяются координаты ячеек в ворде

Дамир дата публикации 19-07-2009 12:43

Работа с таблицами Word с объединенными ячейками

В статьях, посвященных работе с таблицами Word, как правило, авторы избегают тем, касающихся объединенных ячеек. Оно и понятно: любое обращение к ячейке таблицы, находящейся в объединенной области, приводит к возникновению ошибки. Это внутренняя проблема редактора Word, связанная с архитектурой таблицы, и с этим ничего не поделаешь.

Однажды потребовалось перевести в базу данных нормативные данные, оформленные в редакторе Word в виде таблиц. И сразу же возникли проблемы с объединенными ячейками — как заполучить данные, находящиеся в объединенных ячейках.

Но, оказывается, именно возникновение исключений при обращении к отсутствующим ячейкам и позволяет решить эту проблему. Логика простая: раз возникло исключение при обращении к какой-либо ячейке, значит с этой ячейкой не все гладко. Значит, надо этим воспользоваться. На этом принципе основана методика распознавания таблиц Word, представленная в данной статье.

Для начала создаем запись:

re>TWordTableCell = record Merged : boolean;//индикатор объединенности ячеек VertCellMerged : boolean; PrevMerCol : integer; NextMerCol : integer; EndMerRow : integer; EndMerCol : integer; CellWidth : single;//ширина ячейки CellHeight : single; TableLeft : single; Text : OleVariant;//содержимое ячейки. К сожалению, только текст. end;

и массивный тип

re>TWordTableCells = array of array of TWordTableCell;

Данный массив будет характеризовать всю таблицу, а элементы массива — каждую ячейку. Что означают поля записи TWordTableCell, можно догадаться по названиям.

В следующем фрагменте показаны переменные, необходимые для работы с таблицей.

re>TMainForm = class(TForm) … WApp : WordApplication; FTable : Table; FMaxUsedRows : integer; //максимальное количество используемых строк в компоненте FMaxUsedCols : integer; //максимальное количество столбцов в компоненте FWordTableCell : TWordTableCells;//массив ячеек компонентаprocedure GetTable;//процедура считывает некоторые свойства ячеек таблицы Word в запись FWordTableCell procedure CalcWordTableProp;//процедура обрабатывает считанные данныеpublic end;

Ядром обработки таблицы является следующая процедура:

re>procedure TMainForm.GetTable; var i,j, UndoCount : integer; NumRows, NumColumns : OleVariant; bool : boolean; begin FTable := WApp.ActiveDocument.Tables.Item(1); //первая таблица активного документа FMaxUsedRows := FTable.Rows.Count; FMaxUsedCols := FTable.Columns.Count; SetLength(FWordTableCell,0, 0); SetLength(FWordTableCell,FMaxUsedRows+1, FMaxUsedCols+1); WApp.Visible := true; NumColumns := 1; for i := 1 to FMaxUsedRows do for j := 1 to FMaxUsedCols do begin FWordTableCell[i,j].VertCellMerged := false; try FTable.Cell(i,j).HeightRule := wdRowHeightAtLeast; if FTable.Cell(i,j).Width >= 99999 then begin NumRows := 1; UndoCount := 1; repeat inc(NumRows); inc(UndoCount); if (FTable.Cell(i,j).Width >= 99999) then begin bool := false; try try try FTable.Cell(i,j).Split(NumRows, NumColumns); NumRows := 1; except end; except end; except end; end else bool := true; until bool; FWordTableCell[i,j].CellWidth := FTable.Cell(i,j).Width; while UndoCount <> 1 do begin dec(UndoCount); WApp.ActiveDocument.Undo(EmptyParam); end; end else FWordTableCell[i,j].CellWidth := FTable.Cell(i,j).Width; FWordTableCell[i,j].CellHeight := FTable.Cell(i,j).Height; FWordTableCell[i,j].Merged := false; FWordTableCell[i,j].Text := FTable.Cell(i,j).Range; except FWordTableCell[i,j].CellWidth := 0; FWordTableCell[i,j].CellHeight := FTable.Rows.Height; FWordTableCell[i,j].Merged := true; end; FWordTableCell[i,j].PrevMerCol := —1; FWordTableCell[i,j].NextMerCol := —1; end; CalcWordTableProp; end;

В этой процедуре выполняется последовательное обращение к ячейкам таблицы и формирование записи FWordTableCell для каждой ячейки, характеризующей считываемую таблицу Word (как ни странно, здесь необходима именно тройная упаковка в try except end). Нужно обратить внимание, что некоторые ячейки приходится разбивать, т.к. для них невозможно определить никаких данных. (К сожалению, при прогонке программы в ручном режиме клавишами F7, F8 или F9, всегда возникает сообщение об ошибке, даже если отключить Tools->Debugger Option->Language Exception

Stop on Delphi Exception). Как видно из кода, инициализируются не все поля записи FWordTableCell. Для определения остальных полей производится обработка данных в процедуре CalcWordTableProp:

re>procedure TMainForm.CalcWordTableProp; var i, j, k, N, EndCol: integer; FTableWidth : single; procedure CalcTableVertMergedInfo(i,j:integer); var Col : integer; begin for Col := 1 to FMaxUsedCols do if ((abs(FWordTableCell[i-1,Col].TableLeft- FWordTableCell[i,j].TableLeft) 1) and (FWordTableCell[i-1,Col].CellWidth <> 0))then begin FWordTableCell[i-1,Col].VertCellMerged := true; FWordTableCell[i-1,Col].NextMerCol := j; FWordTableCell[i,j].PrevMerCol := col; FWordTableCell[i,j].CellWidth := FWordTableCell[i-1,Col].CellWidth; Exit; end; end; begin for i := 1 to FMaxUsedRows do begin FWordTableCell[i,0].TableLeft:=0; for j := 1 to FMaxUsedCols do begin with FWordTableCell[i,j] do begin TableLeft := FWordTableCell[i,j — 1].TableLeft+ FWordTableCell[i,j — 1].CellWidth; FTableWidth := 0; for k := 1 to FMaxUsedCols do FTableWidth := FTableWidth + FWordTableCell[i-1, k].CellWidth; VertCellMerged := false; if Merged and not (FWordTableCell[i,j].TableLeft = FTableWidth) then CalcTableVertMergedInfo(i,j); end; end; end; for j := 1 to FMaxUsedCols do for i := 1 to FMaxUsedRows do if FWordTableCell[i,j].VertCellMerged then begin N := 0; EndCol := j; while FWordTableCell[i + N, EndCol].NextMerCol <> —1 do begin EndCol := FWordTableCell[i + N, EndCol].NextMerCol; inc(N); end; FWordTableCell[i,j].EndMerRow := i + N; FWordTableCell[i,j].EndMerCol := EndCol; end; end;

Итак, заполнены все поля записи FWordTableCell для всех ячеек. Есть информация о каждой ячейке, которой можно воспользоваться, например, чтобы узнать содержимое любой ячейки.

Для демонстрации работы с массивом FWordTableCell воспользуемся компонентом TMStringGrid — аналогом компонента TStringGrid, но с возможностью объединения ячеек. Можно было бы использовать компонент TStringGrid, т.к. он работает гораздо быстрее TMStringGrid, или любой другой подходящий компонент, но так будет нагляднее.

Для объединения ячеек в таблице TMStringGrid предусмотрены функции с перегрузкой:

re>TMStringGrid.MergeCells(ALeft, ATop, ARight, ABottom : LongInt) : integer;

re>TMStringGrid. MergeCells(Selection : TMGridRect) : integer;

где ALeft, ATop, ARight, ABottom — координаты левой верхней и правой нижней объединяемых ячеек таблицы TMStringGrid.

Однако, в массиве FWordTableCell эти координаты отсутствуют, и их нужно вычислить по данным массива FWordTableCell.

Для этой цели введем дополнительные типы (данные типы нужны исключительно для подготовки данных для компонента TMStringGrid):

re>TRowCell = record CellWidth : single; Index : integer; MergRect : TMGridRect; FirstMerRow : integer; FirstMerCol : integer; LastMerRow : integer; LastMerCol : integer; FirstMerg : boolean; Merged : boolean; Text : string; end; TGridCol = class(TCollectionItem) private RowCell : array of TRowCell; end; TGridCols = class(TCollection) FForm : TMainForm; function GetItem(Index : integer) : TGridCol; protected property Items[Index : integer] : TGridCol read GetItem; constructor Create(AOwner : TComponent); function Add : TGridCol; end;

а также, переменные и процедуры:

re>TMainForm = class(TForm) . private . FGridCols : TGridCols; procedure WriteToGrid; procedure CalcGridProps; . public end;

Здесь процедура CalcGridProps заполняет массив RowCell коллекции TGridCol для каждой ячейки (Вычисляется действительное число колонок таблицы, т.к. FMaxUsedCols не является таковым):

re>procedure TMainForm.CalcGridProps; var i,j,k : integer; RowCell : array of TRowCell; MinCellWidth : single; DeltaInd : array of integer; itBreak : boolean; begin FGridCols.Clear; FGridCols.Add; SetLength(RowCell, FMaxUsedRows + 1); SetLength(DeltaInd, FMaxUsedRows + 1); for i := 1 to FMaxUsedRows do begin RowCell[i].CellWidth := FWordTableCell[i, 1].CellWidth; RowCell[i].Text := FWordTableCell[i, 1].Text; DeltaInd[i] := 0; RowCell[i].LastMerRow := FWordTableCell[i, 1].EndMerRow; if RowCell[i].LastMerRow = 0 then RowCell[i].LastMerRow := i; RowCell[i].FirstMerg := (FWordTableCell[i, 1].PrevMerCol = —1); RowCell[i].FirstMerCol := —1; RowCell[i].LastMerCol := —1; end; k := 0; repeat try MinCellWidth := RowCell[1].CellWidth; for i := 1 to FMaxUsedRows do begin if MinCellWidth 0 then break; if MinCellWidth > RowCell[i].CellWidth then MinCellWidth := RowCell[i].CellWidth; end; if MinCellWidth 0 then break; for i := 1 to FMaxUsedRows do if Abs(MinCellWidth — RowCell[i].CellWidth) < 0.1 then RowCell[i].CellWidth := MinCellWidth; FGridCols.Add; for i := 1 to FMaxUsedRows do begin with FGridCols.Items[k].RowCell[i] do begin CellWidth := MinCellWidth; Text := RowCell[i].Text; if RowCell[i].FirstMerg and (RowCell[i].LastMerRow <> i)and (RowCell[i].FirstMerCol = —1) then LastMerRow := RowCell[i].LastMerRow; end; if MinCellWidth < RowCell[i].CellWidth then begin FGridCols.Items[k + 1].RowCell[i].CellWidth := RowCell[i].CellWidth — MinCellWidth; if RowCell[i].FirstMerg and (RowCell[i].FirstMerCol = —1) then RowCell[i].FirstMerCol := k + 1; RowCell[i].LastMerCol := k + 2; end; if FGridCols.Items[k + 1].RowCell[i].CellWidth <> —1 then begin RowCell[i].CellWidth := FGridCols.Items[k + 1].RowCell[i].CellWidth; inc(DeltaInd[i]); end else begin if (RowCell[i].FirstMerCol <> —1) then begin FGridCols.Items[RowCell[i].FirstMerCol — 1].RowCell[i].LastMerCol := RowCell[i].LastMerCol; FGridCols.Items[RowCell[i].FirstMerCol — 1].RowCell[i].FirstMerCol := RowCell[i].FirstMerCol; FGridCols.Items[RowCell[i].FirstMerCol — 1].RowCell[i].LastMerRow := RowCell[i].LastMerRow; RowCell[i].LastMerCol := —1; RowCell[i].FirstMerCol := —1; end; RowCell[i].CellWidth := FWordTableCell[i, k + 2 — DeltaInd[i]].CellWidth; RowCell[i].FirstMerg := FWordTableCell[i, k + 2 — DeltaInd[i]].PrevMerCol = —1; RowCell[i].LastMerRow := FWordTableCell[i, k + 2 — DeltaInd[i]].EndMerRow; try RowCell[i].Text := FWordTableCell[i, k + 2 — DeltaInd[i]].Text; except RowCell[i].Text := »; end; end; end; inc(k); except end; until k > FMaxUsedCols + 50; for j := 0 to FGridCols.Count — 1 do for i := 1 to FMaxUsedRows do with FGridCols.Items[j].RowCell[i] do begin MergRect := GetMGridRect(j + 1, i, j + 1, i); if LastMerCol <> 0 then begin Merged := true; MergRect := GetMGridRect(FirstMerCol, i, LastMerCol, i); end; if LastMerRow <> 0 then begin Merged := true; MergRect := GetMGridRect(MergRect.Left, MergRect.Top, MergRect.Right, LastMerRow); end; end; end;

Процедура WriteToGrid формирует копию таблицы Word в компоненте TMStringGrid:

re>procedure TMainForm.WriteToGrid; var i, j, col : integer; Selection : TMGridRect; begin MStringGrid1.ClearMergedCells; MStringGrid1.ColCount := FGridCols.Count — 1 ; MStringGrid1.RowCount := FMaxUsedRows; for j := 0 to FGridCols.Count — 1 do begin if j < MStringGrid1.ColCount then MStringGrid1.ColWidths[j] := round(FGridCols.Items[j].RowCell[1].CellWidth); for i := 1 to FMaxUsedRows do begin if j < MStringGrid1.ColCount then MStringGrid1.Cells[j, i — 1] := FGridCols.Items[j].RowCell[i].Text; end; end; for j := 0 to FGridCols.Count — 1 do begin for i := 1 to FMaxUsedRows do begin if FGridCols.Items[j].RowCell[i].Merged then with FGridCols.Items[j].RowCell[i] do begin Selection.Left := MergRect.Left — 1; Selection.Top := MergRect.Top — 1; Selection.Right := MergRect.Right — 1; Selection.Bottom := MergRect.Bottom — 1; MStringGrid1.MergeCells(Selection); MStringGrid1.Cells[Selection.Left, Selection.Top] := FGridCols.Items[j].RowCell[i].Text; end; end; end; end;

Для демонстрации работы приведенного выше кода была создана программа DemoWordTable.exe (Рисунок 1).

Рисунок 1. Интерфейс программы

Нажав кнопку "Открыть таблицу Word", можно открыть документ Word, содержащий таблицу. Программа считывает первую таблицу и создает ее копию в компоненте TMStringGrid (Рисунок 2).

Рисунок 2. Таблица в Word (на заднем плане) и ее копия на форме MainForm

Кроме того, программа позволяет и обратное действие, т.е. создавать произвольную таблицу на форме и переносить ее в документ Word.

Для изменения числа строк и столбцов, а также фиксированных строк и столбцов предусмотрены поля Edit (После изменения значения в поле Edit нужно нажать "Enter", чтобы изменения вступили в силу). Чтобы объединить какие-либо ячейки, нужно сперва их выделить, удерживая клавишу Shift и нажимая клавиши со стрелками. Затем щелкнуть правой кнопкой мыши.

Откроется Popup Menu с кнопками "Объединить ячейки" и "Разбить ячейки" (Рисунок 3.). Нажатие кнопки "Объединить ячейки" приведет к объединению ячеек выделенной области. Если выделения нет, т.е. выделена только одна ячейка, то кнопка "Объединить ячейки" открывает редактор ячеек (Рисунок 4). В редакторе можно выбрать нужные ячейки для объединения, ввести текст, который будет находиться в ячейке и выбрать положение текста в ячейке (TO_LEFT, TO_CENTER, TO_RIGHT).

Рисунок 3. Объединение ячеек

Рисунок 4. Объединение ячеек с помощью редактора

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

Рисунок 5. Таблица на форме MainForm (на заднем плане) и ее копия в Word

Напоследок нужно сказать, что есть еще одна уловка при объединении ячеек таблицы Word: если заранее известны все номера ячеек, которые нужно объединить, то объединение нужно начать справа налево, снизу вверх. Тогда объединенные ячейки не спутают индексы ячеек, и все пройдет гладко:

re>procedure TMainForm.WriteToWordTable; var WDoc : WordDocument; i, j, N : integer; Cl : Cell; MrgedCellInfo : TMrgedCellInfo; begin WDoc := WApp.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);//создаем документ WApp.Visible := true; FMaxUsedRows := MStringGrid1.RowCount; FMaxUsedCols := MStringGrid1.ColCount; FTable2 := WDoc.Tables.Add(WDoc.Content, FMaxUsedRows, FMaxUsedCols, EmptyParam, EmptyParam); //создаем таблицу for i := 1 to 6 do SetBorders(FTable2, BorderType[i]); for i := MStringGrid1.ColCount — 1 downto 0 do for j := MStringGrid1.RowCount — 1 downto 0 do if MStringGrid1.GetMergedInfo(i, j, MrgedCellInfo) then begin if (i = MrgedCellInfo.MergedRect.Left) and (j = MrgedCellInfo.MergedRect.Top) then begin FTable2.Cell(j + 1, i + 1).Range.Text := MStringGrid1.Cells[i, j]; Cl := FTable2.Cell(MrgedCellInfo.MergedRect.Bottom + 1, MrgedCellInfo.MergedRect.Right + 1); FTable2.Cell(j + 1, i + 1).Merge(Cl); end; end else FTable2.Cell(j + 1, i + 1).Range.Text := MStringGrid1.Cells[i, j]; //Копия таблицы создана. end;

К сожалению, хотя данный метод и работает, но очень уж медленно из за неповоротливости редактора Word.

К статье прилагается пример:

Смотрите также материалы по темам: [Работа с MS Word]

Обсуждение материала [ 14-11-2018 06:31 ] 11 сообщений

Время на сайте: GMT минус 5 часов

Функция может не работать в некоторых версиях броузеров.

Оцените статью
InternetDoc.ru
Добавить комментарий