Є исходник з питання?
Потрібен исходник який виконує експорт вміст з DBgrid в Excel
> evgen # XA0; (17.05.04 14:03) # XA0;
Ось, не полінувався спеціально для тебе написав приблизний код:
type
TMyDBGrid = class (TDBGrid);
.
procedure ToExcel;
var
# XA0; a, b: Integer;
# XA0; ExApp, WB, WS: Variant;
begin
# XA0; ExApp: = CreateOleObject ( "Excel.Application");
# XA0; WB: = ExApp.WorkBooks.Add;
# XA0; WS: = ExApp.Workbooks [1] .WorkSheets [1];
# XA0; with TMyDBGrid (DBGrid1) .DataLink do
# XA0; begin
# XA0; # XA0; for a: = 0 to (RecordCount-1) do
# XA0; # XA0; begin
# XA0; # XA0; # XA0; for b: = 0 to (FieldCount-1) do
# XA0; # XA0; # XA0; begin
# XA0; # XA0; # XA0; # XA0; WS.Cells [a + 1, b + 1] .Value: = Fields [b] .AsString;
# XA0; # XA0; # XA0; end;
# XA0; # XA0; end;
# XA0; # XA0; ExApp.Visible: = true;
# XA0; end;
end;
Тут вміст DBGrid вивантажується на лист Excel
Але це тобі треба?
Дякуємо. Зараз подивлюся!
Дає помилку, схоже чогось не вистачає на формі:
[Error] Unit1.pas (32): Undeclared identifier: "CreateOleObject"
в рядку:
ExApp: = CreateOleObject ( "Excel.Application");
> evgen # XA0; (17.05.04 14:53) [8]
Вибач, брат, зовсім забув (горе мені)
uses ComObj
:-)
А це що?
В рядку:
with TMyDBGrid (DBGrid1) .DataLink do
помилка:
[Error] Unit1.pas (36): Undeclared identifier: "TMyDBGrid"
> evgen # XA0; (17.05.04 15:10) [10]
> А це що?
А це значить ти в розділі type не оголосив тип
TMyDBGrid = class (TDBGrid);
Читай уважніше [5] пост
# XA0; # XA0; TMyDBGrid = class (TDBGrid);
type
# XA0; TMyDBGrid = class (TDBGrid);
# XA0; TForm1 = class (TForm)
# XA0; Table1: TTable;
# XA0; DataSource1: TDataSource;
# XA0; DBGrid1: TDBGrid;
# XA0; procedure ToExcel;
private
# XA0;
public
# XA0;
end;
Та ніби так і роблю!
unit Unit1;
uses
# XA0; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
# XA0; Dialogs, Grids, DBGrids, DB, DBTables, ComObj;
type
# XA0; TMyDBGrid = class (TDBGrid);
# XA0; TForm1 = class (TForm)
# XA0; Table1: TTable;
# XA0; DataSource1: TDataSource;
# XA0; DBGrid1: TDBGrid;
# XA0; procedure ToExcel;
# XA0; private
# XA0; # XA0;
# XA0; public
# XA0; # XA0;
# XA0; end;
var
# XA0; Form1: TForm1;
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
# XA0; for a: = 0 to (RecordCount-1) do
# XA0; begin
# XA0; # XA0; for b: = 0 to (FieldCount-1) do
# XA0; # XA0; begin
# XA0; # XA0; # XA0; WS.Cells [a + 1, b + 1] .Value: = Fields [b] .AsString;
# XA0; # XA0; end;
# XA0; end;
# XA0; ExApp.Visible: = true;
end;
end;
> Vlad
Поки чето не вийшло. Пізніше продовжимо! Дякуємо!
Така ж проблема як і у evgen потрібно експортувати дані з Grida Excel.
Спробував запропонований код, але він виводить тільки один запис (на якій знаходиться курсор) з Grid стільки раз, скільки видимих рядів в Grid.
Може кому не лінь - допоможіть розібратися.
with DbGrid1.DataSource.DataSet do
begin
# XA0; Last;
# XA0; First;
end;
> For a: = 0 to (RecordCount-1) do
> # XA0; begin
> # XA0; # XA0; for b: = 0 to (FieldCount-1) do
> # XA0; # XA0; begin
> # XA0; # XA0; # XA0; WS.Cells [a + 1, b + 1]. Value: = Fields [b] .AsString;
> # XA0; # XA0; end;
# XA0; # XA0; # XA0; DbGrid1.DataSource.DataSet.Next; # XA0;
> # XA0; end;
> # XA0;
підкреслена рядок - вірний шлях до гальм, як треба см лінк вище ..
> Спробував запропонований код, але він виводить тільки один запис (на
> Якої знаходиться курсор) з Grid стільки раз, скільки видимих
> Рядів в Grid
см мої додавання до коду ..
Так як все таки без траблів завантажити з Grid в Excel?
> iVovs # XA0; (22.05.04 14:10) [17]
вибачте, помилочка закралася,
.
with TMyDBGrid (DBGrid1) .DataLink do
begin
# XA0; for a: = 0 to (RecordCount-1) do
# XA0; begin
# XA0; # XA0; ActiveRecord: = a; // я забув дописати цей рядок
# XA0; # XA0; for b: = 0 to (FieldCount-1) do
# XA0; # XA0; begin
.
> Чи потрібен експорт з DBGrid, а не з DataSet, згідно постановці
> Питання твоя відповідь впринципі невірний
е-е-е..Ну тоді постановку можна вважати невірною бо у DbGrid "a з вмісту хіба що назва колонок, всі інші дані належать DataSet" у.
Тому, вибачте вже, але яке питання - така відповідь.
Та не сперечайтеся Ви так.
І той і інший приклад працюють як годинник, ось тільки коли через DataSet відбувається запис в Excel - можна спостерігати процес на DB Gride.
> iVovs # XA0; (22.05.04 15:17) [24]
> Відбувається запис в Excel - можна спостерігати процес на DB
> Gride.
DataSet.DisableControls
DataSet.EnableControls
Блін, зіткнувся з іншою проблемою:
У мене DBGrid-и перебувають на різних сторінках (PageControl), а на окремій - сама "можливість" експорту в Excel. Так ось ця можливість або чудо-кнопка, коректно працює з тією таблицею (тобто експортує всі записи), сторінка якої була активною перед тим як перейшли на сторінку з цією кнопкою. Якщо експортувати з іншого DBGrid-а, то відображається тільки 1 рядок. Як бути?
Використовується варіант Vlad-а.
Так, до речі, а як експортувати все що долхно бути в DBGrid-e, а то таким способом можна зраджувати стільки рядів, скільки видно на екрані.
Або може є якась нитка возможност безпосередньо з ClientDataSet експортувати все, що в ньому є в Excel. Допоможіть, якщо не лінь.
> iVovs # XA0; (22.05.04 15:33) [26]
Для початку давай все-таки визначимося з постановкою питання.
Дані потрібно вивантажувати тільки з DBGrid? (Тобто тільки ті, що бачимо)
(В цьому випадку буде працювати мій варіант).
або ж потрібна вивантаження повного набору даних?
(В цьому випадку буде працювати варіант jack128).
У моёі випадку потрібна повне вивантаження.
Потрібно в принципі експортувати дані все що є в наборі даних, але так як DBGrid відображає набір цих даних, то можна і з нього.
> iVovs # XA0; (22.05.04 15:56) [29]
Тоді не плутайся з формулюваннями питання - це дві різні речі.
Ти можеш модифікувати цей код, прибравши фіктивного спадкоємця (TMyDBGrid) і відповідно прибрати роботу з усіма protected-властивостями DBGrid. Тоді замість DataLink використовуй DataSource.DataSet
Все, ув. Майстри, розібрався я з цим питанням і отримав бажаний результат.
Наведений нижче код це узагальнення отриманої інформації з даного питання - спеціально для тих хто не захоче вникати в сенс відповідей з цього питання :). Цей код експортує дані з 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
# XA0; a: = 0;
# XA0; while not DbGrid.DataSource.DataSet.eof do
# XA0; begin
# XA0; # XA0; for b: = 0 to (FieldCount-1) do
# XA0; # XA0; begin
# XA0; # XA0; # XA0; WS.Cells [a + 1, b + 1] .Value: = Fields [b] .AsString;
# XA0; # XA0; end;
# XA0; # XA0; # XA0; DbGrid.DataSource.DataSet.Next;
# XA0; a: = a + 1;
# XA0; end;
# XA0; ExApp.Visible: = true;
# XA0; try
# XA0; ExApp.save; // відразу пропонує зберегти
# XA0; except // щоб не лаявся якщо відмовимося зберігати
# XA0; end;
end;
end;
Виклик (треба передати тільки ім'я DBGrid-а):
Величезне спасибі Vlad і jack128.
Хе, ти таки не послухав розумного ради і не прочитав статейку по першій посиланням, як я подивлюся? Ще раз раджу, зверни увагу на варіантні масиви. При більш менш нормальних обсягах дає прискорення в десятки - сотні разів.
> iVovs # XA0; (22.05.04 16:54) [31]
нда. Поганенько ти щось розібрався :-)
Ще раз кажу. Якщо потрібна вивантаження з DataSet. то прибери всякі DataLink "і і працюй безпосередньо з DataSet" ом.
Методи Eof, Firs, Next тобі допоможуть.
Не, мені так і треба, справа в тому що я хочу в Excel вантажити тільки певні. поля, які відображає DBGrid, але за всіма записами які є в DataSet, що і робить мій код.
Вивантаження з DataSet я теж реалізував, але мені все поля не потрібні, тому і вивантажують з Grid-а.
-------------------------
А книжки Ми читаємо, ось тільки немає в них таких помічників як тут :)
я її прочитав, але чесно кажучи не зрозумів як, в моєму конкретному прикладі, завантажити в цей варіантний масив дані з DBgrid-а.
що тут незрозумілого
with DbGrid1.DataSource.DataSet do
begin
# XA0; Last; // Фетч всі записи
# XA0; First;
# XA0; ArrayData: = VarArrayCreate ([1, RecordCount, 1, Fields.Count], varVariant);
# XA0; // Заповнюємо масив
# XA0; for I: = 1 to RecordCount do
# XA0; begin
# XA0; # XA0; for J: = 1 to Fields.Count do
# XA0; # XA0; # XA0; ArrayData [I, J]: = Fileds [j-1] .AsVariant;
# XA0; # XA0; Next;
# XA0; end;
end;
> iVovs # XA0; (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
# XA0; DataSource.DataSet.DisableControls;
# XA0; while not DataSource.DataSet.Eof do
# XA0; begin
# XA0; # XA0; for b: = 0 to (Columns.Count-1) do
# XA0; # XA0; begin
# XA0; # XA0; # XA0; WS.Cells [a + 1, b + 1] .Value: = Columns [b] .Field.AsString;
# XA0; # XA0; end;
# XA0; # XA0; DataSource.DataSet.Next;
# XA0; # XA0; Inc (a);
# XA0; end;
# XA0; DataSource.DataSet.DisableControls;
# XA0; ExApp.Visible: = true;
end;
end;
Я не став переробляти під масив, не хочеться.
Але буде показувати саме ті поля, які відображає грід.
Привіт, код ніби як працює, але при натисканні кнопки To Excel (На приклад) НЕ # XA0; чого не відбувається! Що робити далі?!
Привіт, код ніби як працює, але при натисканні кнопки To Excel (На приклад) НЕ # XA0; чого не відбувається! Що робити далі?!