Экспорт в Excel

Александр Катловай
Дата: 26.05.2011 22:44:24
  var
ExcelApp : variant;
row :integer;
col:integer;
begin

IBQuery1.Active:=true;
dbgrid2.DataSource.DataSet.First;
ExcelApp:=CreateOleObject('Excel.Application');
ExcelApp.workbooks.open(ExtractFilePath(ParamStr(0))+'BOICI.xlsx');
ExcelApp.Visible := false;
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'BOICI';
for row :=0 to DBGrid2.DataSource.DataSet.RecordCount-1 do
begin
for col :=0 to DBGrid2.Columns.Count-1 do
begin
ExcelApp.WorkBooks[1].WorkSheets[1].cells[row+2,col+1].value:=dbgrid2.DataSource.DataSet.Fields[col].AsString;
end;
ExcelApp.Visible := True;
end;
end;

Экспортирует только первую строку из таблицы.
Что в этом коде дописать нужно, чтобы все строки в эксель кинуло?
Соколинский Борис
Дата: 26.05.2011 22:49:07
предпоследний end на строчку вверх сдвинь
Гаджимурадов Рустам
Дата: 26.05.2011 22:54:08

Соколинский Борис> предпоследний end на строчку вверх сдвинь

Тут, как минимум, DataSet.Next. А вообще нужно FAQ прочитать.

Posted via ActualForum NNTP Server 1.4

Александр Катловай
Дата: 26.05.2011 23:01:14
Не помогает.
Читал, не нашел нужного
Александр Катловай
Дата: 26.05.2011 23:26:10
var
ExcelApp : variant;
row :integer;
col:integer;
begin

IBQuery1.Active:=true;
dbgrid2.DataSource.DataSet.First;
ExcelApp:=CreateOleObject('Excel.Application');
ExcelApp.workbooks.open(ExtractFilePath(ParamStr(0))+'BOICI.xlsx');
ExcelApp.Visible := true;
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'BOICI';
for row :=0 to DBGrid2.DataSource.DataSet.RecordCount-1 do
begin
for col :=0 to DBGrid2.Columns.Count-1 do
begin
ExcelApp.WorkBooks[1].WorkSheets[1].cells[row+2,col+1].value:=dbgrid2.DataSource.DataSet.Fields[col].AsString;
end;
dbgrid2.DataSource.DataSet.Next;
end;
end;

Что теперь дописать?
Александр Катловай
Дата: 27.05.2011 00:45:24
На этом форуме помогают?
DimaBr
Дата: 27.05.2011 01:09:07
with dbgrid2.DataSource.DataSet do begin
  First;
  Row := 1;
  while not Eof do begin
    for col :=0 to DBGrid2.Columns.Count-1 do
      ExcelApp.WorkBooks[1].WorkSheets[1].cells[row,col+1].value := Fields[col].AsString;
    inc(Row);
    Next;
  end;
end;
Gerasimenko
Дата: 27.05.2011 07:32:17
Александр Катловай,

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

 procedure TDataSetToExcel.DataClassToExcel(da:TDataSet; db:TDBGrid;
        NamePage:String);
 var
   ServerIsRunning:Boolean;
   Unknown:IUnknown;
   Result:HResult;
   AppProgID:String;
   App,Sheet,WorkBook:Variant;
   r1,i,j:integer;
   st,st_prom:string;
   Data:OleVariant;
   ar1: Array of String;
 begin
   // Указать программный идентификатор приложения-сервера
   AppProgID:='Excel.Application';
   da.DisableControls;
   ServerIsRunning:=False;
   Result:=
     GetActiveObject(ProgIDToClassID(AppProgID),nil,Unknown);
   if (Result = MK_E_UNAVAILABLE) then
     // Создать один экземпляр сервера
     App:=CreateOleObject(AppProgID)
     else begin {000}
        // Соединится с уже запущенной копией сервера
        App:=GetActiveOleObject(AppProgID);
        ServerIsRunning:=True;
          end;{000}
 try
   App.WorkBooks.Add;
   WorkBook:=App.ActiveWorkBook;
   if Length(NamePage)>31 then NamePage:=Copy(NamePage,1,26)+' ...';
   WorkBook.WorkSheets[1].Name:=NamePage;
   Sheet:=WorkBook.WorkSheets[1];
   Sheet.Cells.NumberFormat:='@';
   //********************************
     Data := VarArrayCreate([1, da.RecordCount+1 , 1, da.FieldCount], varVariant);

  {################################################}
   // заголовки
    for i:=0 to db.Columns.Count-1 do
     if db.Columns[i].Visible=True then
       Data[1,i+1]:=db.Columns[i].Title.Caption;
    SetLength(ar1,db.Columns.Count);
    for i:=0 to db.Columns.Count-1 do
     if db.Columns[i].Visible=True then
       ar1[i]:=db.Columns[i].FieldName;
   //данные
    r1:=da.RecNo;
    da.First;
    j:=2;
    while not da.Eof do begin {444}
      for i:=0 to db.Columns.Count-1 do
       if db.Columns[i].Visible=True then
         Data[j,i+1]:=VarToStr(da.FieldValues[ar1[i]]);
        da.Next;
        j:=j+1;
                        end;{444}
  {##################################################}
      da.RecNo:=r1;
    // Fill up the sheet
    Sheet.Range[RefToCell(1, 1), RefToCell(da.RecordCount+1,
       da.FieldCount)].Value := Data;
   //********************************
   da.EnableControls;

   App.Visible:=True;
   except
     st_prom:='Сбой при обращении к внутренним библиотекам MsExcel';
     MessageDlg(st_prom,mtError,[mbOk],0);
     App.Visible:=True;
   end;
 end;
nec 3540A
Дата: 04.06.2011 16:10:10
Gerasimenko,

все верно, только нужно использовать правильные функции конвертирования границ массива в номера ячек, а то вот например функция которая здесь:

здесь

при значениях больше 26 столбцов (А1-Z1 т.е. кол-ва букв в анг. алфавите) - выходит в ошибку OLE error 800A03EC

поэтому здесь нашлась правильная функция:

function RefToCell(RowID, ColID: Integer): string;
 var
   ACount, APos: Integer;
 begin
   ACount := ColID div 26;
   APos := ColID mod 26;
   if APos = 0 then
   begin
     ACount := ACount - 1;
     APos := 26;
   end;

   if ACount = 0 then
     Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID);

   if ACount = 1 then
     Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID);

   if ACount > 1 then
     Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToStr(RowID);
 end;
Gerasimenko
Дата: 06.06.2011 10:37:54
nec 3540A,

На практике очень редко можно встретить отчеты с числом колонок более 26.
Вам наверное не повезло...