Работа с Word таблици с обединени клетки – Програмни продукти
Но се оказва, че именно появата на изключения при достъп до липсващи клетки ни позволява да разрешим този проблем. Логиката е проста: тъй като е възникнало изключение при достъп до клетка, това означава, че не всичко върви гладко с тази клетка. Така че трябва да го използвате. Техниката за разпознаване на таблици в Word, представена в тази статия, се основава на този принцип.
Нека започнем със създаване на запис:
и масивен тип
Този масив ще характеризира цялата таблица, а елементите на масива - всяка клетка. Какво означават полетата на записа TWordTableCell може да се познае от имената.
Следващият фрагмент показва променливите, необходими за работа с таблицата.
Ядрото на обработката на таблицата е следната процедура:
Тази процедура последователно осъществява достъп до клетките на таблицата и генерира запис FWordTableCell за всяка клетка, която характеризира таблицата на Word, която се чете (достатъчно странно, тук е необходимо тройно опаковане в опита, освен край). Трябва да обърнете внимание, че някои клетки трябва да бъдат разбити, т.к. за тях не могат да се дефинират данни. (За съжаление, когато стартирате програмата ръчно с F7, F8 или F9, винаги се появява съобщение за грешка, дори ако изключите Tools->Debugger Option->Language Exception
Спрете на Delphi Exception). Както можете да видите от кода, не всички полета на записа FWordTableCell са инициализирани. За да се определят оставащите полета, данните се обработват в процедурата CalcWordTableProp:
И така, всички полета на записа FWordTableCell за всички клетки са попълнени. Има информация за всяка клетка, която може да се използва, например, за да разберете съдържанието на всяка клетка.
За да демонстрирате как се работи с масива FWordTableCellДа използваме компонента TMStringGrid - аналог на компонента TStringGrid, но с възможност за обединяване на клетки. Би било възможно да се използва компонентът TStringGrid, защото той е много по-бърз от TMStringGrid или всеки друг подходящ компонент, но ще бъде по-визуален.
За обединяване на клетки в таблицата TMTringGrid се предоставят претоварени функции:
където ALeft, ATtop, ARight, ABottom са координатите на горната лява и долната дясна клетка на таблицата TMStringGrid, която трябва да се обедини.
Тези координати обаче липсват в масива FWordTableCell и трябва да се изчислят от данните в масива FWordTableCell.
За целта ще въведем допълнителни типове (необходими са само за подготовка на данни за компонента TMTringGrid):
а също и променливи и процедури:
Тук процедурата CalcGridProps запълва масива RowCell на колекцията TGridCol за всяка клетка (действителният брой колони на таблицата също се изчислява, тъй като FMaxUsedCols не е такъв):
Процедурата WriteToGrid създава копие на таблицата на Word в компонента TMTringGrid:
За да се демонстрира работата на горния код, беше създадена програмата DemoWordTable.exe (Фигура 1).
Като щракнете върху бутона „Отваряне на таблица на Word“, можете да отворите документа на Word, съдържащ таблицата. Програмата чете първата таблица и създава нейно копие в компонента TMTringGrid (Фигура 2).
Освен това програмата позволява обратното действие, т.е. създайте произволна таблица във формуляра и я прехвърлете в документ на Word.
След като създадете таблицата, можете да кликнете върху бутона "Write Word Table", след което ще бъде създаден нов Word документ, а в него таблица, която ще бъде копие на създадената таблица (Фигура 5).
И накрая, трябва да се каже, че има още един трик при обединяването на клетки от таблица на Word: аковсички номера на клетките, които ще се обединяват, са известни предварително, тогава обединяването трябва да започне отдясно наляво, отдолу нагоре. Тогава обединените клетки няма да объркат индексите на клетките и всичко ще върви гладко: