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)
ö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
@zhttp://avemey.com/zexmlss/index.php (http://avemey.com/zexmlss/index.php)
@gkimirti Tesekkurler.
Comobj uniti nerdedir bulamadim. Delphi 7 de hangi baslik altinda bu?
Burada.
Delphi7\Source\Rtl\Common
fakat yeri dikkate almaya gerek yok. uses .. Comobj .. yeterlidir. Path olarak o klasör eklidir?
@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?
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.
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.
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.
@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
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.
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
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
Kisacasi;
export isleminde csv vs secebiliyoruz bana bunun importu lazim.
@z hocam 10-15 satırlık (gerçek bilgiler olmasa da olur)bir yere yüklerseniz ben yapmaya çalışayım
Neyi yapacaksiniz? Macro mu yazacaksiniz?
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
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
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
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?
tab yerine virgul kullan.
text icinde virgul varsa text'i tirnak icine koy.
Bu arada csv, "comma seperated values" kisaltmasi
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
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.
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.
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