 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
|
Да я тоже столкнулся с проблемой экспорта из dbgrid в excel)) только на С++ builder народ помогите плз если кто может чайнику!!!
А лучше если можно закиньте исходник проги которая экспорт выполняет
|
|
 |
|
 |
|
Код не мой, когда-то нашел в инете, но он рабочий....
Код:
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;
}