![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как экспортировать содержимое DBGrid в Excel [D7]
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]Хотя мой код тоже неплохо бы доработать, ну например выкладывать значения на лист не по ячейкам, а целиком через массив, и.т.д есть еще кое-какие мелочи, но я думаю автор разберется.