Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Как экспортировать содержимое 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.055 c
3-1085720574
Salik
2004-05-28 09:02
2004.06.20
Поле типа счетчик


6-1082950771
HellWaiter
2004-04-26 07:39
2004.06.20
Пересылка огромных файлов по локальной сети


3-1085734293
Bizon
2004-05-28 12:51
2004.06.20
Установка IBExpert


14-1086336663
Рамиль
2004-06-04 12:11
2004.06.20
Большой трафик ns


3-1085755483
ceval
2004-05-28 18:44
2004.06.20
как посредствам ADOTable связать две таблицы