![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!!!
Подскажите ... У меня на форме несколько 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
|
|||
|
|||
![]() Могу предложить вам просто сделать из всех ваших 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]; Последний раз редактировалось Nyctos Kasignete, 19.05.2009 в 23:28. |
#3
|
|||
|
|||
![]() Спасибо большое, все получилось с экселем)))
А еше вопросик... Вот я вывожу все всои результаты в разные StringGrid-ы, и потом считаю сумму определенных столбцов во всех StringGrid-ах и вывожу тоже в отдельный StringGrid, и вопрос...., если у меня в одном StringGrid нет результатов, то обшая сумма по всем не считается, выдает ошибку, как мне можно сделать чтобы он считал сумму игнорируя пустые StringGrid-ы???? |
#4
|
||||
|
||||
![]() Проверяйте при суммировании значение ячейки на пустоту и если пуста то считайте ее за 0.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
![]() Да я так и делаю, но он мне теперь ошибку не выдает, но и не складавает, в чем тут ошибка????
Код:
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
|
||||
|
||||
![]() Это че вы хотели сказать вот этим?:
Код:
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) Вообще можно заменить весь блок: Код:
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) Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |