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('Экспорт в Эксель прошел успешно');

Прошу прощения за возможные опечатки, а вообще – эксперементируйте, ибо можно было реализовать по-другому. Например, вызвать два раза функцию для первого и второго грида, задав немного другие параметры, или, например, вынести процесс формирования данных для записи в эксель в отдельную процедуру… ну, и так далее… Дерзайте! Удачи!

тема на форуме

Похожие статьи