Последние записи
- Как запустить программу указанную в Edit.Text
- Скачать файл с использованием потока
- Поиск слова в Memo
- Распаковщик формата .img из GTA San Andreas
- Подсчет количества повторяющихся букв в файле
- Простейший скрипт загрузки картинки с помощью php
- Рассылка. Выпуск 154
- Получение картинки с веб-камеры
- Скопировать определённый кусок image
- Сделать printscreen экрана и сохранить
29th
Янв
Как добавить таблицу из StringGrid в excel?
Posted by Chas under Delphi
Xardas
Можно сделать несколькими способами. Давайте реализуем один из них (я думаю, что самый простой) – это подправим функцию, добавив в нее еще несколько параметров. Объявление функции будет выглядеть так:
function SaveAsExcelFile(sg1, sg2: TStringGrid; ASheetName, ASheetName1, AFileName: string): Boolean;
То есть добавили второй грид и второе имя листа. Далее подготавливаем данные к обработке. Добавляем к описанию переменных функции еще одну переменную Data1:
........
var
XLApp, Sheet, Data, Data1: OLEVariant;
.........
Далее по аналогии с тем, как создается массив данных из первого грида, составляем второй массив:
Data1 := VarArrayCreate([1, sg2.RowCount, 1, sg2.ColCount], varVariant);
for i := 0 to sg2.ColCount - 1 do
for j := 0 to sg2.RowCount - 1 do
Data1[j + 1, i + 1] := sg2.Cells;
Далее у нас создается ОЛЕ объект, скрывается эксель, а перед тем как создать новую книгу, мы укажем количество листов таким образом:
XLApp.SheetsInNewWorkbook := 2;
Теперь можно приступать к созданию книги:
XLApp.Workbooks.Add; // здесь лучше не указывать параметр xlWBatWorkSheet
Книгу создали, в ней уже будет 2 листа. Далее заполняем ее. Переменную Sheet будем использовать 2 разы, дабы не создавать еще одну (мы могли бы так же поступить и с переменной Data, если будет желание, то можете самостоятельно реализовать это, экономим килобайты памяти, так сказать )
Sheet := XLApp.Workbooks[1].WorkSheets[1];
Sheet.Name := ASheetName;
Sheet.Range[RefToCell(1, 1), RefToCell(sg1.RowCount,
sg1.ColCount)].Value := Data;
Sheet := XLApp.Workbooks[1].WorkSheets[2];
Sheet.Name := ASheetName1;
Sheet.Range[RefToCell(1, 1), RefToCell(sg2.RowCount,
sg2.ColCount)].Value := Data1;
Ну вот, собственно, и занесли данные в два листа. Остальной код оставляем без изменения. Вызов процедуры немного изменится:
if SaveAsExcelFile(sg1, sg2, 'Лист1', 'Лист2', 'Ваш путь') then
ShowMessage('Экспорт в Эксель прошел успешно');
Прошу прощения за возможные опечатки, а вообще – эксперементируйте, ибо можно было реализовать по-другому. Например, вызвать два раза функцию для первого и второго грида, задав немного другие параметры, или, например, вынести процесс формирования данных для записи в эксель в отдельную процедуру… ну, и так далее… Дерзайте! Удачи!

