Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.05.2009, 21:44
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию экспорт нескольких StringGrid

Здравствуйте!!!
Подскажите ... У меня на форме несколько StringGrid-ов, и мне нужно их экспортировать в один экселевский файл???
Я нашла исходник экспорта, но там они экспортируют только 1 StringGrid, как мне туда добавить 2-ой

Код:
function RefToCell(ARow, ACol: Integer): string;
 begin
   Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
 end;

 function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean;
 const
   xlWBATWorksheet = -4167;
 var
   Row, Col: Integer;
   GridPrevFile: string;
   XLApp, Sheet, Data: OLEVariant;
   i, j: Integer;
 begin
   // Prepare Data
  Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);
   for i := 0 to AGrid.ColCount - 1 do
     for j := 0 to AGrid.RowCount - 1 do
       Data[j + 1, i + 1] := AGrid.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[2];
     Sheet.Name := ASheetName;
     // Fill up the sheet
    Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount,
       AGrid.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 TForm3.Button8Click(Sender: TObject);
begin
if SaveAsExcelFile(stringGrid1, 'My Stringgrid1','e:\MyExcelFile.xls')then
     ShowMessage('StringGrid saved!');
end;
Ответить с цитированием
  #2  
Старый 19.05.2009, 23:07
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Могу предложить вам просто сделать из всех ваших StringGrid'ов, имеющихся на форме, один большой динамический StringGrid, который будет содержать все данные. Его передавать в параметре функции SaveAsExcelFile.
Вот, в качестве примера набросала для случая трёх StringGrid'ов на форме. Для другого количества "таблиц" — по аналогии...
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  MaxColCnt, i, Last: Integer;
  SumGrid: TStringGrid;
begin
  SumGrid := TStringGrid.Create(Self);
  try
    // определяем число столбцов и строк в суммарном StringGrid
    MaxColCnt := StringGrid1.ColCount;
    if StringGrid2.ColCount > MaxColCnt then MaxColCnt := StringGrid2.ColCount;
    if StringGrid3.ColCount > MaxColCnt then MaxColCnt := StringGrid3.ColCount;
    SumGrid.ColCount := MaxColCnt;
    SumGrid.RowCount := StringGrid1.RowCount + StringGrid2.RowCount + StringGrid3.RowCount;
 
   // копируем содержимое первого StringGrid
    Last := 0;
    for i := 0 to StringGrid1.RowCount - 1 do
      SumGrid.Rows[i].Assign(StringGrid1.Rows[i]);

    // копируем содержимое второго StringGrid
    Inc(Last, StringGrid1.RowCount);
    for i := 0 to StringGrid2.RowCount - 1 do
      SumGrid.Rows[i + Last].Assign(StringGrid2.Rows[i]);

    // копируем содержимое третьего StringGrid
    Inc(Last, StringGrid2.RowCount);
    for i := 0 to StringGrid3.RowCount - 1 do
      SumGrid.Rows[i + Last].Assign(StringGrid3.Rows[i]);

    if SaveAsExcelFile(SumGrid, 'My Stringgrid1','e:\MyExcelFile.xls') then
      ShowMessage('StringGrid saved!');
  finally
    SumGrid.Free;
  end;
end;

_____________________

P.S. Кстати, эта функция SaveAsExcelFile у меня не работает (хоть для какого количества StringGrid), если не поменять в строке
Код:
Sheet := XLApp.Workbooks[1].WorkSheets[2];
индекс 2 (у WorkSheets) на 1.

Последний раз редактировалось Nyctos Kasignete, 19.05.2009 в 23:28.
Ответить с цитированием
  #3  
Старый 20.05.2009, 08:32
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию

Спасибо большое, все получилось с экселем)))

А еше вопросик... Вот я вывожу все всои результаты в разные StringGrid-ы, и потом считаю сумму определенных столбцов во всех StringGrid-ах и вывожу тоже в отдельный StringGrid, и вопрос...., если у меня в одном StringGrid нет результатов, то обшая сумма по всем не считается, выдает ошибку, как мне можно сделать чтобы он считал сумму игнорируя пустые StringGrid-ы????
Ответить с цитированием
  #4  
Старый 20.05.2009, 11:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Проверяйте при суммировании значение ячейки на пустоту и если пуста то считайте ее за 0.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 20.05.2009, 11:37
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию

Да я так и делаю, но он мне теперь ошибку не выдает, но и не складавает, в чем тут ошибка????

Код:
procedure TForm3.Button7Click(Sender: TObject);
var

i,z,k:integer;
w:real;
begin
a:=strtofloat(Form1.StringGrid1.Cells[1,5]);
b:=strtofloat(Form1.StringGrid1.Cells[1,6]);
begin
if  Form3.StringGrid2.Cells[6,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid2.Cells[6,i]:=FloatToStr(0)
end;
begin
if  Form3.StringGrid3.Cells[3,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid3.Cells[2,i]:=FloatToStr(0)
 end;
 begin
if  Form3.StringGrid4.Cells[4,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid4.Cells[4,i]:=FloatToStr(0)
 end;
   begin
if  Form3.StringGrid5.Cells[5,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid5.Cells[5,i]:=FloatToStr(0)
end;

for z := 0 to StringGrid6.RowCount - 1 do
    StringGrid6.Rows[z].Clear();
    Ln:=StrToFloat(Form1.Edit1.Text);
    Lk:=StrToFloat(Form1.Edit3.Text);
    Step:=StrToFloat(Form1.Edit5.Text);
    L:=Ln;
    i:=1;
    k:=0;

 While l<=Lk do
   begin
   w:=l/(3600*a*b);
  Pobsie:=Pgeom+strtofloat(Form3.StringGrid1.Cells[4,i])+strtofloat(Form3.StringGrid2.Cells[6,i])+strtofloat(Form3.StringGrid3.Cells[2,i])+strtofloat(Form3.StringGrid4.Cells[4,i])+strtofloat(Form3.StringGrid5.Cells[5,i]);
  Form3.StringGrid6.Cells[0,0]:='Ñêîðîñòü';
  Form3.StringGrid6.Cells[1,0]:='Îáùèå ïîòåðè äàâëåíèÿ';
  Form3.StringGrid6.Cells[0,i]:=FloatToStr(RoundTo(w,-2));
  Form3.StringGrid6.Cells[1,i]:=FloatToStr(RoundTo(Pobsie,-2));
  Form3.StringGrid6.Cells[2,i]:=FloatToStr(Pobsie);

  i:=i+1;
  L:=L+step;
  k:=k+1;
  end;
  Form3.StringGrid6.RowCount:=k+1;
  end;
Ответить с цитированием
  #6  
Старый 20.05.2009, 12:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Это че вы хотели сказать вот этим?:
Код:
begin
if  Form3.StringGrid2.Cells[6,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid2.Cells[6,i]:=FloatToStr(0)
end;
Видимо должно быть так:
Код:
  for i:=1 to 100 
  do if  Form3.StringGrid2.Cells[6,i]='' 
      then Form3.StringGrid2.Cells[6,i]:=FloatToStr(0)
В противном случае значение i в проверках неизвестно чему равно.
Вообще можно заменить весь блок:
Код:
if  Form3.StringGrid2.Cells[6,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid2.Cells[6,i]:=FloatToStr(0)
end;
begin
if  Form3.StringGrid3.Cells[3,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid3.Cells[2,i]:=FloatToStr(0)
 end;
 begin
if  Form3.StringGrid4.Cells[4,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid4.Cells[4,i]:=FloatToStr(0)
 end;
   begin
if  Form3.StringGrid5.Cells[5,i]='' then
   for i:=1 to 100 do
   Form3.StringGrid5.Cells[5,i]:=FloatToStr(0)
end;
на такой:
Код:
  
for j := 2 to 6
do for i:=1 to 100 
    do if  Form3.StringGrid2.Cells[j,i]='' 
        then Form3.StringGrid2.Cells[j,i]:=FloatToStr(0)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025