В прошлой статье (Читаем файл Excel (xls) в Delphi) был рассмотрен способ чтения данных из xls файла и его импорт в Delphi. Теперь перейдем к сохранению, т.е. к экспорту данных из Delphi. Экспорт, как и импорт, будет осуществляться через посредника, т.е. Excel. Поэтому для работы приложения потребуется установленная копия MS Excel 2003-2010 (выше не тестировал).
Добавьте на форму кнопку, диалог сохранения, и таблицу StringGrid. Для того чтоб появилась возможность редактирования таблицы StringGrid необходимо в ее свойствах включить опцию goEditing:
Визуальные приготовления для нашего примера готовы. Переходим к написанию кода.
Как и в случае чтения xls нам понадобится библиотека ComObj. Добавьте ее в uses. Ниже приведен листинг процедуры экспорта, добавьте его после ключевого слова implementation.
procedure Xls_Save(XLSFile:string; Grid:TStringGrid); begin //делаем окно Excel невидимым //создаем книгу для экспорта
//создаем объект Sheet(страница) и указываем номер листа (1) //задаем имя листу //считываем кол-во столбцов и строк в StringGrid //считываем значение из каждой ячейки и отправляем в таблицу Excel //отключаем все предупреждения Excel //обработка исключения при сохраннении файла //очищаем выделенную память end; |
Алгоритм работы процедуры:
- Создаем ссылку на объект и записываем ее в переменную ExlApp := CreateOleObject(‘Excel.Application’);
- С помощью ExlApp.Workbooks.Add; создаем пустую книгу в Excel (книга скрыта командой ExlApp.Visible := false;). По умолчанию книга содержит 3 листа. Если в Add добавить параметр 1 (ExlApp.Workbooks.Add(1)), то будет создана книга с одним листом.
- Далее код похож на чтение, только в цикле мы меняем присваемые значения. Теперь копируются значения из таблицы Delphi (StringGrid) в лист Excel.
- Команда ExlApp.DisplayAlerts := False отключает все сообщения Excel. В нашем случае это отключит сообщение («Книга уже существует! Хотите ее перезаписать?») возникающее при перезаписи уже существующего файла. Если этого не сделать, то при ответе «Нет», возникнет ошибка, а так файл будет «молча» перезаписан.
- Далее следует обработка исключения. У меня установлены две версии Excel (2003 и 2010) и был обнаружен такой момент, что значения типа файла, отправляемые команде SaveAs, отличаются в этих версиях, из-за чего возникает ошибка сохранения. В конструкции Try Except описаны варианты сохранения. Если на компьютере пользователя установлена версия Excel 2003, то будет выполнена команда ExlApp.Workbooks[1].saveas(XLSFile, xlExcel9795), где xlExcel9795 – значение типа xls файла 95-2003. Иначе, если возникла ошибка при сохранении в первом случае, то будет выполнена команда ExlApp.Workbooks[1].saveas(XLSFile, xlExcel8). В 2007-2010 значение xlExcel8 соответствует типу «Excel 97-2003 (.xls)». Важный момент: Исключение обрабатывается при запуске EXE проекта, в режиме разработки работа приложения завершится ошибкой.
- Команда ExlApp.Workbooks[1].saveas(XLSFile, ‘Значение типа выходного файла’) выполняет сохранение файла с именем XLSFile и заданным значением типа.
Вот и все. С полным листингом проекта Вы можете ознакомиться, скачав приложенный ниже архив. Так же в архиве содержится список констант типов, позволяющий по желанию расширить список экспортируемых типов доступных Excel.
Прикрепленный файл: Экспорт в Excel на Delphi.zip