Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   Базы данных (https://nowa.cc/forumdisplay.php?f=312)
-   -   Экспорт из dbgrid в excel (https://nowa.cc/showthread.php?t=174666)

sirkey 29.07.2008 10:35

Экспорт из dbgrid в excel
 
Я совсем чайник, поэтому заранее сорри. Учусь в Delphi 7.
Сделал sql-запрос из базы Access (через ADO Connection), вывожу в dbgrid, нужно результаты экспортнуть в excel.
Не могу разобраться, прочитал много всего. Если можно - пример кода, плиз
Задачка совсем не новая, но разобраться очень хочется.

Hunter_Tj 29.07.2008 10:59

Ответ: Экспорт из dbgrid в excel
 
Цитата:

Сообщение от sirkey (Сообщение 1803470)
...нужно результаты экспортнуть в excel.
Не могу разобраться, прочитал много всего. Если можно - пример кода, плиз...

http://sources.ru/delphi/db/export_contents_dbgrid_to_excel_or_clipboard.shtml

hack 29.07.2008 11:17

Ответ: Экспорт из dbgrid в excel
 
Dbgrid не содержит никакой информации, а только отображает её, поэтому надо работать с DataSet.
Можешь посмотреть ТУТ и ТУТ. Или попробовать вот так:
Код:

//Export напрямую в Excel без промежуточной передачи данных//
//*********************//
//uses -> ComObj
//*********************//
procedure TMainForm.ExportClick(Sender: TObject);
var
i,j,index: Integer;
ExcelApp,sheet: Variant;
begin
 ExcelApp := CreateOleObject('Excel.Application');
 ExcelApp.Visible := False;
 ExcelApp.WorkBooks.Add(-4167);
 ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Export';
 sheet:=ExcelApp.WorkBooks[1].WorkSheets['Export'];
 index:=1; //Загоняем с первой строки
 DBGrid1.DataSource.DataSet.First;
      for i:=1 to  DBGrid1.DataSource.DataSet.RecordCount do
      begin
      for j:=1 to DBGrid1.FieldCount do
      sheet.cells[index,j]:=DBGrid1.fields[j-1].asstring;
      inc(index);
      DBGrid1.DataSource.DataSet.Next;
      end;
 ExcelApp.Visible := true;
end;


while 29.07.2008 19:47

Ответ: Экспорт из dbgrid в excel
 
Используй DBGridEh. Именно Grid и именно в CSV, XLS :)

javdet0307 03.10.2008 11:41

Re: Экспорт из dbgrid в excel
 
DevExpress TcxGrid. Имеется встроенная функция экспорта грида в excel.

agent_smith 23.10.2008 14:42

Re: Экспорт из dbgrid в excel
 
Даю ссылки на примеры Экспорта и импорта в Excel. Правда для c++ builder, но разобраться можно:

http://rxlib.ru/WinLesson/bles1.htm
http://rxlib.ru/WinLesson/bles1_2.htm
http://faqs.org.ru/progr/c_cpp/cbuilder2.htm


Правда не совсем экспорт, но зато как программно обрабатывать excel файлы.

Petro123 26.01.2009 11:00

Re: Экспорт из dbgrid в excel
 
А если Excel не установлен?

agent_smith 26.01.2009 12:23

Re: Экспорт из dbgrid в excel
 
Цитата:

Сообщение от Petro123 (Сообщение 2165799)
А если Excel не установлен?

Создай файл с расширением cvs (вроде) и запиши туда данный в формате, например:
ячейка1_1;ячейка1_2;ячейка1_3;
ячейка2_1;ячейка2_2;ячейка2_3;
и т.д., формат может не точный
И потом его можно открыть Excel.

onzone 17.04.2009 01:31

Re: Экспорт из dbgrid в excel
 
Да я тоже столкнулся с проблемой экспорта из dbgrid в excel)) только на С++ builder народ помогите плз если кто может чайнику!!!
А лучше если можно закиньте исходник проги которая экспорт выполняет

Hunter_Tj 17.04.2009 09:23

Re: Экспорт из dbgrid в excel
 
Цитата:

Сообщение от onzone (Сообщение 2340479)
Да я тоже столкнулся с проблемой экспорта из 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;
}


Morfez69 02.06.2009 23:43

Re: Экспорт из dbgrid в excel
 
Цитата:

Сообщение от Hunter_Tj (Сообщение 2340837)
Код не мой, когда-то нашел в инете, но он рабочий....

Код:

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;


RichDad 03.06.2009 20:02

Re: Экспорт из dbgrid в excel
 
Цитата:

Сообщение от agent_smith (Сообщение 2165957)
Создай файл с расширением cvs (вроде) и запиши туда данный в формате, например:
ячейка1_1;ячейка1_2;ячейка1_3;
ячейка2_1;ячейка2_2;ячейка2_3;
и т.д., формат может не точный
И потом его можно открыть Excel.

формат называется csv - это текст с разделителями (табуляция или точка с запятой).

Формат чуть-чуть не такой (все значения желательно брать в двойные кавычки).

То есть:

"ячейка1_1";"ячейка1_2";"ячейка1_3"
"ячейка2_1";"ячейка2_2";"ячейка2_3"

на конце точку с запятой можно не ставить. В файле одна строка - одна строка из таблицы.

Эксель (и блокнот тоже :) ) откроет этот файл без проблем

foxdayk 17.03.2010 09:57

Re: Экспорт из dbgrid в excel
 
а по скорости так быстрее чем через xp report ?

SouthBase 28.03.2010 07:25

Re: Экспорт из dbgrid в excel
 
Используй FastReport. там работы минут на я и будет тебе готовый экспорт в XML, Doc, PDF. что за хочешь

vovapetr 28.03.2010 14:17

Re: Экспорт из dbgrid в excel
 
К чему все эти сложности с FastReport и *.csv
Код HTML:

var e: variant;
 //Подключаемся к Excel
 try e:=GetActiveOleObject('Excel.Application');
 except e:=CreateOleObject('Excel.Application');
 end;
            e.WorkBooks.Add; //Создаем документ Excel
    //Здесь выводим данные из запроса (Например в первый столбец excel - первое поле запроса)
          for i:=0 to AdoQuery1.RecordCount-1 do begin
              e.activeSheet.cells(i, 1):=AdoQuery1.Fields.Fields[0].AsString;
          end;
  //Показываем Excel и отключаемся
    e.Visible:=true;
    e:=Unassigned;

скачай Василий Корняков Программирование документов и приложений MS Office в Delphi, хорошая книга


Текущее время: 01:32. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2026 NoWa.cc

Время генерации страницы 0.03410 секунды с 9 запросами