Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
TExcelManager

Автор: Писарев Юрий

Компонент предназначен для работы с таблицами Excel. Он позволяет находить любые таблицы в любом месте документа Excel и импортировать их в таблицы компонента TTable. Можно также экспортировать таблицы из TTable в документы Excel. Существует две версии компонента - для Microsoft Office 2000 и для Microsoft Office XP.

Принцип работы

Компонент ищет таблицу по ячейкам ее верхнего ряда (шапка таблицы). Существует структура типа TTableInfo, которая описывает критерии поиска:


TFilterOption = (foCaseInsensitive, foSoftFiltration);
THeadLine = record
  Cells: array of string;
  FilterOptions: array of TFilterOption;
end;
TBorderOption = (boRight, boBottom);
TBorderOptions = set of TBorderOption;
TTableInfo = record
  HeadLine: THeadLine;
  Rect: TRect;
  BorderOptions: TBorderOptions;
  TableIndex, BottomIndex: Integer;
end;

Описание шапки таблицы находится в элементе TTableInfo.HeadLine, где TTableInfo.HeadLine.Cells это строковый массив верхнего ряда ячеек, а TTableInfo.HeadLine.FilterOptions это массив, который соответствует каждой ячейки массива TTableInfo.HeadLine.Cells и определяет способ сравнения элементов массива TTableInfo.HeadLine.Cells с ячейками таблицы Excel. TTableInfo.HeadLine.FilterOptions может быть двух типов:

  • foCaseInsensitive - означает, что соответствующий элемент массива Cells должен в точности совпадать с ячейкой в документе Excel. Регистр не учитывается.
  • foSoftFiltration - означает, что каждая ячейка из документа Excel может содержать в себе соответствующий элемент массива Cells. Регистр не учитывается.
Если массив TTableInfo.HeadLine.FilterOptions пустой, то для сравнения используется свойство DefaultFilter компонента ExcelManager. Задавать этот массив не обязательно, а в большинстве случает вообще не нужно. Тем не менее он позволяет определять достаточно гибкие критерии поиска.

Элемент TTableInfo.Rect обозначает координаты и размеры таблицы по отношению к шапке таблицы:

  • Left - обозначает смещение влево относительно левой верхней ячейки таблицы (шапки таблицы).
  • Right - обозначает количество колонок таблицы.
  • Top - обозначает смещение вниз относительно левой верхней ячейки таблицы (шапки таблицы).
  • Bottom - обозначает количество рядов таблицы.

Задавать ширину (Rect.Right) и высоту (Rect.Bottom) таблицы не обязательно, так как компонент сам может определять размеры таблицы. Для автоопределения ширины таблицы, элемент TTableInfo.BorderOptions должен содержать boRight и, соответственно, для автоопределения высоты таблицы TTableInfo.BorderOptions должен содержать boBottom. Определение границы осуществляется путем нахождение первой пустой ячейки. Просмотр таблицы в документе Excel происходит сверху вниз, слева направо. Для изменения способа обнаружения нижней границы таблицы используется еще один элемент: TTableInfo.BottomIndex. Он определяет колонку, которая должна содержать пустую ячейку. Например, если TTableInfo.BorderOptions включает в себя boBottom и TTableInfo.BottomIndex равен 0, то определение высоты таблицы будет находиться по первой пустой ячейке колонки 0, на рисунке это колонка "A":

В таком случае высота таблицы будет равна 7, то есть будет содержать в себе 7 рядов. Если же TTableInfo.BorderOptions включает boBottom и TTableInfo.BottomIndex равен 1, то определение высоты таблицы будет находиться по первой пустой ячейке колонки 1, на рисунке это колонка "B" и высота таблицы будет равна 5, то есть будет содержать в себе 5 рядов.

Так как в документе Excel может быть найдена более чем одна таблица, удовлетворяющая условиям структуры TTableInfo, то существует элемент: TTableInfo.TableIndex. Он указывающий на индекс нужной таблицы. Чаще всего документ Excel содержит в себе только одну искомую таблицу, поэтому целесообразно задавать значение TTableInfo.TableIndex равным 0.

Для импорта таблицы используется функция:

function ImportTable(Table: TTable; TableInfo: TTableInfo): Boolean; virtual;

В ней указывается таблица Table, которая будет заполнена соответствующими данными и информация о таблице, которую необходимо найти. Если все прошло успешно, то функция возвращает истину. Прежде чем импортировать таблицу, нужно открыть документ Excel. Это делается с помощью процедуры:

procedure Open(const FileName: string); virtual;

Параметр FileName содержит путь к файлу Excel. Соответственно, после открытия файла его нужно закрыть. Делается это с помощью процедуры:

procedure Close(SaveChanges: Boolean); virtual;

Параметр SaveChanges определяет, нужно ли сохранять изменения.

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


TExportTableInfo = record
  Cell1, Cell2: string;
  Rect: TRect;
end;

Элементы TExportTableInfo.Cell1 и TExportTableInfo.Cell2 задают координаты левой верхней ячейки экспортируемой таблицы в формате Excel. То есть, например, если необходимо экспортировать таблицу в самое начало документа Excel, то задаем значение TExportTableInfo.Cell1 равным "A", значение TExportTableInfo.Cell2 равным "1", в таком случае левая верхняя ячейка таблицы разместиться в документе Excel по адресу "A1". Элемент TExportTableInfo.Rect определяет смещение экспортируемой таблицы относительно координат TExportTableInfo.Cell1 и TExportTableInfo.Cell2. Используются только элементы Left и Top структуры TExportTableInfo.Rect. На первый взгляд это кажется бессмысленным. Действительно, зачем нужно смещение, если и так можно задать любую координату элементами TExportTableInfo.Cell1 и TExportTableInfo.Cell2? Все дело в том, что в Excel специфическая система координат. Для пользователя она весьма удобна, а для программиста это небольшая проблема. Горизонтальная координата - это система исчисления, состоящая из английского алфавита. То есть, двадцатишестиричная система исчисления. Но беда в том, что в этой системе исчисления нет нуля. То есть если использовать двадцатишестиричную систему исчисления по правилам, то A это 0, B это 1, C это 2 и так далее. Но в любом документе присутствуют такие координаты, как AA, AB, AC и так далее. По всем правилам они должны выглядеть, как A, B, C и так далее, так как первым числом ноль (A) никогда не ставится. Но это все философия. Вернусь к тому, от чего я ушел. Если нужно задать координату, скажем 100:200, то не нужно пересчитывать горизонтальную координату в формат Excel, достаточно установить, скажем, TExportTableInfo.Cell1 в "A", TExportTableInfo.Cell2 в "1", TExportTableInfo.Rect.Left в 100 и TExportTableInfo.Rect.Top в 200.

Для экспорта используется функция

function ExportTable(Table: TTable; ExportTableInfo: TExportTableInfo; 
  const Info: string): Boolean; virtual;

В параметре Table задается экспортируемая таблица. Параметр ExportTableInfo определяет условия экспорта. Функция возвращает истину, если все прошло успешно. Перед экспортом нужно открыть файл документа Excel, а после экспорта - закрыть, точно также, как для процесса импорта.

Демонстрационная программа позволяет импортировать таблицы Excel в таблицы компонента TTable. Принцип работы программы таков, что сначала задается верхняя директория. Затем производится поиск по всех ее поддиректориях и просматриваются все файлы Excel. Если они содержат информацию, то она из них извлекается и записывается в файл формата Paradox в отдельную директорию. На основе импортированных данных строится отчет, содержащий в себе информацию по всем найденным таблицам. Этот отчет можно просмотреть и распечатать. Вместе с программой поставляется файл Excel, в котором содержится искомая информация.

Заключение

Как уже было сказано, есть два типа компонента - для работы с Microsoft Office 2000 и Microsoft Office XP. Для использования компонента необходим компонент TExcelApplication, находящийся на странице Servers. На него должна быть установлена ссылка - TExcelManager.ExcelApplication. Компонент TExcelApplication должен соответствовать выбранной версии Microsoft Office. Компоненты будут работать в Delphi 6.0 и Delphi 7.0. Но, насколько я знаю, в Delphi 6.0 нет встроенной поддержки Microsoft Office XP. Для компонента поставляются две программы тестирования для Microsoft Office 2000 и для Microsoft Office XP. Программа для тестирования компонента под Microsoft Office XP написана в Delphi 7.0, программа для тестирования компонента под Microsoft Office 2000 написана в Delphi 6.0.

ExcelManager для Microsoft Office XP
Программа для Microsoft Office XP
ExcelManager для Microsoft Office 2000
Программа для Microsoft Office 2000

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay