Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизКак экспортировать содержимое DBGrid в Excel Найти похожие ветки
← →
evgen (2004-05-17 14:03) [0]Помогите советом или толковой ссылкой для начинающих!
← →
Соловьев © (2004-05-17 14:07) [1]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=502
http://www.ehlib.com
← →
evgen (2004-05-17 14:22) [2]Есть исходник по вопросу?
← →
Соловьев © (2004-05-17 14:24) [3][1]
← →
evgen (2004-05-17 14:29) [4]Нужен исходник который выполняет экспорт содержимое из DBgrid в Excel
← →
Vlad © (2004-05-17 14:32) [5]
> evgen (17.05.04 14:03)
Вот, не поленился специально для тебя написал примерный код:type
TMyDBGrid = class(TDBGrid);
.....
procedure ToExcel;
var
a,b: Integer;
ExApp, WB, WS: Variant;
begin
ExApp:=CreateOleObject("Excel.Application");
WB:=ExApp.WorkBooks.Add;
WS := ExApp.Workbooks[1].WorkSheets[1];
with TMyDBGrid(DBGrid1).DataLink do
begin
for a:=0 to (RecordCount-1) do
begin
for b:=0 to (FieldCount-1) do
begin
WS.Cells[a+1, b+1].Value:=Fields[b].AsString;
end;
end;
ExApp.Visible:=true;
end;
end;
Здесь содержимое DBGrid выгружается на лист Excel
Но это ли тебе надо ?
← →
Соловьев © (2004-05-17 14:32) [6]сколько у.е.?
← →
evgen (2004-05-17 14:42) [7]Спасибо. Сейчас посмотрю!
← →
evgen (2004-05-17 14:53) [8]Дает ошибку, похоже чегото не хватает на форме:
[Error] Unit1.pas(32): Undeclared identifier: "CreateOleObject"
в строке:
ExApp:=CreateOleObject("Excel.Application");
← →
Vlad © (2004-05-17 14:55) [9]
> evgen (17.05.04 14:53) [8]
Извини, брат, совсем забыл (горе мне)
uses ComObj
:-)
← →
evgen (2004-05-17 15:10) [10]А это что?
В строке:
with TMyDBGrid(DBGrid1).DataLink do
ошибка:
[Error] Unit1.pas(36): Undeclared identifier: "TMyDBGrid"
← →
Vlad © (2004-05-17 15:14) [11]
> evgen (17.05.04 15:10) [10]
> А это что?
А это значит ты в разделе type не объявил типTMyDBGrid = class(TDBGrid);
Читай внимательнее [5] пост
← →
evgen (2004-05-17 15:23) [12]type
TMyDBGrid = class(TDBGrid);
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
private
{ Private declarations }
public
{ Public declarations }
end;
← →
Vlad © (2004-05-17 15:28) [13]
type
TMyDBGrid = class(TDBGrid);
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure ToExcel;
private
{ Private declarations }
public
{ Public declarations }
end;
.............
implementation
procedure TForm1.ToExcel;
{Сюда пишем процедуру из 5 поста}
← →
evgen (2004-05-17 15:36) [14]Да вроде так и делаю!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables, ComObj;
type
TMyDBGrid = class(TDBGrid);
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure ToExcel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ToExcel;
var
a,b: Integer;
ExApp, WB, WS: Variant;
begin
ExApp:=CreateOleObject("Excel.Application");
WB:=ExApp.WorkBooks.Add;
WS := ExApp.Workbooks[1].WorkSheets[1];
with TMyDBGrid(DBGrid1).DataLink do
begin
for a:=0 to (RecordCount-1) do
begin
for b:=0 to (FieldCount-1) do
begin
WS.Cells[a+1, b+1].Value:=Fields[b].AsString;
end;
end;
ExApp.Visible:=true;
end;
end;
end.
← →
Vlad © (2004-05-17 15:37) [15]
> evgen (17.05.04 15:36) [14]
> Да вроде так и делаю!
> implementation
>
> {$R *.dfm}
>
> procedure ToExcel;procedure TForm1.ToExcel
← →
evgen (2004-05-17 15:49) [16]> Vlad
Пока чето не получилось. Позже продолжим! Спасибо!
← →
iVovs (2004-05-22 14:10) [17]Такая же проблема как и у evgen нужно экспортировать данные из Grida Excel.
Попробовал предложеный код, но он выводит только одну запись(на которой находится курсор) из Grid столько раз, сколько видимых рядов в Grid.
Может кому не лень - помогите разобраться.
← →
jack128 © (2004-05-22 14:28) [18]with DbGrid1.DataSource.DataSet do
begin
Last;
First;
end;
> for a:=0 to (RecordCount-1) do
> begin
> for b:=0 to (FieldCount-1) do
> begin
> WS.Cells[a+1, b+1].Value:=Fields[b].AsString;
> end;
DbGrid1.DataSource.DataSet.Next;
> end;
>
подчеркнутая строка - верный путь к тормозам, как надо см линк выше..
> Попробовал предложеный код, но он выводит только одну запись(на
> которой находится курсор) из Grid столько раз, сколько видимых
> рядов в Grid
см мои добавления к коду..
← →
iVovs (2004-05-22 14:37) [19]Так как всё таки без траблов загрузить из Grid в Excel?
← →
Vlad © (2004-05-22 14:54) [20]
> iVovs (22.05.04 14:10) [17]
простите, ошибочка закралась,...
with TMyDBGrid(DBGrid1).DataLink do
begin
for a:=0 to (RecordCount-1) do
begin
ActiveRecord:=a; // я забыл дописать эту строчку
for b:=0 to (FieldCount-1) do
begin
...
> jack128 © (22.05.04 14:28) [18]
> with DbGrid1.DataSource.DataSet do
Ты почитай вопрос автора. Нужен экспорт из DBGrid, а не из DataSet, согласно постановке вопроса твой ответ впринципе неверен
← →
Vlad © (2004-05-22 14:59) [21]Хотя мой код тоже неплохо бы доработать, ну например выкладывать значения на лист не по ячейкам, а целиком через массив, и.т.д есть еще кое-какие мелочи, но я думаю автор разберется.
← →
jack128 © (2004-05-22 15:01) [22]
> Нужен экспорт из DBGrid, а не из DataSet, согласно постановке
> вопроса твой ответ впринципе неверен
э-э-э..Ну тогда постановку можно считать неверной ибо у DbGrid"a из содержимого разве что название колонок, все остальные данные пренадлежат DataSet"у...
← →
Vlad © (2004-05-22 15:07) [23]
> jack128 © (22.05.04 15:01) [22]
> DbGrid"a из содержимого разве что название колонок, все
> остальные данные пренадлежат DataSet"у...
Ну это так же неверное утверждение.
DBgrid имеет свой буфер (объект TDataLink), где и хранит те записи, которые показывает. Соотв. при скроллинге и/или изменении размеров по вертикали этот буфер обновляется из DataSet
Поэтому, извините уж, но каков вопрос - таков ответ.
← →
iVovs (2004-05-22 15:17) [24]Да не спорьте Вы так.
И тот и другой пример работают как часы, вот только когда через DataSet происходит запись в Excel - можно наблюдать процесс на DB Gride.
Спасибо за отзывчивость.
------------------------
Мир не без добрых людей!
← →
Vlad © (2004-05-22 15:21) [25]
> iVovs (22.05.04 15:17) [24]
> происходит запись в Excel - можно наблюдать процесс на DB
> Gride.
DataSet.DisableControls
DataSet.EnableControls
← →
iVovs (2004-05-22 15:33) [26]Блин, столкнулся с другой проблемой:
У меня DBGrid-ы находятся на разных страницах(PageControl), а на отдельной - сама "возможность" экспорта в Excel. Так вот эта возможность или чудо-кнопка, корректно работает с той таблицей(т.е экспортирует ВСЕ записи), страница которой была активной перед тем как перешли на страницу с этой кнопкой. Если экспортировать с другого DBGrid-а, то отображается только 1 строка. Как быть?
Используется вариант Vlad-а.
← →
iVovs (2004-05-22 15:47) [27]Да, кстати, а как экспортировать всё что долхно быть в DBGrid-e, а то таким способом можно предавать столько рядов, сколько видно на экране.
Или может есть какая-нить возможност напрямую из ClientDataSet экспортировать всё, что в нём есть в Excel. Помогите, если не лень.
← →
Vlad © (2004-05-22 15:50) [28]
> iVovs (22.05.04 15:33) [26]
Для начала давай все-таки определимся с постановкой вопроса.
Данные нужно выгружать только из DBGrid? (то есть только те, что видим)
(в этом случае будет работать мой вариант).
или же нужна выгрузка полного набора данных ?
(в этом случае будет работать вариант jack128).
← →
iVovs (2004-05-22 15:56) [29]В моёи случае нужна полная выгрузка.
Нужно в принципе экспортировать данные все что есть в наборе данных, но так как DBGrid отображает набор этих данных, то можно и из него.
← →
Vlad © (2004-05-22 16:05) [30]
> iVovs (22.05.04 15:56) [29]
Тогда не путайся с формулировками вопроса - это две разные вещи.
Ты можешь модифицировать этот код, убрав фиктивного наследника (TMyDBGrid) и соответственно убрать работу со всеми protected-свойствами DBGrid. Тогда вместо DataLink используй DataSource.DataSet
← →
iVovs (2004-05-22 16:54) [31]Всё, ув. Мастера, разобрался я с этим вопросом и получил желаемый результат.
Приведённый ниже код это обобщение полученной информации по данному вопросу - специально для тех кто не захочет вникать в смысл ответов по этому вопросу :). Этот код экспортирует данные из Grid-a в Excel(все данные, которые предоставляет Grid-у его DataSet)
Процедура:procedure TMAinForm.ToExcel(DBgrid: TDBGrid);
var
a,b: Integer;
ExApp, WB, WS: Variant;
begin
ExApp:=CreateOleObject("Excel.Application");
WB:=ExApp.WorkBooks.Add;
WS := ExApp.Workbooks[1].WorkSheets[1];
with DbGrid.DataSource.DataSet do
begin
Last;
First;
end;
with TMyDBGrid(DBGrid).DataLink do
begin
a:=0;
while not DbGrid.DataSource.DataSet.eof do
begin
for b:=0 to (FieldCount-1) do
begin
WS.Cells[a+1, b+1].Value:=Fields[b].AsString;
end;
DbGrid.DataSource.DataSet.Next;
a:= a+1;
end;
ExApp.Visible:=true;
try
ExApp.save; //сразу предлагает сохранить
except//чтобы не ругался если откажемся сохранять
end;
end;
end;
Вызов(надо передать только имя DBGrid-а):ToExcel(имя DBGrid-а)
Огромнейшее спасибо Vlad и jack128.
← →
jack128 © (2004-05-22 17:00) [32]Хе, ты таки не послушал умного совета и не прочитал статейку по первой ссылке, как я погляжу? Еще раз советую, обрати внимание на вариантные массивы. При более менее нормальных объемах дает ускорение в десятки - сотни раз...
← →
Vlad © (2004-05-22 17:04) [33]
> iVovs (22.05.04 16:54) [31]
нда... Плоховато ты что-то разобрался :-)
Еще раз говорю. Если нужна выгрузка из DataSet, то убери всякие DataLink"и и работай напрямую с DataSet"ом.
Методы Eof, Firs, Next тебе помогут.
----------------
Читайте книжки
← →
iVovs (2004-05-22 17:19) [34]Не, мне так и надо, дело в том что я хочу в Excel грузить только определённые. поля, которые отображает DBGrid, но по всем записям которые есть в DataSet, что и делает мой код.
Выгрузку из DataSet я тоже реализовал, но мне все поля не нужны, поэтому и выгружаю из Grid-а.
-------------------------
А книжки Мы читаем, вот только нету в них таких помощников как здесь :)
← →
iVovs (2004-05-22 17:22) [35]jack128 © (22.05.04 17:00) [32]
Хе, ты таки не послушал умного совета и не прочитал статейку по первой ссылке, как я погляжу? Еще раз советую, обрати внимание на вариантные массивы. При более менее нормальных объемах дает ускорение в десятки - сотни раз...
я её прочитал, но честно говоря не понял как, в моём конкретном примере, загрузить в этот вариантный массив данные из DBgrid-а.
← →
jack128 © (2004-05-22 17:36) [36]что тут непонятного
with DbGrid1.DataSource.DataSet do
begin
Last; // фетчим все записи
First;
ArrayData := VarArrayCreate([1, RecordCount, 1, Fields.Count], varVariant);
// Заполняем массив
for I := 1 to RecordCount do
begin
for J := 1 to Fields.Count do
ArrayData[I, J] := Fileds[j-1].AsVariant;
Next;
end;
end;
← →
Vlad © (2004-05-22 18:21) [37]
> iVovs (22.05.04 17:19) [34]
> Не, мне так и надо, дело в том что я хочу в Excel грузить
> только определённые. поля, которые отображает DBGrid
Эх... блин, опять код писатьprocedure ToExcel ;
var
a,b: Integer;
ExApp, WB, WS, Arr: Variant;
begin
a:=0;
ExApp:=CreateOleObject("Excel.Application");
WB:=ExApp.WorkBooks.Add;
WS := ExApp.Workbooks[1].WorkSheets[1];
with DBGrid1 do
begin
DataSource.DataSet.DisableControls;
while not DataSource.DataSet.Eof do
begin
for b:=0 to (Columns.Count-1) do
begin
WS.Cells[a+1, b+1].Value:=Columns[b].Field.AsString;
end;
DataSource.DataSet.Next;
Inc(a);
end;
DataSource.DataSet.DisableControls;
ExApp.Visible:=true;
end;
end;
Я не стал переделывать под массив, неохота.
Но будет показывать именно те поля, которые отображает грид.
← →
Vlad © (2004-05-22 18:23) [38]Лучше было бы с массивом, как предложил jack128 © (22.05.04 17:36) [36], но тут надо учесть, что RecordCount не всегда и не везде возвращает то что надо, это уже не раз обсуждалось
← →
evgen (2004-05-27 08:13) [39]Привет, код вроде как работает, но при нажатии кнопки To Excel (На пример) не чего не происходит! Что делать дальше?!
← →
evgen (2004-05-27 08:14) [40]Привет, код вроде как работает, но при нажатии кнопки To Excel (На пример) не чего не происходит! Что делать дальше?!
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.03 c