Группы и рассылки:

Вы здесь

Экспорт данных в 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

 

 

Автор: 
Deys

Комментарии

Спасибо автору за статью!!! Но все-же есть вопрос: как сохранить данные из StrinGrid в уже существующий Excel ??

 

Пожалуйста!
Все тоже самое только вместо метода добавления книги. Метод Open и в конце вместо метода SaveAs используйте Save. Как открыть существующую книгу Excel описано в статье "Читаем файл Excel (xls) в Delphi". Следующей статьей опишу про редактирование книги и сохранение:)

 
Здравствуйте!!! Очень благодарен за статью, так как она помогла мне в написании курсовой работы.
Но я так и не смог разобраться  как же сохронять в уже существующий файл(а не создавать новый). Буду очень благодарен если покажете на примере. Спасибо.laugh
 

Добрый день, спасибо за статью, очень помогла. Буду очень признателен, если напишите статью про сохранение графика из делфи в екзел(график изображен при помощи TChart). Зарание спасибо.

 

Прога не працює

 
Как именно не работает? Какие ошибки выдает?
 
 

Так, а что делать, если у меня в гриде лежат данные на русском языке и при сохранение в экселе становится все плохо с кодировкой?

 

А что сделать если при сохранении в эксель данных на русском языке кодировке становится плохо?

 
Приветствую.
У меня такой проблемы нет. С русскими символами все в норме.
В какой кодировке у Вас выводятся символы? Или скиньте ссылку на скрин выведенного текста.
 
 

при получении значений в делфи например 9.9Е-5 в ексель переносится как 9.9Е+09, хотя все остальные значения без Е переносит без ошибок... как быть в такой ситуации???

 

при получении значений в делфи например 9.9Е-5 в ексель переносится как 9.9Е+09, хотя все остальные значения без Е переносит без ошибок... как быть в такой ситуации???

 

Все круто работает. А как сделать чтобы я сам выбрал куда сохранять?

 

Xls_Save('c:\test.xls', MyTable);

Подставьте вместо 'c:\test.xls' любой полный путь в переменной

 

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Для предотвращения регистрации спам-роботов введите символы с картинки.
CAPTCHA на основе изображений
Введите символы, изображенные на картинке.
Разместить свое видео на сайте
Вы можете разместить свои 
видео-уроки на сайте
БЕСПЛАТНО!


Подробнее>>>