Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak

Başlatan z, 01 Ekim 2019, 09:53:02

z

Delphi ile exel dosyasını okumak ve yeni bir exel dosyası oluşturmak istiyorum.

Derlendiğinde çalışacak basit bir örneğe ihtiyacım var.

Yardımcı olabilecek var mı?

(Delphi 7 kullanıyorum)

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gkimirti

örnek bir uygulama yaptım, Comobj uniti ekleyerek CreateOleObject('Excel.Application') ile okuyabilirsiniz.
procedure Tfrmain.Button1Click(Sender: TObject);
var
  ExcelApp: OLEVariant;
  Tmp : String;
  Satir : Integer;
  TmpCellVal : String;
begin
  if OpenDialog1.Execute then
  begin
    Tmp := OpenDialog1.FileName;
    ExcelApp := CreateOleObject('Excel.Application');
    ExcelApp.Workbooks.Open(Tmp);
    ExcelApp.Visible := False;
    Satir := 1;

    repeat
      TmpCellVal := ExcelApp.Range['A'+IntToStr(Satir)+':'+'A'+IntToStr(Satir)];
      Satir := Satir + 1;
      if TmpCellVal<>'' then
        Memo1.Lines.Add(IntToStr(Satir) +' -> '+ TmpCellVal);
    until TmpCellVal='';

    ExcelApp.DisplayAlerts := False;
    ExcelApp.Quit;
  end;

end;

dfm dosyası
object frmain: Tfrmain
  Left = 0
  Top = 0
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 65
    Height = 33
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Memo1: TMemo
    Left = 0
    Top = 47
    Width = 635
    Height = 252
    Align = alBottom
    TabOrder = 1
  end
  object OpenDialog1: TOpenDialog
    Left = 104
    Top = 8
  end
end


z

@gkimirti

Tesekkurler.

Comobj uniti nerdedir bulamadim. Delphi 7 de hangi baslik altinda bu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

power20

Burada.
Delphi7\Source\Rtl\Common

fakat yeri dikkate almaya gerek yok.   uses .. Comobj .. yeterlidir.  Path olarak o  klasör eklidir?

z

@gkimirti

ExcelApp := CreateOleObject('Excel.Application'); satırı işletildiğinde invalid class string hatası alıyorum ve program duruyor.

Exel uygulaması geliştirmek için makinede office yüklü olmak zorunda mı?

Edit:  Uygulamayı exel yüklü makinede çalıştırınca sorunsuz çalıştı.

Ben dosyayı byte byte okuyup işleyecek diye düşünmüştüm.

Dediğim gibi exel dosyasını işlemenin you yok mu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gkimirti

Evet yüklü olması lazım, dosya formatını çözerek okuyan ücretli/ücretsiz 3.parti bileşenler mevcut olmalı, bakmak lazım. cxGrid bileşen seti grid üstünde ne var ne yok olduğu gibi excell formatına dönüştüren yeteneklere sahip ama ücretli bir bileşen seti.

mufitsozen

Alıntı yapılan: z - 02 Ekim 2019, 02:29:13@gkimirti

ExcelApp := CreateOleObject('Excel.Application'); satırı işletildiğinde invalid class string hatası alıyorum ve program duruyor.

Exel uygulaması geliştirmek için makinede office yüklü olmak zorunda mı?

Edit:  Uygulamayı exel yüklü makinede çalıştırınca sorunsuz çalıştı.

Ben dosyayı byte byte okuyup işleyecek diye düşünmüştüm.

Dediğim gibi exel dosyasını işlemenin you yok mu?

Bircok yolu var.

Benim onerecegim en kisa ve kolay cozum Excel dosyasini csv formatinda yaz ve oku.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Zaten oyle yapiyorum. Ama text hale getirip isledigim verilerden exel dosyasi olusturmak icin cambazlik yapmak zorunda kaliyorum.

Exel de sutun olusturacak her bir verileri ayri memolara yazip her bir memo icerigini copy ile alip exelde ilgili sutuna elle yapistiriyorum.

Bu da programin isletilmesini zorlastiriyor.

Bunun da pratik yolu varsa bilmek isterim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Epsilon

@z excel de birleştir diye bir fonksiyon var .Eğer tüm txt leri bir sheete aldıysanız 2 hücrenin(veya daha fazla hücrenin) metnini biraraya getirebilirsiniz

örneğin Sayfa1 sheetinde A1 hücresinde "Ali" A2 hücresinde "Veli" yazıyorsa Sayfa2 nin A1 hücresine
=Sayfa1! BİRLEŞTİR(A1;"";B1)
yazarsanız sonuç
Ali Veli
olur(Memo alanıda ekleyeceğini zannediyorum)
Sanırım bunu istiyorsunuz

z

Ben oyle degilde su sekilde istiyorum.

Diyelim ki memodan asagidaki 2 satirlik texti select all olarak aldim.

Ali!Veli!12!45!asd
Cak!Dak!34!78!fgh

Sonra bunu exele yapistirinca aralarinda space yada daha iyisi ozel karakter (ornegimde !) olan her bir kelime exelde sutunlara ve satirlara sirayla yerlessin.

A   B    C  D  E     sutunlar
Ali Veli 12 45 asd   1. satir
Cak Dak  34 78 fgh   2. satir

Tabi bunlara hic gerek kalmadan dogrudan exel dosya cikartabilseydim daha iyi olurdu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Epsilon

Benim yazdığım örnekdeki   " " kısmı boşluk için yani araya bir karakter(veya ne kadar isteniyorsa) eklemek için .
Eğer tüm bilgiler sol taraftaki sütünlarda düzgün şekilde görülüyor ise hemen sağındaki boş sütunun ilk hücresine bu formülü  yazıp,o hücrenin sağ altını fare ile tutup aşağıya doğru çekerseniz aşağıya doğru tüm hücrelere aynı mantığı uygular

Epsilon

Tekrar okuyunca o tarz işlemi yaptırabilmek için makro kullanmanız gerekir.
Excel ses kayıdı gibi makro kaydı yapar bir hücreye yapılan tüm işlemlerin aynısını tüm hücrelere yapabilir

z

Kisacasi;

export isleminde csv vs secebiliyoruz bana bunun importu lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Epsilon

@z hocam 10-15 satırlık (gerçek bilgiler olmasa da olur)bir yere yüklerseniz ben yapmaya çalışayım