Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Delphi => Konuyu başlatan: z - 01 Ekim 2019, 09:53:02

Başlık: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 01 Ekim 2019, 09:53:02
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)

Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: gkimirti - 01 Ekim 2019, 10:46:13
ö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
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: leblebitozu - 01 Ekim 2019, 11:10:29
@z

http://avemey.com/zexmlss/index.php (http://avemey.com/zexmlss/index.php)
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 01 Ekim 2019, 14:57:20
@gkimirti

Tesekkurler.

Comobj uniti nerdedir bulamadim. Delphi 7 de hangi baslik altinda bu?
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: power20 - 01 Ekim 2019, 15:12:51
Burada.
Delphi7\Source\Rtl\Common

fakat yeri dikkate almaya gerek yok.   uses .. Comobj .. yeterlidir.  Path olarak o  klasör eklidir?
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: 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?
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: gkimirti - 02 Ekim 2019, 08:37:07
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.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: mufitsozen - 02 Ekim 2019, 09:04:48
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.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 02 Ekim 2019, 11:24:20
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.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: Epsilon - 02 Ekim 2019, 13:17:00
@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
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 02 Ekim 2019, 13:24:21
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.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: Epsilon - 02 Ekim 2019, 13:32:15
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
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: Epsilon - 02 Ekim 2019, 13:45:50
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
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 02 Ekim 2019, 14:04:34
Kisacasi;

export isleminde csv vs secebiliyoruz bana bunun importu lazim.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: Epsilon - 02 Ekim 2019, 14:33:32
@z hocam 10-15 satırlık (gerçek bilgiler olmasa da olur)bir yere yüklerseniz ben yapmaya çalışayım
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 02 Ekim 2019, 15:24:36
Neyi yapacaksiniz? Macro mu yazacaksiniz?

Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: mufitsozen - 02 Ekim 2019, 15:25:56
Alıntı yapılan: z - 02 Ekim 2019, 14:04:34Kisacasi;

export isleminde csv vs secebiliyoruz bana bunun importu lazim.


Excel okurken dogrudan csv yukler
import'a gerek yok.

.csv dosyalari acmak icin default excel'in set edilmesi yeterli. Yada file->open deyip dosyayi .csv ekiyle secmek yeterli
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: Epsilon - 02 Ekim 2019, 15:36:48
Birincisi excel cvs yi zaten açar.Adamlar zaten bu tür işler için macro kaydet seçeneğini yıllar önce eklediler yani sen bir kere işi ekrandan  kaydedersin excel binlerce satırda o işi otomatik yapar.
Ben size yardımcı olmaya çalışıyorum
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: power20 - 02 Ekim 2019, 15:39:04
not defteri ile deneme.csv dosyası yapalım.
içeriği şöyle olsun
a;b;c;d
1;2;3;4
a b c d   bir  hücrede  1 harf olacak şekilde  ( ilk satır)
1 2 3 4     ikinci satır

görüldüğü gibi csv yapmak çok kolay. Bunu  import / Export edebilecek program yazmak da öyledir.
Excelde gayet güzel açılıyor.
illa ki xls gerekli değilse program ile csv oluşturmak çok kolay olur. Hem Excel yüklü olmasa da çalışır
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 02 Ekim 2019, 15:40:42
Exelin csv actigini bilmiyordum ve bugune kadar kendime eziyet ediyormusum o zaman.

CSV ile ilgili bir sorunumdan da bahsedeyim.

Tab ayiraci ile exel datalari export edip Delphi programim ile okuyorum.

Fakat hucrelerden birisinde uzunca bir veri varsa exel bir sonraki hucre ile bu hucredeki veriyi tab ile ayirmiyor bu da bazi hucrelerdeki verileri yanlis okumama neden oluyor.

Bu sorunun cozumu var mi?

Mesela

Ahmet Mehmet Veli
asdghasghdghasdgh Ali Can verilerini export ettigimde

Ahmet(TAB)Mehmet(TAB)Veli
asdghasghdghasdghAli(TAB)Can

gibi durumlarla karsilasabiliyorum.

Bu hatayla karsilasmamin sebebi nedir?
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: mufitsozen - 02 Ekim 2019, 15:50:19
tab yerine virgul kullan.
text icinde virgul varsa text'i tirnak icine koy.

Bu arada csv, "comma seperated values" kisaltmasi

Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: engerex - 02 Ekim 2019, 15:53:50
CSV işinizi görüyorsa
Excell de istediğiniz içeriği oluşturun. Bunu CSV olarak kaydedin. Not defterinde açın ve Delphi'de bu yapıyı taklit edin. Hücre Kaynak : https://en.wikipedia.org/wiki/Comma-separated_values

İçerik aşağıdakine benzer olacaktır.

Alıntı yapılan: undefinedYear;Make;Model;Description;Price
1997;Ford;E350;Extended Edition;4799,50
1999;Chevy;Venture;abc;123,46

(https://i.ibb.co/7Sj15p5/image.png)

Ekleme: çok uzun hücreleri iki tırnak arasına yazın
Extended Edition yerine "Extended Edition" gibi
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: mufitsozen - 02 Ekim 2019, 15:59:22
Alıntı yapılan: mufitsozen - 02 Ekim 2019, 15:50:19tab yerine virgul kullan.
text icinde virgul varsa text'i tirnak icine koy.

Bu arada csv, "comma seperated values" kisaltmasi

-- How do I change the separator in a csv file?

- Change the separator in all .csv text files

- In Microsoft Windows, click the Start button, and then click Control Panel.

- Open the dialog box for changing Regional and Language settings.

- Type a new separator in the List separator box.

- Click OK twice.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: z - 02 Ekim 2019, 16:09:35
csv secenekleri arasinda zaten bir kac tane ayirac secenegi var. Tab, space gibi.

Zamaninda birileri exel verilerini olusturmuslar. (tek tek uzun veri iceren hucreleri bulup editlemek yorucu olur) Dolayisi ile mevcut exel doslarindaki textleri elle tirnak icine almam soz konusu olamaz.

Ayirac secenekleri arasinda yer alan space ve virgul karakterini ayirac olarak kullanamam, cunku bazi hucrelerde uzun textler icinde virgule kullanilmis. Tab isime geldi. ; de olabilir belki. Ama sorunun ayirac karakterinin ne oldugu ile ilgisi yok bence. Uzun text iceren hucrelerde sanki exelin bir export hatasi var gibime geldi.

Evde exel olmadigini icin yarin is yerinde tekrar denerim.

Neyse bu tip hatalari zaten Delphi programim farkediyor ve uyariyor ben de elle duzeltme yapiyorum.

Konuyu actigima cok sevindim.

Cunku exelin csv formatli verileri okuyabildiginden hic haberim yoktu.

Herkese tesekkurler.
Başlık: Ynt: Delphi i le exel dosyası okumak ve yeni exel dosyası oluşturmak
Gönderen: engerex - 05 Ekim 2019, 14:23:00
Verilerin içerisinde virgül, noktalı virgül olduğundan yakınıyorsanız tırnak mevzusu zaten bunu çözüyor.

Örnek : hücrede bolca virgül, noktalı virgül var. Hatta tırnak kullanmak dahi mümkün.

Year;Make;Model;Description;Price
1997;Ford;E350;";;;,,""Extended"";,; Edition;,,,";4799,50
1999;Chevy;Venture;abc;123,46