Неактивный пользователь
Регистрация: 02.06.2009
Сообщений: 7
Репутация: 3
|
Re: Экспорт из dbgrid в excel
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
Код не мой, когда-то нашел в инете, но он рабочий....
Код:
Variant XLSAPP;
//===============================================
int f4_ExcelInit(AnsiString File){//Подключение к Excel
try{//Если Excel запущен - подключиться к нему
XLSAPP=Variant::GetActiveObject("Excel.Application");}
catch (...){//Если Excel не запущен - запустить его
try{XLSAPP=Variant::CreateObject("Excel.Application");}
catch (...){
Application->MessageBox("Невозможно открыть Microsoft Excel."
"Возможно, Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);}
}
try{
if(File!=""){
XLSAPP.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());}//Открыть документ
else XLSAPP.OlePropertyGet("WorkBooks").OleProcedure("add");//Создать новый документ
}
catch (...){
Application->MessageBox("Ошибка открытия файла Microsoft Excel.",
"Ошибка",MB_OK+MB_ICONERROR);return -1;}
return 1;
}
//===============================================
int f4_ExcelVisible(bool i){//Показать/скрыть Excel
if(!XLSAPP.IsEmpty())XLSAPP.OlePropertySet("Visible",i);
return 1;
}
//===============================================
int f4_ExcelSend(int Sheet, int Stolb, int Stroka, AnsiString Str, bool asText=false){//>>>
Variant ExcelSheet,Cur;//Запись данных в Excel (Лист, столбец, строка, "данные",как_текст?)
AnsiString ErrStr;
if(Str=="")return 1;//Не писать "пустоту"
ErrStr="Ошибка при записи: лист "+IntToStr(Sheet)+", столбец "+IntToStr(Stolb)+", строка "+IntToStr(Stroka);
try{ExcelSheet=XLSAPP.OlePropertyGet("WorkSheets",Sheet);}
catch (...){Application->MessageBox(ErrStr.c_str(),
"Ошибочный номер листа Microsoft Excel",MB_OK+MB_ICONERROR); return -1;}
try{Cur=ExcelSheet.OlePropertyGet("Cells",Stroka,Stolb);
if(asText)Cur.OlePropertySet("NumberFormat","@");//Форматировать ячейку как текст
Cur.OlePropertySet("Value",Str.c_str());}
catch (...){Application->MessageBox(ErrStr.c_str(),
"Ошибка Microsoft Excel",MB_OK+MB_ICONERROR); return -1;}
return 1;
}
//===============================================
int f4_SaveToExcel(){//Экспорт всех ячеек в Excel
TBookmark bm;
int result,col, row;
Screen->Cursor=crHourGlass;
Application->ProcessMessages();
result=f4_ExcelInit("");//Инициализация Excel
if(result==-1){Screen->Cursor=crDefault;return -1;}
Form1->DBGrid1->DataSource->DataSet->DisableControls();
bm=Form1->DBGrid1->DataSource->DataSet->GetBookmark();//Текущая ячейка
Form1->DBGrid1->DataSource->DataSet->First();
for(col=0;col<Form1->DBGrid1->FieldCount;col++){//добавляем имена колонок
result=f4_ExcelSend(1,col+1,1,Form1->DBGrid1->Fields[col]->DisplayLabel,true);
if(result==-1){Screen->Cursor=crDefault;return -1;}
}
Form1->ProgressBar1->Position=0;//Прогрессбар
Form1->ProgressBar1->Max=Form1->DBGrid1->DataSource->DataSet->RecordCount;
for(row=0;row<Form1->DBGrid1->DataSource->DataSet->RecordCount;row++){// получаем данные
Form1->ProgressBar1->Position=row;//Прогрессбар
for(col=0;col<Form1->DBGrid1->FieldCount;col++){
result=f4_ExcelSend(1,col+1,row+2,Form1->DBGrid1->Fields[col]->AsString,true);
if(result==-1){Screen->Cursor=crDefault;return -1;}
}
Form1->DBGrid1->DataSource->DataSet->Next();
}
Form1->DBGrid1->DataSource->DataSet->GotoBookmark(bm);//Текущая ячейка
Form1->DBGrid1->DataSource->DataSet->FreeBookmark(bm);
Form1->DBGrid1->DataSource->DataSet->EnableControls();
f4_ExcelVisible(true);//Сделать видимым Excel
Form1->ProgressBar1->Position=0;//Прогрессбар
Screen->Cursor=crDefault;
Application->ProcessMessages();
return 1;
}
|
|
 |
|
 |
|
все бы хорошо если бы это был не C. Вот пример кода из моей лабы:
Код:
procedure TForm1.Button23Click(Sender: TObject);//отчет в ЕКСЕЛЬ
var
i,j,index,p: Integer;
g:sTring;
ExcelApp,sheet: Variant;
begin
p:=0;
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := true;
ExcelApp.WorkBooks.Add(-4167);
ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Export';
sheet:=ExcelApp.WorkBooks[1].WorkSheets['Export'];
Sheet.Cells[1,1]:='Код владельца';
Sheet.Cells[1,2]:='Фамилия';
Sheet.Cells[1,3]:='Имя';
Sheet.Cells[1,4]:='Отчество';
Sheet.Cells[1,5]:='Марка';
Sheet.Cells[1,6]:='Год выпуска';
Sheet.Cells[1,7]:='Грузоподъемность';
Sheet.Cells[1,8]:='Стаж работы';
Sheet.Cells[1,9]:='Фото';
index:=2; //заполнение со 2 строки
DBGrid1.DataSource.DataSet.First;
for i:=1 to DBGrid1.DataSource.DataSet.RecordCount do
begin
sheet.cells[index,1]:=DBGrid1.fields[0].asstring;
sheet.cells[index,2]:=DBGrid1.fields[1].asstring;
sheet.cells[index,3]:=DBGrid1.fields[2].asstring;
sheet.cells[index,4]:=DBGrid1.fields[3].asstring;
sheet.cells[index,8]:=DBGrid3.Fields[4].AsInteger;
DBGrid2.DataSource.DataSet.First;
for j:=1 to DBGrid2.DataSource.DataSet.RecordCount do
begin
if dm.Query1.FieldByName('VKOD').AsInteger=dm.Query2.FieldByName('VKOD').AsInteger then
begin
inc(index);
sheet.cells[index,5]:=DBGrid2.fields[2].asstring;
sheet.cells[index,6]:=DBGrid2.fields[4].asstring;
sheet.cells[index,7]:=DBGrid2.fields[5].asstring;
form1.DBImage2.Picture.SaveToFile(ExtractFilePath(ParamStr(0))+'temp'+inttostr(p)+'.bmp');
sheet.cells[index,9].select;
Sheet.Pictures.Insert('H:\Laba1\'+'temp'+inttostr(p)+'.bmp');
inc(p);
DBGrid2.DataSource.DataSet.Next;
end;
end;
inc(index);
DBGrid1.DataSource.DataSet.Next;
end;
ExcelApp.Visible := true;
end;
|