Александр Катловай,
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;