Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Klasördeki Tüm Excel Dosyalarından Veri Alma
#1
Arkadaşlar merhaba klasörde farklı isimlerde ama içeriğinde çalışma sayfa adları ve sütun adları aynı olan birçok excel dosyam mevcut ben bu kapalı durumdaki tüm excel dosyalarının aynı addaki çalışma sayfalarındaki veriyi delphide veri tabanına çekebilirmiyim. Bir nevi tüm dosyalardaki veriyi tek bir yerde birleştirme yapmak istiyorum. bu mümkün müdür? Mümkünse yardımlarınızı bekliyorum.Vereceğiniz cevaplar için şimdiden teşekkür ediyorum.
Cevapla
#2
Excel sayfalarından bir tanesiyle başlamalısınız.

Farklı bir çok yöntemden ilk aklıma gelen iki opsiyon var basitinden; ilki oleautomation, diğeri sql

Bu yapabildikten sonra gerisi sadece klasör dosya listesi almak kadar kolay.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
mssql kullanıyorsanız;
ETL'ler yardımı ile yapabilirsiniz.

Yok delphi de bu işi yapmak istiyorum diyorsanız da:

procedure ListFileDir(Path: string; FileList: TStrings);
var
 SR: TSearchRec;
begin
 if FindFirst(Path + '*.zip', faAnyFile, SR) = 0 then
 begin
   repeat
     if (SR.Attr <> faDirectory) then
     begin
       FileList.Add(SR.Name);
     end;
   until FindNext(SR) <> 0;
   FindClose(SR);
 end;
end;

İle xls leri bir listbox a alın, Sonrasında bir döngü ile o dosyaları tek tek okutup db ye alın ve sonrasında import edilen dosyayı farklı bi folder'a taşıyın.

Excel import ile ilgili yüzlerce örnek delphican da ve google amca da mevcut.

Yine sıkıntınız olursa yazarsınız.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#4
(28-12-2022, Saat: 17:01)mcuyan Adlı Kullanıcıdan Alıntı: mssql kullanıyorsanız;
ETL'ler yardımı ile yapabilirsiniz.

Yok delphi de bu işi yapmak istiyorum diyorsanız da:

procedure ListFileDir(Path: string; FileList: TStrings);
var
 SR: TSearchRec;
begin
 if FindFirst(Path + '*.zip', faAnyFile, SR) = 0 then
 begin
   repeat
     if (SR.Attr <> faDirectory) then
     begin
       FileList.Add(SR.Name);
     end;
   until FindNext(SR) <> 0;
   FindClose(SR);
 end;
end;


İle xls leri bir listbox a alın, Sonrasında bir döngü ile o dosyaları tek tek okutup db ye alın ve sonrasında import edilen dosyayı farklı bi folder'a taşıyın.

Excel import ile ilgili yüzlerce örnek delphican da ve google amca da mevcut.

Yine sıkıntınız olursa yazarsınız.
Hocam öncelikle cevabınız için teşekkür ederim aşağıdaki kodla exceldeki verileri veritabanına sorunsuz alabiliyorum ancak sizin dediğiniz listboxdaki excel dosyalarını döngüyle okumayı beceremedim bu konuda hiç bir bilgim yok sadece open diolagla açıp excel dosyanı seçip aktarma yapabiliyorum.
procedure TForm1.Button2Click(Sender: TObject);
Const
 xlCellTypeLastCell = $0000000B;
var
 Book: Variant;
 Excel, Sheet: Variant;
 Satir, Kolon: Integer;
 Str: String;
begin
 Excel := CreateOleObject('Excel.Application');
 With topendialog.Create (nil)do
 begin
   //Filter := 'Excel Dosyaları|*.xls;*.xlsx|Xls|*.xls|Xlsx|*.xlsx';
   if Execute then
   begin
     Book  := Excel.WorkBooks.Open(FileName);
     Sheet := Book.worksheets[1];
     for Satir := 2 to Excel.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row do
     begin
       Str := Sheet.cells[Satir, 2];
       //Caption := Str;
       //Showmessage(str);
       //Update;
       FDQUERY1.Append;
       for Kolon := 1 to 7 do
       FDQUERY1.Fields[Kolon ].AsString := Sheet.cells[Satir, Kolon];
       FDQUERY1.Post;
     end;
     Excel.WorkBooks.Close;
     Excel.Quit;
     Excel := Unassigned;
     Sheet := Unassigned;
   end;
 end;
end;
Cevapla
#5
Sizin kaynaktaki FileName = üstadın kaynaktaki SR.Name eşit olduğunu anladınız değil mi?
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#6
(29-12-2022, Saat: 09:13)mrmarman Adlı Kullanıcıdan Alıntı: Sizin kaynaktaki FileName = üstadın kaynaktaki SR.Name eşit olduğunu anladınız değil mi?

Evet Muharrem hocam listboxda dosya listelememde sorun yok sadece döngü ile tek tek o dosyalardan veri çekme işlemini beceremedim.
Eğer ki anlatmak istediğinizi anlayamıyorsam acemiliğime verin. 

ListBox'a aşağıdaki kod ile excel dosya adlarını çekiyorum

procedure TForm1.Button1Click(Sender: TObject);
begin
ListFileDir('C:/EXCEL DOSYALARI/',listbox1.items);
end;
Cevapla
#7
Bir listbox satırları/verisi erişim yolları ve nasıl yapılır?
Yeni soru bu olmalı.


Bkz. Bu delphican linki
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
Bence FileListBox kullanarak once okunacak olan excel dosyalarını bulmanız lazım. Sonra bunları tek tek sırayla işleme tabii tutabilirsiniz.
Cevapla
#9
Saygıdeğer hocalarım cevaplarınız ve fikirleriniz için hepinize çok çok teşekkür ediyorum.Sorunumu sizlerin yönlendirmeleriyle aşağıdaki kod ile çözmüş bulunmaktayım. Şimdilik işimi görüyor ancak varsa hatalı yerler şurası olmamış ileride sana sıkıntı çıkarır dediğiniz yerler ya da şöyle yapsan daha iyi olurdu diye uyarılarınız olursa seve seve dikkate alırım.

procedure ListFileDir(Path: string; FileList: TStrings);
var
SR: TSearchRec;
begin
if FindFirst(Path + '*.xlsx', faAnyFile, SR) = 0 then
begin
  repeat
    if (SR.Attr <> faDirectory) then
    begin
      FileList.Add(SR.Name);
    end;
  until FindNext(SR) <> 0;
  FindClose(SR);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListFileDir('C:\Users\senkr\OneDrive\Masaüstü\EKLİ LİSTE DOSYASI\',listbox1.Items);
end;

procedure TForm1.Button2Click(Sender: TObject);
Const
 xlCellTypeLastCell = $0000000B;
var
 Book: Variant;
 Excel, Sheet: Variant;
 Satir, Kolon: Integer;
 Str: String;
 i:integer;

begin
 for i:=0 to listbox1.Items.Count-1 do
begin
ListBox1.ItemIndex:=i;
Excel := CreateOleObject('Excel.Application');
begin

   begin
     Book  := Excel.WorkBooks.Open('C:\Users\senkr\OneDrive\Masaüstü\EKLİ LİSTE DOSYASI\'+listbox1.Items[listbox1.ItemIndex]);
     Sheet := Book.worksheets[1];
     for Satir := 2 to Excel.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row do
     begin
       Str := Sheet.cells[Satir, 2];
       FDQUERY1.Append;
       for Kolon := 1 to 7 do
       FDQUERY1.Fields[Kolon ].AsString := Sheet.cells[Satir, Kolon];
       FDQUERY1.Post;
     end;
     Excel.WorkBooks.Close;
     Excel.Quit;
     Excel := Unassigned;
     Sheet := Unassigned;
   end;
 end;
end;
end;
Cevapla
#10
Hücreden aldığın veri türü Variant olacağı için "Invalid variant operation" hatası alabilirsin.
Tam bu noktada..
FDQUERY1.Fields[Kolon ].AsString := Sheet.cells[Satir, Kolon];
https://docwiki.embarcadero.com/Librarie...VarIsEmpty
burayı incelemeni ve See also kısmındaki methodları incelemeni tavsiye ederim.

Field sıralaması önemli. Olurda index değişirse.. veriler ilgili hanelere yazılacağı garanti edilemez.
Çünkü fieldname'e göre yazmıyor..
Fields[ Kolon ]

Excel dosyalarının boyutları nedir bilmiyorum, dosyaları işlerken uygulama kilitlenebilir (çok fazla kayıt varsa).
Thread gerekli olabilir..

Tabloya veriler eklenmeden önce çeşitli kontroller eklenmesi ya da tablonun temizlenmesi gerekebilir..
Mükerrer kayıtlar oluşabilir.
Her çalışırıldığında aynı veriler tekrar tekrar girilecek.

Şuan tek bir dosya türünü listeye ekliniyor. "*.xlsx"
Birden fazla dosya formatı olabilir "*.xls" gibi..
SRHT
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  IEC 61850 Potokolünden veri alma shooterman 0 95 15-02-2024, Saat: 14:24
Son Yorum: shooterman
  Problem - ZKTeco Cihazlardan Anlık Veri Alma mad85 16 7.694 25-12-2023, Saat: 11:35
Son Yorum: osiso
  [ÇÖZÜLDÜ]Firebase Bearer Token Alma shooterman 8 516 05-12-2023, Saat: 12:17
Son Yorum: shooterman
  Cas Terazi Veri gönderimi Delphi sürüm sorunu KUNTAY 12 4.066 08-11-2023, Saat: 00:06
Son Yorum: berkan
  Delphi Sürekli Adı Değişen Excel Dosyasından Veri Çekme bünyamin68 2 498 05-10-2023, Saat: 12:50
Son Yorum: mcuyan



Konuyu Okuyanlar: 1 Ziyaretçi