RSS

Экспорт данных в Excel из Delphi

В прошлой статье (Читаем файл 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);
const
       xlExcel9795 = $0000002B;
       xlExcel8 = 56;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, c:integer;

begin
  //создаем объект Excel
   ExlApp := CreateOleObject(‘Excel.Application’);

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //создаем книгу для экспорта
  ExlApp.Workbooks.Add;

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, в который будем осуществлять экспорт
  Sheet := ExlApp.Workbooks[1].WorkSheets[1];

  //задаем имя листу
  Sheet.name:=’Данные_из_Delphi’;

    //считываем кол-во столбцов и строк в StringGrid
    r:=Grid.RowCount;
    c:=Grid.ColCount;

    //считываем значение из каждой ячейки и отправляем в таблицу Excel
     for j:= 1 to r do
       for i:= 1 to c do
         sheet.cells[j,i]:=Grid.Cells[i-1,j-1];

    //отключаем все предупреждения Excel
     ExlApp.DisplayAlerts := False;

    //обработка исключения при сохраннении файла
    try
       //формат xls 97-2003 если установлен 2003 Excel
       ExlApp.Workbooks[1].saveas(XLSFile, xlExcel9795);
       showmessage(‘Файл сохранил 2003-ий офис’);
    except
      //формат xls 97-2003 если установлен 2007-2010 Excel
      ExlApp.Workbooks[1].saveas(XLSFile, xlExcel8);
      showmessage(‘Файл сохранил 2007 или 2010-ый офис’);
    end;
    
 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

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