Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DbGrid To Excel & DataSet To Excel
#1
DBGrid'i Excele aktarmam gerekti yapmışken buraya da atayım dedim. İhtiyacı olan kullansın, var ise hatam veya daha kolay yolu yordamı yorum ile bildirirseniz sevinirim.

unit DbGridToExcel;

interface

uses
  comobj, Vcl.DBGrids, Data.DB, System.SysUtils;

type
  TAutoFit = record
  public
    Baslangic: String;
    Bitis: String;
  end;

type
  TExcel = record
  private
  public
    WorkSheetsName: String;
    Folder: String;
    AutoFit: TAutoFit;
    Bold: String;
    procedure ExcExport(Grid: TDBGrid);
    procedure ExcExportDs(Data: TDataset);
  end;

implementation

procedure TExcel.ExcExport(Grid: TDBGrid);
var
  Excel, Workbook, Sheet: Variant;
  i, a: integer;
begin
  Excel := CreateOleObject('EXCEL.APPLICATION');
  Workbook := Excel.workbooks.Add;
  Sheet := Workbook.worksheets[1];
  Grid.DataSource.DataSet.First;
  for i := 1 to Grid.Columns.Count do
  begin
    Sheet.cells[1, i] := Grid.Columns[i - 1].FieldName;
  end;
  for I := 2 to Grid.DataSource.DataSet.RecordCount + 1 do
  begin
    for a := 0 to Grid.Columns.Count - 1 do
    begin
      Sheet.cells[i, a + 1] := Grid.DataSource.DataSet.Fields[a].AsString;
    end;
    Grid.DataSource.DataSet.Next;
  end;
  if (Bold <> '') then
    Excel.Range[Bold].Font.Bold := True;
  if (Trim(AutoFit.Baslangic) <> '') and (Trim(AutoFit.Bitis) <> '') then
    Excel.Range[AutoFit.Baslangic, AutoFit.Bitis].EntireColumn.AutoFit;
  if WorkSheetsName <> '' then
    Excel.workbooks[1].worksheets[1].Name := WorkSheetsName
  else
    Excel.workbooks[1].worksheets[1].Name := 'yhackup';
  if Folder <> '' then
    Excel.ActiveWorkBook.SaveAs(Folder);
  Excel.visible := True;
end;

procedure TExcel.ExcExportDs(Data: TDataset);
var
  Excel, Workbook, Sheet: Variant;
  i, a: integer;
begin
  Excel := CreateOleObject('EXCEL.APPLICATION');
  Workbook := Excel.workbooks.Add;
  Sheet := Workbook.worksheets[1];
  Data.First;
  for i := 1 to Data.FieldCount do
  begin
    Sheet.cells[1, i] := Data.Fields[i - 1].FieldName;
  end;
  for I := 2 to Data.RecordCount + 1 do
  begin
    for a := 0 to Data.FieldCount - 1 do
    begin
      Sheet.cells[i, a + 1] := Data.Fields[a].AsString;
    end;
    Data.Next;
  end;

  if (Bold <> '') then
    Excel.Range[Bold].Font.Bold := True;
  if (Trim(AutoFit.Baslangic) <> '') and (Trim(AutoFit.Bitis) <> '') then
    Excel.Range[AutoFit.Baslangic, AutoFit.Bitis].EntireColumn.AutoFit;
  if WorkSheetsName <> '' then
    Excel.workbooks[1].worksheets[1].Name := WorkSheetsName
  else
    Excel.workbooks[1].worksheets[1].Name := 'yhackup';

  if Folder <> '' then
    Excel.ActiveWorkBook.SaveAs(Folder);
  Excel.visible := True;
end;

end.



Kullanımı Da bu şekilde;
var
ex:TExcel;
begin
 ex.WorkSheetsName := 'deneme';   // Zorunlu Değil
 ex.Folder := 'C:\Users\Yakup\Desktop\Excel-1.xls';   // Zorunlu Değil
 ex.AutoFit.Baslangic := 'A1';   // Zorunlu Değil
 ex.AutoFit.Bitis := 'Z1';   // Zorunlu Değil
 ex.Bold := 'A1:H1';   // Zorunlu Değil

 ex.ExcExportDs(Form9.DBGrid1.DataSource.DataSet);
 // ex.ExcExport(Form9.DBGrid1);
end;
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#2
Çok teşekkür hocam, elinize emeğinize sağlık.

E.O.F.  (End Of Fun )
Rolleyes
Cevapla
#3
(27-02-2017, Saat: 16:00)ramazan_t Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlÇok teşekkür hocam, elinize emeğinize sağlık.

Teşekkürler
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#4
(27-02-2017, Saat: 15:54)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlDBGrid'i Excele aktarmam gerekti yapmışken buraya da atayım dedim. İhtiyacı olan kullansın, var ise hatam veya daha kolay yolu yordamı yorum ile bildirirseniz sevinirim.

unit DbGridToExcel;

interface
uses
 comobj,Vcl.DBGrids;
type
  TExcel = record
  private
 public
    WorkSheetsName   :String;
    Folder           :String;
    procedure ExcExport(Grid:TDBGrid);
 end;

implementation


procedure TExcel.ExcExport(Grid:TDBGrid);
var
Excel,Workbook,Sheet:Variant;
i,a:integer;
begin
 Excel := CreateOleObject('EXCEL.APPLICATION');
 Workbook := Excel.workbooks.Add;
 Sheet := Workbook.worksheets[1];
 Grid.DataSource.DataSet.First;
 for i := 1 to Grid.Columns.Count do
 begin
   Sheet.cells[1, i] := Grid.Columns[i - 1].FieldName;
 end;
 for I := 2 to Grid.DataSource.DataSet.RecordCount + 1 do
 begin
   for a := 0 to Grid.Columns.Count - 1 do
   begin
     Sheet.cells[i, a + 1] := Grid.DataSource.DataSet.Fields[a].AsString;
   end;
   Grid.DataSource.DataSet.Next;
 end;
 Excel.Range['A1', 'H1000'].EntireColumn.AutoFit;
 Excel.Range['A1:H1'].Font.Bold := True;
 if WorkSheetsName <> '' then
   Excel.WorkBooks[1].WorkSheets[1].Name := WorkSheetsName
 else
   Excel.WorkBooks[1].WorkSheets[1].Name := 'yhackup';
 if Folder <> '' then  Excel.ActiveWorkBook.SaveAs(Folder);
 Excel.visible := True;
end;

end.


Kullanımı Da bu şekilde;
procedure xtest;
var
ex:TExcel;
begin
ex.WorkSheetsName := 'deneeme';
ex.Folder := 'C:\Users\Yakup\Desktop\asc\Excel-1.xls';
ex.ExcExport(Form9.DBGrid1);
end;

Merhaba,
'A1', 'H1000' ve 'A1:H1' aralıkları sabit tanımlanmasa, doğrudan dbGrid sütün sayısı ve kayıt sayısı ile aralık belirlense,
WorkSheets Name ve Folder prosedür içerisinde doğrudan parametrik olsa,
daha dinamik bir yapı olaur, diye düşünüyorum.
Paylaşım için teşekkürler.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
Sizin yerinizde olsam; öncelikle GetActiveOleObject ile açık olan bir Excel var mı diye kontrol eder var ise onun üzerinden devam eder, yok ise CreateOleObject ile devam ederdim.

 İkinci olarak, Export metoduna parametre olarak TDBGrid geçmek pek makul değil. Yarın öbürgün başka bir Grid nesnesinde kod üzerinde değişiklik yapmanız icap eder. İlgili metoda TDBGrid yerine TDataSet geçerseniz çok daha generic bir kodunuz olur.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
Kullanicinin makinesinde ofis yuklu olmamasi bu kod orneginde sikintiya neden olabilir.
Bunun yerine griddeki kayitlarin <table> </table> etiketleri arasinda yer aldigi bir html belge olusturup bu dosyayi xls uzantisi ile kaydetip excel ile actiriyordum.
Excel bu tur dosyalari basarili bir sekilde acabiliyor.
WWW
Cevapla
#7
(27-02-2017, Saat: 16:29)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlSizin yerinizde olsam; öncelikle GetActiveOleObject ile açık olan bir Excel var mı diye kontrol eder var ise onun üzerinden devam eder, yok ise CreateOleObject ile devam ederdim.

 İkinci olarak, Export metoduna parametre olarak TDBGrid geçmek pek makul değil. Yarın öbürgün başka bir Grid nesnesinde kod üzerinde değişiklik yapmanız icap eder. İlgili metoda TDBGrid yerine TDataSet geçerseniz çok daha generic bir kodunuz olur.

Mantıklı bu bilgilendirme için teşekkür ederim. deneyeceğim

(27-02-2017, Saat: 16:37)sadettinpolat Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlKullanicinin makinesinde ofis yuklu olmamasi bu kod orneginde sikintiya neden olabilir.
Bunun yerine griddeki kayitlarin <table> </table> etiketleri arasinda yer aldigi bir html belge olusturup bu dosyayi xls uzantisi ile kaydetip excel ile actiriyordum.
Excel bu tur dosyalari basarili bir sekilde acabiliyor.

Haklısınız, Office yüklü olmalı.
Artık her bilgisayarda office vardır diye önemsemedim açıkcası, ihtiyacı olan, projede kullanacak arkadaşlar yorumunuzu görüp o yönde yapmaları daha mantıklı olur.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#8
(27-02-2017, Saat: 16:18)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'A1', 'H1000' ve 'A1:H1' aralıkları sabit tanımlanmasa, doğrudan dbGrid sütün sayısı ve kayıt sayısı ile aralık belirlense, 

Evet atlamışım burayı, halledeceğim Wink

Edit: Düzenledim.

Yeni başlayanlar için oldukça basit ve kullanışlı oldu sanırım.

(27-02-2017, Saat: 16:18)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlWorkSheets Name ve Folder prosedür içerisinde doğrudan parametrik olsa,

procedure TExcel.ExcExportDs(Data: TDataset;WorkSheetsName,SaveFolder:String);
Bu şekilde demek istediniz sanırım. olabilirdi haklısınız.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#9
MErhabalar.

Ben artık DBGrid kullanmayı tercih etmiyorum. Nedeni ise LockConlict e düşmesi vs sıkıntılar oluyor. Genelde Stringgrid ile işimi hallediyorum.

Excel Import/Export konuunsda ise :ADVStringgrid i kullanırsanız, yine TMS nin ADVGridExelIO componenti ile tek tuşla hem de hücreyi özellikleriyle import ve export yapabiliyorum. Hız konusu ise: yaklaşık 5bin kaydı 6-7sn gibi bir sürede import yada export edebiliyor.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Excel Export PDF pro_imaj 16 5.480 04-07-2018, Saat: 18:21
Son Yorum: pro_imaj
  Excel, PDF ve Yazıcı formu Component 3ddark 8 221 22-06-2018, Saat: 14:46
Son Yorum: edo
  Excel'e aktarım ile ilgili emrekilinc1984 12 1.536 27-04-2018, Saat: 18:31
Son Yorum: rahim@kirazyazilim.com
  dbgrid de sağ sol tuşlarını kullanma erdogan 6 313 03-04-2018, Saat: 18:40
Son Yorum: erdogan
  DBGrid Columns Otomatik Boyutlandırma hyperxman 7 502 23-01-2018, Saat: 10:00
Son Yorum: Cyber



Konuyu Okuyanlar: 1 Ziyaretçi