Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.56 MB
Время: 0.036 c
14-1086270924
Igorek
2004-06-03 17:55
2004.06.20
Порекоммендуйте программу типа WinPopup или NetMeeting


1-1086595878
rosl
2004-06-07 12:11
2004.06.20
удалить файлы


14-1086333700
Baks
2004-06-04 11:21
2004.06.20
Из рубрики Знаменательная математика2


1-1086606807
_alex_
2004-06-07 15:13
2004.06.20
Запуск индикатора процесса


1-1086457399
8ung
2004-06-05 21:43
2004.06.20
Код символа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский