Показать сообщение отдельно
Старый 02.06.2009, 23:43   #11
Morfez69
Неактивный пользователь
 
Регистрация: 02.06.2009
Сообщений: 7
Репутация: 3
По умолчанию Re: Экспорт из dbgrid в excel

Цитата:
Сообщение от Hunter_Tj Посмотреть сообщение
Код не мой, когда-то нашел в инете, но он рабочий....

Код:
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;
Morfez69 вне форума
 
Ответить с цитированием Вверх
 
Время генерации страницы 0.02031 секунды с 10 запросами