Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2011, 20:51   #1
Marina8
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 17
По умолчанию Таблицы StringGrid в разные листы Excel

Здравствуйте, подскажите что нужно добавить в данный код, чтобы к таблице sg1 на первом листе книги добавить таблицу sg2 на второй лист. Спасибо!

function SaveAsExcelFile(sg1: TStringGrid; ASheetName, AFileName: string): Boolean;
const
xlWBATWorksheet = -4167;
var
XLApp, Sheet, Data: OLEVariant;
i, j: Integer;
begin
// Prepare Data
Data := VarArrayCreate([1, sg1.RowCount, 1, sg1.ColCount], varVariant);
for i := 0 to sg1.ColCount - 1 do
for j := 0 to sg1.RowCount - 1 do
Data[j + 1, i + 1] := sg1.Cells[i, j];
// Create Excel-OLE Object
Result := False;
XLApp := CreateOleObject('Excel.Application' );
try
// Hide Excel
XLApp.Visible := False;
// Add new Workbook
XLApp.Workbooks.Add(xlWBatWorkSheet );
Sheet := XLApp.Workbooks[1].WorkSheets[1];
Sheet.Name := ASheetName;
// Fill up the sheet
Sheet.Range[RefToCell(1, 1), RefToCell(sg1.RowCount,
sg1.ColCount)].Value := Data;
// Save Excel Worksheet
try
XLApp.Workbooks[1].SaveAs(AFileName);
Result := True;
except
// Error ?
end;
finally
// Quit Excel
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end;
end;
end;

procedure TForm1.BitBtn6Click(Sender: TObject);

begin
if SaveAsExcelFile(sg1, 'Âûåçä', 'c:\Èñòîðèÿ\history.xls') then
ShowMessage('Îò÷åò ñîõðàíåí â ïàïêó c:\Èñòîðèÿ !');
end;
Marina8 вне форума Ответить с цитированием
Старый 19.12.2011, 23:36   #2
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Во-первых, оформляйте, пожалуйста, код с помощью тега CODE, чтобы было удобнее читать.

Во-вторых...

Можно сделать несколькими способами. Давайте реализуем один из них (я думаю, что самый простой) - это подправим функцию, добавив в нее еще несколько параметров. Объявление функции будет выглядеть так:

Код:
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[i, j];
Далее у нас создается ОЛЕ объект, скрывается эксель, а перед тем как создать новую книгу, мы укажем количество листов таким образом:

Код:
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('Экспорт в Эксель прошел успешно');
Прошу прощения за возможные опечатки, а вообще - эксперементируйте, ибо можно было реализовать по-другому. Например, вызвать два раза функцию для первого и второго грида, задав немного другие параметры, или, например, вынести процесс формирования данных для записи в эксель в отдельную процедуру... ну, и так далее... Дерзайте! Удачи!
Xardas вне форума Ответить с цитированием
Старый 20.12.2011, 17:23   #3
Marina8
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 17
По умолчанию

Спасибо большое!!!!! Все оч подробно и понятно даже мне Только вот возникла проблема, sg2 сохраняется на первый лист, второй лист остается пустым. Добавила переменную Sheet1, но видимо дело не в этом, что я опустила? И еще можно ли имени файла ексель присвоить значение из Edit'а и ComboBox'а и как это сделать?)

Код:
function SaveAsExcelFile(sg1, sg2: TStringGrid; ASheetName, ASheetName1, AFileName: string): Boolean;
 const
   xlWBATWorksheet = -4167;
 var
   XLApp, Sheet, Sheet1, Data, Data1: OLEVariant;
   i, j: Integer;
 begin

  Data := VarArrayCreate([1, sg1.RowCount, 1, sg1.ColCount], varVariant);
   for i := 0 to sg1.ColCount - 1 do
     for j := 0 to sg1.RowCount - 1 do
       Data[j + 1, i + 1] := sg1.Cells[i, j];

   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
       Data[j + 1, i + 1] := sg2.Cells[i, j];

  Result := False;
   XLApp := CreateOleObject('Excel.Application');
   try

    XLApp.Visible := False;

    XLApp.Workbooks.Add;
    XLApp.SheetsInNewWorkbook:=2;

     Sheet := XLApp.Workbooks[1].WorkSheets[1];
     Sheet.Name := ASheetName;
     Sheet.Range[RefToCell(1, 1), RefToCell(sg1.RowCount,
     sg1.ColCount)].Value := Data;

     Sheet1 := XLApp.Workbooks[1].WorkSheets[2];
     Sheet1.Name := ASheetName1;
     Sheet1.Range[RefToCell(1, 1), RefToCell(sg2.RowCount,
     sg2.ColCount)].Value := Data1;

    try
       XLApp.Workbooks[1].SaveAs(AFileName);
       Result := True;
             except

    end;
      finally

    if not VarIsEmpty(XLApp) then
     begin
       XLApp.DisplayAlerts := False;
       XLApp.Quit;
       XLAPP := Unassigned;
       Sheet := Unassigned;

     end;
   end;
 end;


procedure TForm1.BitBtn6Click(Sender: TObject);

begin
  if SaveAsExcelFile(sg1, sg2, 'Выезды','Заявки', 'c:\История\history.xls') then
     ShowMessage('Отчет сохранен в папку c:\История !');
end;
Насчет кода исправилась)
Marina8 вне форума Ответить с цитированием
Старый 20.12.2011, 21:19   #4
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Цитата:
Сообщение от Marina8 Посмотреть сообщение
Спасибо большое!!!!! Все оч подробно и понятно даже мне Только вот возникла проблема, sg2 сохраняется на первый лист, второй лист остается пустым. Добавила переменную Sheet1, но видимо дело не в этом, что я опустила?
Ну так и понятно, что второй грид сохранится на первый лист Обратите внимание на фрагмент кода:

Код:
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
       Data[j + 1, i + 1] := sg2.Cells[i, j];
Вы здесь перезаписали переменную Data, исправьте ее на Data1, и будет Вам счастье.

Цитата:
И еще можно ли имени файла ексель присвоить значение из Edit'а и ComboBox'а и как это сделать?
Конечно, можно. Если имя есть в Edit, то при передаче пути функции SaveAsExcelFile можно прописать:

Код:
SaveAsExcelFile(sg1, sg2, 'Выезды','Заявки', 'c:\История\'+Edit1.Text)
Если в эдите нет расширения, то его тоже нужно добавить:

Код:
SaveAsExcelFile(sg1, sg2, 'Выезды','Заявки', 'c:\История\'+Edit1.Text+'.xls')
Желательно, на мой взгляд, чтоб в эдит можно было выбрать полный путь к файлу. А если комбобокс, то у него тоже можно воспользоваться свойством text, в котором будет записано выбранное значение из списка

Последний раз редактировалось Xardas; 20.12.2011 в 21:23.
Xardas вне форума Ответить с цитированием
Старый 21.12.2011, 17:58   #5
Marina8
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 17
По умолчанию

Пасиба!! Все получилось!!!!!!
Marina8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
добавление данных через DBEdit в разные таблицы Kamelli БД в Delphi 6 31.07.2013 00:58
Раскрашивание отдельных ячеек StringGrid через разные функции dubailand Компоненты Delphi 7 04.09.2011 16:02
Из DBEdit в 2 разные таблицы maxkov БД в Delphi 5 17.10.2010 14:47
Дробление таблицы на разные листы MaxxVer Microsoft Office Excel 9 22.03.2010 08:05
Разнести информацию на разные листы asale Microsoft Office Excel 3 13.06.2007 20:16