![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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) |