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

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

как эспортировать содержимое DBGrid в Excel !? [D6, Win2k]


beginnn ©   (2005-02-10 12:24:00) 

Здравствуйте!

Как эспортировать содержимое DBGrid в Excel !?


Ega23   (2005-02-11 11:38:00) [1]

Я по наивности своей думаю что все только через ADO и работают, про экзотику забыл :)

Почему сразу "экзотику"? Что, свет клином на OLE DB сошёлся?


Fareader   (2005-02-11 11:35:00) [2]

2Карелин Артем ©
Сорри - действительно недосмотрел :(


Карелин Артем   (2005-02-11 11:33:00) [3]

Кстати я автора этих статей по нескольким вопросам направлял на путь истинный в те времена.


Карелин Артем   (2005-02-11 11:28:00) [4]

Fareader   (11.02.05 11:00) [11]
Странно. У меня 1700 страниц в масштабе 60% уходят за 46 секунд.
Советую повнимательнее посмотреть мой код.


Danilka   (2005-02-11 11:14:00) [5]

[14] Manfred8   (11.02.05 11:10)
Их есть у меня. :)) Еще та версия, которая была бесплатная, еще не под крышей ТМС. Сам могу скинуть кому-нибудь. :))

Только ее применение гораздо более широкое, чем экспорт дбгрида.


Manfred8   (2005-02-11 11:10:00) [6]

Могу скинуть на мыло


Danilka   (2005-02-11 11:07:00) [7]

[12] Manfred8   (11.02.05 11:03)
Угу, только они платные стали, после того, как начали распостраняться ТМС, а не разработчиком.


Manfred8   (2005-02-11 11:03:00) [8]

Есть замечательные компаненты от TMS :FlexCel кажется называются.Рекомендую.


Fareader   (2005-02-11 11:00:00) [9]

2Карелин Артем ©   (10.02.05 14:23) [6]
Если использовать указаный подход, то тормоза будут жуткие - рекомендую посмотреть на заргузку процессора в этот момент - загрузка данных в Excel по ячеечно - извращение. Рекомендую почитать серию статей "По волнам интеграции" на "Королевстве Delphi"


aus   (2005-02-11 03:27:00) [10]

Danilka ©   (10.02.05 22:23) [9]
rec := TCustomADODataSet(DBGrid.DataSource.DataSet).Recordset


Вот про это я думал, но поленился проверить, а потому и не написал.

Danilka ©   (10.02.05 22:23) [9]
подключаться к своей СУБД через АДО


Я по наивности своей думаю что все только через ADO и работают, про экзотику забыл :)


Danilka   (2005-02-10 22:23:00) [11]

[8] aus   (10.02.05 18:17)
Тем, что имеет ограниченное применение - программа должна уметь подключаться к своей СУБД через АДО. :)
Кстати, если датасет, чьи данные отображаются в гриде - наследник TCustomADODataSet, то можно и проще, вместо:

XL.Range['a1'].CopyFromRecordset(Conn.Execute('select * from Table1'));

сделать примерно так:

rec := TCustomADODataSet(DBGrid.DataSource.DataSet).Recordset;
XL.Range['a1'].CopyFromRecordset(rec);

соответсвтенно убрать все, что касается Conn. :)


aus   (2005-02-10 18:17:00) [12]


> Как эспортировать содержимое DBGrid в Excel !?


А чем плох примерно такой способ?
procedure TForm1.Button1Click(Sender: TObject);
var XL, Conn: variant;
begin
    Conn := CreateOleObject('ADODB.Connection');
    XL := CreateOleObject('Excel.Application');
    try
       Conn.ConnectionString := 'FILE NAME=c:\temp\test.udl';
       Conn.Open;
       XL.Workbooks.Add('C:\temp\test.xls');
       XL.Range['a1'].CopyFromRecordset(Conn.Execute('select * from Table1')); //Здесь запрос, который используеися для заполнения грида.
       XL.Visible := true;
       Conn.Close;
       XL.ActiveSheet.PrintPreview(false);
       XL.ActiveWorkbook.Close(false);
    finally
       XL := Unassigned;
       Conn := Unassigned;
    end;
end;


Карелин Артем   (2005-02-10 14:27:00) [13]

ComObj в uses у меня стоит.


Карелин Артем   (2005-02-10 14:23:00) [14]

Вот и кусман из моего проекта.

procedure TfReport_TO2.Button2Click(Sender: TObject);
var Excel,WorkBook,Sheet:variant;
i:integer;
begin
if not DBGridEh1.DataSource.DataSet.Active then exit;
try
 Excel := CreateOleObject('Excel.Application');
 Excel.SheetsInNewWorkbook := 2;
 WorkBook := Excel.WorkBooks.Add ;
 Sheet := WorkBook.WorkSheets[1];
except
 ShowMessage('Невозможно запустить MS Excel');
 exit;
end;
i:=MainData.Grid2Excel(Sheet,3,1,DBGridEh1);
Sheet.UsedRange.Borders.LineStyle :=1;
Sheet.UsedRange.BorderAround(1,3);
Sheet.Cells[i+4,1].Value:='Всего';
Sheet.Cells[i+4,3].FormulaR1C1:='=ROWS(R[-'+IntToStr(i)+']C:R[-1]C)';
Sheet.Cells.Columns.AutoFit;
Sheet.Cells[1,1].Value:=MainData.GetTitle1('');
Sheet.Cells[2,1].Value:=MainData.Get1DateTitle(Self.Caption,Now);
Sheet := WorkBook.WorkSheets[2];
MainData.Grid2Excel(Sheet,3,1,DBGridEh2);
Sheet.Cells.Columns.AutoFit;
Sheet.UsedRange.Borders.LineStyle :=1;
Sheet.UsedRange.BorderAround(1,3);
Sheet.Cells[2,1].Value:=Self.Caption;
Excel.Visible:=true;
Excel.ScreenUpdating:=true;
Sheet:=Unassigned;
WorkBook:=Unassigned;
Excel:=Unassigned;
end;

function TMainData.Grid2ExcelEx(const ExcelDoc: variant; const row,
 col: integer; const Grid: TDBGridEh; const ShowTitles: Boolean;const ExFormat:string='@'):integer;
var x,y:integer;
   bm:TBookmark;
   {BeginCol, BeginRow, }i, j : integer;
   RowCount, ColCount : integer;
   Cell1, Cell2,ArrayData:Variant;
begin
Screen.Cursor:=crHourGlass;
try
fProgressForm:=TfProgressForm.Create(Grid);
fProgressForm.Caption:='Идет загрузка данных.';
fProgressForm.Show;
Application.ProcessMessages;
y:=row;
Grid.DataSource.DataSet.DisableControls;
bm:=Grid.DataSource.DataSet.GetBookmark;
Grid.DataSource.DataSet.First;
if ShowTitles then
 for x:=0 to Grid.Columns.Count-1 do
  begin
   ExcelDoc.Cells[y,x+col].Value:=StringReplace(Grid.Columns[x].Title.Caption,'|',#10,[rfReplaceAll]);
   ExcelDoc.Cells[y,x+col].Font.Bold:=true;
  end;
Grid.DataSource.DataSet.Last;
Grid.DataSource.DataSet.First;
fProgressForm.ProgressBar1.Max:=Grid.DataSource.DataSet.RecordCount;
RowCount:=Grid.DataSource.DataSet.RecordCount;
ColCount:=Grid.Columns.Count;
ArrayData := VarArrayCreate([1, RowCount+1, 1, ColCount], varVariant);
i:=1;
while not(Grid.DataSource.DataSet.Eof or (Grid.DataSource.DataSet.RecNo>65000)) do
 begin
  for J := 1 to ColCount do
   begin
    ArrayData[I, J] := Grid.Columns[j-1].Field.Text;
   end;
  inc(i);
  RowCount:=i;
  Grid.DataSource.DataSet.Next;
  fProgressForm.ProgressBar1.StepIt;
  Application.ProcessMessages;
 end;
fProgressForm.Caption:='Идет вывод данных в Excel.';
Cell1 := ExcelDoc.Cells[Row+1, Col];
Cell2 := ExcelDoc.Cells[Row  + RowCount-1, Col +ColCount - 1];
ExcelDoc.Cells.NumberFormat:=ExFormat;
ExcelDoc.Range[Cell1, Cell2].Value := ArrayData;
Grid.DataSource.DataSet.GotoBookmark(bm);
Grid.DataSource.DataSet.FreeBookmark(bm);
Grid.DataSource.DataSet.EnableControls;
Screen.Cursor:=crDefault;
Result:=RowCount-1;
finally
ArrayData:=Null;
FreeAndNil(fProgressForm);
end;
end;


Mamed   (2005-02-10 14:17:00) [15]

Function ExportGridToFile(FileName:String;Caption:TStringlist;D:TDbgrid;Mselected:Boolean):Integer;
var F:TextFile;
   i,k:Integer;
   s:string;
   r:Integer;
Procedure exportg;
Var i:Integer;s:string;
Begin
 D.DataSource.DataSet.DisableControls;
 D.DataSource.DataSet.First;
 while not D.DataSource.DataSet.Eof do
 begin
   s:='';
   For i:=0 to d.Columns.Count-1 do
     IF I=0 Then
       s:=d.Columns[i].Field.AsString
     else
       s:=s+ExcellColSep+d.Columns[i].Field.AsString;
   Writeln(f,s);
   D.DataSource.DataSet.Next ;
 end;
 D.DataSource.DataSet.EnableControls;
End;
begin
 ExportGridToFile:=0;
 if D.DataSource.DataSet.Active=false then
 begin
   ExportGridToFile:=1;
   exit;
 end ;
 try
    AssignFile(f,FileName);
    Rewrite(f);
 except
   Closefile(f);
   ShowMessage(FileName+' dosyasýna eriþilemedi.');
   ExportGridToFile:=1;
   exit;
 end;
 For i:=0 to Caption.Count-1 do
   Writeln(f,Caption.Strings[i]);
 r:=d.DataSource.DataSet.RecNo;
 s:='';
 For i:=0 to d.Columns.Count-1 do
   IF I=0 Then
     s:=d.Columns[i].Title.Caption
   else
     s:=s+ExcellColSep+d.Columns[i].Title.Caption;
 Writeln(f,s);
 If Mselected Then
 Begin
    k :=0;
    if D.SelectedRows.Count=0 Then
      exportg
    Else
      While k


Карелин Артем   (2005-02-10 13:47:00) [16]

В EhLib есть готовый модуль для экспорта без Екселя.


Ega23   (2005-02-10 12:54:00) [17]

2 Sergey13 ©   (10.02.05 12:41) [2]
Открываешь экспортно/импортную фирму? 8-)

Нет, готов поделится несколькими юнитами. А сюда они точно не влезут.
Прелесть в том, что функция может формировать Эксельный файл без установленного экселя.


Sergey13   (2005-02-10 12:41:00) [18]

2[1] Ega23 ©   (10.02.05 12:39)
Открываешь экспортно/импортную фирму? 8-)


Ega23   (2005-02-10 12:39:00) [19]

egorov@dedal.dubna.ru


Наверх

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