Ferrari Hızında Excel e veri gönderme

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Ferrari Hızında Excel e veri gönderme

Mesaj gönderen husonet »

Kod: Tümünü seç

procedure TForm1.ExcelAt(
  Qry: TDataset);
//Yazar : Hüseyin ÖZDEMİR
//Nikname : Husonet
//Tarih 14.12.2006

var
    Excel, Sayfa :variant;
    i     :integer;
    liste :TStringList;
    Str   :String;
    Mem   :TMemoryStream;
begin
    liste         := TStringList.Create;
    screen.Cursor := crHourGlass;
    try
      if not Qry.IsEmpty then
      begin
          str := '';
          Qry.DisableControls;
          Qry.First;
          while not Qry.Eof do
          begin
              for i := 0 to Qry.FieldCount - 1 do
              begin
                 str := str + Qry.Fields[i].AsString + #9;
              end;
              liste.Add(Str);
              str := '';
              Qry.Next;
          end;
          liste.Add(#0);
          Mem := TMemoryStream.Create;
          Liste.SaveToStream(Mem);
          ClipBoard.SetTextBuf(Mem.Memory);
          Excel := CreateOleObject('excel.application');
          Excel.visible := True;
          Excel.workbooks.add;
          Excel.ActiveSheet.paste;
      end;
    finally
        qry.EnableControls;
        liste.Free;
        Mem.Free;
        screen.Cursor := crDefault;
    end;

end;
Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

Bu neden Hızlı ki ?

normal kayıt
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Bu kod, öncesinde hiç excelle uğraşmadan verileri bir ayıraçla string liste atıyor ,sonra bu stringlist i memorystream olarak ClipBoard a kaydediyor, buraya kadar herşey ferrari hızında oluyor , son olarak excel i açıp clipboardaki veryi yapıştırıyor bu klasik yönteme göre kayde değer bir hız sağlıyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

peki clipboard aldığı veriye göre yavaş olacaktır
Dosyay Csv yazmak daha mantıklı değil mi ?
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@husonet hız konusunda haklı.

- Excel'e aralarında unuttuğum yoksa beş+buçuk :lol: şekilde veri aktarabilirsin.

1. OleAutomation ( klasik hepimizin kullandığı ComObj şekilde )
2. ADO ile excel dosyasına veritabanı gibi bağlanarak
3. Veriyi CSV text dosyası olarak kaydederek sonra Excel'den açtırarak.
4. Üçüncü parti bileşen/binary dosya işlemleri vs. ile veri kaydetmek için XLS dosyası üretme (3 nolu maddeye benzer oldu ama neyse :oops: )
5. DDE (Dynamic Data Exchange) ile tansfer

+

1/2 @husonet'in bahsettiği Copy/Paste metodu ile..

- Bunların çeşitli hız farklılıkları vardır. Genelde 1 nolu seçenek tercih edilir.

- Kopyala Yapıştır işleminden önce veriyi localde projenizde biriktirip, tümünü Text olarak windows clipboard'a kopyala yapıp, Excel'de bunu yapıştırmak şeklinderi.

- CSV ile benzer hızda olur ama CSV'deki ayraç karakteri sıkıntısı yoktur. Bu örnekte ise kayıtlarda #9 (TAB) karakteri varsa o zaman ayraç olan #9 (TAB) aynı sıkıntıyı yaratır vs.vs.vs.
Resim
Resim ....Resim
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

tuanna yazdı:peki clipboard aldığı veriye göre yavaş olacaktır
Dosyay Csv yazmak daha mantıklı değil mi ?
Bu işin en güzel cevabı test yapmanız olacaktır.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Huso Hoca ben bir deneyim dedim yaklaşık 6000 kayıt için

Kod: Tümünü seç

ClipBoard.SetTextBuf(Mem.Memory); 
Şarladı

Kod: Tümünü seç

 Undeclared identifier: 'ClipBoard'
Uses a ne eklemek lazım.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Pardon

uses kısmına Clipbrd, ComObj

eklemen yeterli olacaktır...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Comobj zaten vardı.clipbrd ekledim çalıştı fakat

Kod: Tümünü seç

[Variable 'Mem' might not have been initialized
compilede böle bir hata veriyor.
Ayrıca

Kod: Tümünü seç

excel.range['A1','L10000'].EntireColumn.AutoFit;
          excel.range['F1:H10000'].HorizontalAlignment :=-4152;
bunları da ben ekledim.
rakamsal olan alan 15000 diye geliyor copy paste olduğu için sayı formatında nasıl gösterebiliriz. Yani binden sonraki işlem.
Ayrıca Field başlıklarıda gelmiyor. Bilgin yoktur belki diye söylüyorum.

Birde Query e bağlı grid en alta konumlanıyor. Farklı bir Query ile mi yapmak lazım.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Kod: Tümünü seç

excel.range['F1:H10000'].NumberFormat := '#.##0,00';
Sayı olayını da bu şekilde aştık.

Kod: Tümünü seç

ClipBoard.Clear;
Yapıştırmadan sonra clipboardı temizledik.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Kod: Tümünü seç

Query.First;
İşlemlerden sonra gridimizi en başa konumlandırmak için bunu kullandım.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

ClipBord clear dedikten sonra
herhangi ekstra bişey yapmana gerek yoktu ekstra yapılabilecek tek şey esasında Bookmark kullanarak excel e dökmeden önce recordset in yerini tespit edip kayıt bittikten sonra aynı rec e gelmesi sağlanabilir.


Bence denemek için kopy paste yeterli olur gerisi hayal gücünüze kalsın...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

huso Hocam dediğin gibi baya baya fark var.
Yalnız ilk compilede bu hatayı veriyor.

Kod: Tümünü seç

Variable 'Mem' might not have been initialized
Tekrar compile edince vermiyor.İlginç
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Sadece uyarı mesajı o Mem değişkeni değer almaya bilir diyo ama pek sorun çıkarmaz merak etme ;)

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Veritabanindaki tum tablolari excel'e aktarmak icin bir kod yazdim. Bu kod ile su sorunlarla karsilasiyorum

1. tablo isimleri sheetname olarak sadece 3. sheet e kadar yazilabiliyor. Ondan sonrasi sheet3, sheet4 ... vs gidiyor. Oysa Vt de 22 tablo var.

2. Her sheet icin tablo alanlari A kolonuna yukaridan dikey olarak yaziliyor. Yani field 1 -> a1, field 2 -> a2, field 3 -> a3, field 4 -> a4..... gibi

3. Sadece tablo alan basliklarini yaziyor sayfaya fakat verileri yazmiyor.

Gerci yazdigim kod bana da pek mantikli gelmiyor. Ezbere yapilmis gibi. Ama nasil duzeltecegimi bilmiyorum

Kod: Tümünü seç

procedure Tfrm_dbs.Button2Click(Sender: TObject);
begin
  Excel := CreateOleObject('excel.application');
  Excel.visible := True;
  Excel.workbooks.add;
  n:=0;
  dbsq.close;
  dbsq.sql.clear;
  dbsq.sql.text:='select r.rdb$relation_name from rdb$relations r where r.rdb$system_flag = 0';
  dbsq.open;
  dbsq.first;
  dbsq.DisableControls;
  dbsq.DisableControls;
  while not dbsq.Eof do
  begin
    n:=n+1;
    liste         := TStringList.Create;
    screen.Cursor := crHourGlass;
    str := '';
    dbsq2.close;
    dbsq2.sql.clear;
    dbsq2.sql.add('select r.rdb$field_name from rdb$relation_fields r where r.rdb$relation_name = ');
    dbsq2.sql.add(''''+dbsq.FieldByName('rdb$relation_name').asstring+'''');
    dbsq2.open;
    dbsq2.first;
    while not dbsq2.Eof do
    begin
      for i := 0 to dbsq2.FieldCount - 1 do
      begin
        str := str + dbsq2.Fields[i].AsString + #9;
      end;
      liste.Add(Str);
      str := '';
      dbsq2.Next;
    end;
    liste.Add(#0);
    Mem := TMemoryStream.Create;
    Liste.SaveToStream(Mem);
    ClipBoard.SetTextBuf(Mem.Memory);
    if n > 3  then
    Excel.Workbooks[1].WorkSheets.add;
    Excel.Workbooks[1].WorkSheets[n].Name := dbsq.FieldByName('rdb$relation_name').asstring;
    Excel.ActiveSheet.paste;
    liste.Free;
    Mem.Free;
    dbsq.Next;
  end;
  dbsq.EnableControls;
  screen.Cursor := crDefault;
end;
Cevapla