![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Неактивный пользователь
Регистрация: 29.07.2008
Сообщений: 1
Репутация: 0
|
Я совсем чайник, поэтому заранее сорри. Учусь в Delphi 7.
Сделал sql-запрос из базы Access (через ADO Connection), вывожу в dbgrid, нужно результаты экспортнуть в excel. Не могу разобраться, прочитал много всего. Если можно - пример кода, плиз Задачка совсем не новая, но разобраться очень хочется. |
|
|
|
| Реклама: | Тепловая завеса Тепломаш КЭВ-24П6031Е | дитя тьмы первая жертва фильм | Заходите на сайт MebelStol.ru: барная стойка купить - отличные цены и большой выбор! | Клапаны КПС-3 (180)-НО-ЭМ(220)-1000х650 | теплоход максим литвинов каюты |
|
|
#2
|
|
|
|
|
|
|
| Сказали спасибо: |
|
|
#3
|
|
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;
__________________
У победы много отцов, поражение всегда сирота. Последний раз редактировалось hack; 29.07.2008 в 11:20.. |
|
|
|
|
| Эти 2 пользователя(ей) сказали cпасибо за это полезное сообщение: |
|
|
#4
|
|
Используй DBGridEh. Именно Grid и именно в CSV, XLS
![]() |
|
|
|
|
|
|
#5
|
|
Неактивный пользователь
Регистрация: 20.06.2008
Сообщений: 4
Репутация: 1
|
DevExpress TcxGrid. Имеется встроенная функция экспорта грида в excel.
|
|
|
|
|
|
#6
|
|
Пользователь
Пол:
Регистрация: 07.03.2008
Адрес: Киев
Сообщений: 111
Репутация: 35
|
Даю ссылки на примеры Экспорта и импорта в 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 файлы. Последний раз редактировалось agent_smith; 04.11.2008 в 12:40.. |
|
|
|
|
|
#7
|
|
Неактивный пользователь
Регистрация: 26.01.2009
Сообщений: 3
Репутация: 0
|
А если Excel не установлен?
|
|
|
|
|
|
#8
|
|
Пользователь
Пол:
Регистрация: 07.03.2008
Адрес: Киев
Сообщений: 111
Репутация: 35
|
|
|
|
|
| Сказали спасибо: |
|
|
#9
|
|
Неактивный пользователь
Регистрация: 17.04.2009
Сообщений: 1
Репутация: 0
|
Да я тоже столкнулся с проблемой экспорта из dbgrid в excel)) только на С++ builder народ помогите плз если кто может чайнику!!!
А лучше если можно закиньте исходник проги которая экспорт выполняет Последний раз редактировалось onzone; 17.04.2009 в 01:38.. |
|
|
|
|
|
#10
|
|
Код не мой, когда-то нашел в инете, но он рабочий.... Код:
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;
}
|
|
|
|
|
|
|
#11
|
|||||||||||||||||||||||
|
Неактивный пользователь
Регистрация: 02.06.2009
Сообщений: 7
Репутация: 3
|
все бы хорошо если бы это был не 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;
|
|||||||||||||||||||||||
|
|
|
|
|
#12
|
|||||||||||||||||||||||
|
Пользователь
Пол:
Регистрация: 12.03.2008
Сообщений: 62
Репутация: 12
|
формат называется csv - это текст с разделителями (табуляция или точка с запятой). Формат чуть-чуть не такой (все значения желательно брать в двойные кавычки). То есть: "ячейка1_1";"ячейка1_2";"ячейка1_3" "ячейка2_1";"ячейка2_2";"ячейка2_3" на конце точку с запятой можно не ставить. В файле одна строка - одна строка из таблицы. Эксель (и блокнот тоже ) откроет этот файл без проблем
__________________
ваши спасибы шлите мне на вебмани или яндексДеньги. Какой у меня кошелек? Спросите в личку
|
|||||||||||||||||||||||
|
|
|
|
|
#13
|
|
Неактивный пользователь
Пол:
Регистрация: 31.10.2008
Сообщений: 3
Репутация: 0
|
а по скорости так быстрее чем через xp report ?
|
|
|
|
|
|
#14
|
|
Новичок
Пол:
Регистрация: 28.03.2010
Сообщений: 3
Репутация: 0
|
Используй FastReport. там работы минут на я и будет тебе готовый экспорт в XML, Doc, PDF. что за хочешь
|
|
|
|
|
|
#15
|
|
Неактивный пользователь
Пол:
Регистрация: 18.01.2007
Адрес: Бийск
Сообщений: 56
Репутация: 12
|
К чему все эти сложности с 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;
Последний раз редактировалось vovapetr; 28.03.2010 в 14:30.. Причина: дополнение |
|
|
|
| Сказали спасибо: |
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| DBGrid и flat | _wHiTe_ | Borland C++ Builder | 1 | 19.02.2013 20:14 |
| Вопросы по DBGrid | zark1982 | Компоненты | 14 | 25.01.2010 15:49 |
| DBGrid -> Txt | Revent | Delphi | 13 | 13.01.2009 14:19 |
| Сортировка в DBgrid | IIpopoK | Delphi | 10 | 19.04.2008 22:50 |
| А как в DBGrid'е? | Artispro | Delphi | 6 | 26.02.2008 19:58 |
|
|