Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как экспортировать содержимое DBGrid в Excel [D7]


Страницы:   1 2

evgen ©   (2004-05-17 14:03:00) 

Помогите советом или толковой ссылкой для начинающих!


evgen   (2004-05-27 08:14:00) [1]

Привет, код вроде как работает, но при нажатии кнопки To Excel (На пример) не  чего не происходит! Что делать дальше?!


evgen   (2004-05-27 08:13:00) [2]

Привет, код вроде как работает, но при нажатии кнопки To Excel (На пример) не  чего не происходит! Что делать дальше?!


Vlad   (2004-05-22 18:23:00) [3]

Лучше было бы с массивом, как предложил jack128 ©   (22.05.04 17:36) [36], но тут надо учесть, что RecordCount не всегда и не везде возвращает то что надо, это уже не раз обсуждалось


Vlad   (2004-05-22 18:21:00) [4]


> 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;


Я не стал переделывать под массив, неохота.
Но будет показывать именно те поля, которые отображает грид.


jack128   (2004-05-22 17:36:00) [5]

что тут непонятного

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;


iVovs   (2004-05-22 17:22:00) [6]

jack128 ©   (22.05.04 17:00) [32]
Хе, ты таки не послушал умного совета и не прочитал статейку по первой ссылке, как я погляжу? Еще раз советую, обрати внимание на вариантные массивы. При более менее нормальных объемах дает ускорение в десятки - сотни раз...



я её прочитал, но честно говоря не понял как, в моём конкретном примере, загрузить в этот вариантный массив данные из DBgrid-а.


iVovs   (2004-05-22 17:19:00) [7]

Не, мне так и надо, дело в том что я хочу в Excel грузить только определённые. поля, которые отображает DBGrid, но по всем записям которые есть в DataSet, что и делает мой код.

Выгрузку из DataSet я тоже реализовал, но мне все поля не нужны, поэтому и выгружаю из Grid-а.

-------------------------
А книжки Мы читаем, вот только нету в них таких помощников как здесь :)


Vlad   (2004-05-22 17:04:00) [8]


> iVovs   (22.05.04 16:54) [31]

нда... Плоховато ты что-то разобрался :-)
Еще раз говорю. Если нужна выгрузка из DataSet, то убери всякие DataLink'и и работай напрямую с DataSet'ом.
Методы Eof, Firs, Next тебе помогут.

----------------
Читайте книжки


jack128   (2004-05-22 17:00:00) [9]

Хе, ты таки не послушал умного совета и не прочитал статейку по первой ссылке, как я погляжу? Еще раз советую, обрати внимание на вариантные массивы. При более менее нормальных объемах дает ускорение в десятки - сотни раз...


iVovs   (2004-05-22 16:54:00) [10]

Всё, ув. Мастера, разобрался я с этим вопросом и получил желаемый результат.
Приведённый ниже код это обобщение полученной информации по данному вопросу - специально для тех кто не захочет вникать в смысл ответов по этому вопросу :). Этот код экспортирует данные из 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.


Vlad   (2004-05-22 16:05:00) [11]


> iVovs   (22.05.04 15:56) [29]

Тогда не путайся с формулировками вопроса - это две разные вещи.
Ты можешь модифицировать этот код, убрав фиктивного наследника (TMyDBGrid) и соответственно убрать работу со всеми protected-свойствами DBGrid. Тогда вместо DataLink используй DataSource.DataSet


iVovs   (2004-05-22 15:56:00) [12]

В моёи случае нужна полная выгрузка.

Нужно в принципе экспортировать данные все что есть в наборе данных, но так как DBGrid отображает набор этих данных, то можно и из него.


Vlad   (2004-05-22 15:50:00) [13]


> iVovs   (22.05.04 15:33) [26]

Для начала давай все-таки определимся с постановкой вопроса.
Данные нужно выгружать только из DBGrid? (то есть только те, что видим)
(в этом случае будет работать мой вариант).
или же нужна выгрузка полного набора данных ?
(в этом случае будет работать вариант jack128).


iVovs   (2004-05-22 15:47:00) [14]

Да, кстати, а как экспортировать всё что долхно быть в DBGrid-e, а то таким способом можно предавать столько рядов, сколько видно на экране.
Или может есть какая-нить возможност напрямую из ClientDataSet экспортировать всё, что в нём есть в Excel. Помогите, если не лень.


iVovs   (2004-05-22 15:33:00) [15]

Блин, столкнулся с другой проблемой:

У меня DBGrid-ы находятся на разных страницах(PageControl), а на отдельной - сама "возможность" экспорта в Excel. Так вот эта возможность или чудо-кнопка, корректно работает с той таблицей(т.е экспортирует ВСЕ записи), страница которой была активной перед тем как перешли на страницу с этой кнопкой. Если экспортировать с другого DBGrid-а, то отображается только 1 строка. Как быть?

Используется вариант Vlad-а.


Vlad   (2004-05-22 15:21:00) [16]


> iVovs   (22.05.04 15:17) [24]


> происходит запись в Excel - можно наблюдать процесс на DB
> Gride.

DataSet.DisableControls
DataSet.EnableControls


iVovs   (2004-05-22 15:17:00) [17]

Да не спорьте Вы так.
И тот и другой пример работают как часы, вот только когда через DataSet происходит запись в Excel - можно наблюдать процесс на DB Gride.

Спасибо за отзывчивость.
------------------------
Мир не без добрых людей!


Vlad   (2004-05-22 15:07:00) [18]


> jack128 ©   (22.05.04 15:01) [22]


> DbGrid'a из содержимого разве что название колонок, все
> остальные данные пренадлежат DataSet'у...

Ну это так же неверное утверждение.
DBgrid имеет свой буфер (объект TDataLink), где и хранит те записи, которые показывает. Соотв. при скроллинге и/или изменении размеров по вертикали этот буфер обновляется из DataSet

Поэтому, извините уж, но каков вопрос - таков ответ.


jack128   (2004-05-22 15:01:00) [19]


> Нужен экспорт из DBGrid, а не из DataSet, согласно постановке
> вопроса твой ответ впринципе неверен
э-э-э..Ну тогда постановку можно считать неверной ибо у DbGrid'a из содержимого разве что название колонок, все остальные данные пренадлежат DataSet'у...


Vlad   (2004-05-22 14:59:00) [20]

Хотя мой код тоже неплохо бы доработать, ну например выкладывать значения на лист не по ячейкам, а целиком через массив, и.т.д есть еще кое-какие мелочи, но я думаю автор разберется.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо