Yorumları: 105
Konuları: 22
Kayıt Tarihi: 19-03-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 162 Başlangıç
29-09-2022, Saat: 11:55
(Son Düzenleme: 29-09-2022, Saat: 11:57, Düzenleyen: akuyumcu63.)
(29-09-2022, Saat: 00:20)apachi2006 Adlı Kullanıcıdan Alıntı: (26-09-2022, Saat: 18:12)Master_Crazy Adlı Kullanıcıdan Alıntı: There are many examples of excel automation using delphi.
1- Import Excel, Office, ... Type Library (Excel_TLB.pas) and see it change for each Excel version in Excel_TBL.pas file
(e.g: // Hint: Symbol 'Application' renamed to 'ExcelApplication' )
2- Add Excel_TBL, Office_TBL as below
//--------------------------------------------------------------------------------------------------------------------------------
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Excel_TBL, Office_TBL;
//--------------------------------------------------------------------------------------------------------------------------------
and ComObj; as below
//--------------------------------------------------------------------------------------------------------------------------------
implementation
{$R *.dfm}
uses
ComObj;
//--------------------------------------------------------------------------------------------------------------------------------
Please google search: delphi + excel + Automation + Charlie Calvert.
There are two different ways to run OLE automation from inside Delphi:
You can create an instance of the object in these two different ways:
XLApp := Excel_TLB.CoApplication_.Create; // Initialize an interface
XLApp := CreateOleObject('Excel.Application'); // Initialize a Variant
One involves using interfaces, while the second involves using an OLE class called IDispatch along with a Delphi type called a variant. Interfaces give you the advantage of type checking your code on the client side, as well as relatively high performance. However, I am going to start the paper working with the somewhat easier to understand IDispatch and variants technology, and move on to cover interfaces after all the basics are clearly established. Do not worry if you don't yet understand the differences between the two techniques, as this subject will be cleared up over the course of the paper. At this stage, you just need to be aware that there are at least two ways to access OLE automation objects from Delphi, and that I am going to start out by showing you one that uses IDispatch and variants.
The following code, found in Listing 1, shows a bare bones example of a Delphi application that launches Excel. Just skim over the code for now, as I will spend the rest of this section of the paper explaining how it works.
var
EXCELDOSYASI: Variant; /// EXCEL DOSYASI İLE İŞLEM YAPMAK İÇİN TANIMLANIYOR
KACSATIR,KACSUTUN:integer; /// EXCELDEBİLGİSAYISI ADLI PROCEDUR KAÇ SATIR BİLGİ OLDUĞUNU BU DEĞİŞKENLERE GÖNDERECEK
const
SELDIRHELP = 1000;
implementation
{$R *.dfm}
procedure exceldebilgisayisi;
var
hangisatirdaverivar:variant;
begin
try
KACSATIR:=0; // BU DEĞİŞKENLERDEKİ DEĞERLERİ SIFIRLAYALIM Kİ TEKRAR ÇAĞIRILDIĞINDA ÜZERİNE EKLESİN
KACSUTUN:=0; // BU DEĞİŞKENLERDEKİ DEĞERLERİ SIFIRLAYALIM Kİ TEKRAR ÇAĞIRILDIĞINDA ÜZERİNE EKLESİN
hangisatirdaverivar:= EXCELDOSYASI.ActiveWorkbook.worksheets[1].UsedRange; // veri çalışma kitabı 1 deki hangi satırlarda ve sütünlarda var buluyor
KACSATIR:= hangisatirdaverivar.rows.Count; /// kaç satır bilgi olduğunu rakamsal olarak buluyor.
KACSUTUN:= hangisatirdaverivar.columns.Count; // kaç kolonda bilgi olduğunu rakamsal olarak buluyor.
except
end;
end;
procedure btnolcucekClick(Sender: TObject);
var EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
SAYFA: Variant;
begin
OpenDialog1.FileName:='c:\\exceldosyasi.xlsx';
//if OpenDialog1.Execute then
// begin
EXCELDOSYASI:=CreateOleObject('excel.application');
EXCELDOSYASI.Visible:=false;
try
EXCELDOSYASI.workbooks.open[OpenDialog1.FileName];
exceldebilgisayisi;
for EXCELDEKISATIR:=1 to KACSATIR do
begin
data.Append;
dataadi.AsString:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].Value);
datasoyadi.AsString:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,2].Value);
data.Post;
end;
end;
finally
if not VarIsEmpty(EXCELDOSYASI) then
begin
EXCELDOSYASI.DisplayAlerts := False;
EXCELDOSYASI.Quit;
EXCELDOSYASI := Unassigned;
end;
end;
end;
Herhangi bir versiyon problemi olmadan kullanıyorum. Deneyin lütfen.
bende bu kodlamayı kullanıyorum. Ancak excel aktivasyon istiyorsa yüklemeyi yarıda kesiyor. sizde bu sorun oluşmuyor mu ?
bu sorundan dolayı component arayışına girdim. pratik kullanışlı bir component arıyorum. free olur ise daha iyi olur. sadece veri çekecek.
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
DevExpress kullanın. Excel'e bile gerek olmuyor
Yorumları: 112
Konuları: 22
Kayıt Tarihi: 03-12-2016
Rep Puanı: 108 Başlangıç
(29-09-2022, Saat: 11:55)akuyumcu63 Adlı Kullanıcıdan Alıntı: (29-09-2022, Saat: 00:20)apachi2006 Adlı Kullanıcıdan Alıntı:
var
EXCELDOSYASI: Variant; /// EXCEL DOSYASI İLE İŞLEM YAPMAK İÇİN TANIMLANIYOR
KACSATIR,KACSUTUN:integer; /// EXCELDEBİLGİSAYISI ADLI PROCEDUR KAÇ SATIR BİLGİ OLDUĞUNU BU DEĞİŞKENLERE GÖNDERECEK
const
SELDIRHELP = 1000;
implementation
{$R *.dfm}
procedure exceldebilgisayisi;
var
hangisatirdaverivar:variant;
begin
try
KACSATIR:=0; // BU DEĞİŞKENLERDEKİ DEĞERLERİ SIFIRLAYALIM Kİ TEKRAR ÇAĞIRILDIĞINDA ÜZERİNE EKLESİN
KACSUTUN:=0; // BU DEĞİŞKENLERDEKİ DEĞERLERİ SIFIRLAYALIM Kİ TEKRAR ÇAĞIRILDIĞINDA ÜZERİNE EKLESİN
hangisatirdaverivar:= EXCELDOSYASI.ActiveWorkbook.worksheets[1].UsedRange; // veri çalışma kitabı 1 deki hangi satırlarda ve sütünlarda var buluyor
KACSATIR:= hangisatirdaverivar.rows.Count; /// kaç satır bilgi olduğunu rakamsal olarak buluyor.
KACSUTUN:= hangisatirdaverivar.columns.Count; // kaç kolonda bilgi olduğunu rakamsal olarak buluyor.
except
end;
end;
procedure btnolcucekClick(Sender: TObject);
var EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
SAYFA: Variant;
begin
OpenDialog1.FileName:='c:\\exceldosyasi.xlsx';
//if OpenDialog1.Execute then
// begin
EXCELDOSYASI:=CreateOleObject('excel.application');
EXCELDOSYASI.Visible:=false;
try
EXCELDOSYASI.workbooks.open[OpenDialog1.FileName];
exceldebilgisayisi;
for EXCELDEKISATIR:=1 to KACSATIR do
begin
data.Append;
dataadi.AsString:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].Value);
datasoyadi.AsString:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,2].Value);
data.Post;
end;
end;
finally
if not VarIsEmpty(EXCELDOSYASI) then
begin
EXCELDOSYASI.DisplayAlerts := False;
EXCELDOSYASI.Quit;
EXCELDOSYASI := Unassigned;
end;
end;
end;
Herhangi bir versiyon problemi olmadan kullanıyorum. Deneyin lütfen.
bende bu kodlamayı kullanıyorum. Ancak excel aktivasyon istiyorsa yüklemeyi yarıda kesiyor. sizde bu sorun oluşmuyor mu ?
bu sorundan dolayı component arayışına girdim. pratik kullanışlı bir component arıyorum. free olur ise daha iyi olur. sadece veri çekecek.
Benim excellerim lisanslı olduğu için şimdiye kadar farketmedim. Halil'inde bahsettiği DEV EXPRES hakkında araştırma yapmanı tavsiye ederim.
Yorumları: 105
Konuları: 22
Kayıt Tarihi: 19-03-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 162 Başlangıç
(29-09-2022, Saat: 12:15)Halil Han BADEM Adlı Kullanıcıdan Alıntı: DevExpress kullanın. Excel'e bile gerek olmuyor
farklı bir programdan kayıtları export ediyorum. Daha sonra da o dosyayı kendi programıma import etmem gerekiyor. kayıt sayısı bazen 4 - 5 bin kadar olabiliyor.
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
(29-09-2022, Saat: 14:03)akuyumcu63 Adlı Kullanıcıdan Alıntı: (29-09-2022, Saat: 12:15)Halil Han BADEM Adlı Kullanıcıdan Alıntı: DevExpress kullanın. Excel'e bile gerek olmuyor
farklı bir programdan kayıtları export ediyorum. Daha sonra da o dosyayı kendi programıma import etmem gerekiyor. kayıt sayısı bazen 4 - 5 bin kadar olabiliyor.
Yine fark etmez üstadım. Devexpress güncellemesi ile 4-5bin satır onun için hiçbir şey
Yorumları: 105
Konuları: 22
Kayıt Tarihi: 19-03-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 162 Başlangıç
(29-09-2022, Saat: 14:46)Halil Han BADEM Adlı Kullanıcıdan Alıntı: (29-09-2022, Saat: 14:03)akuyumcu63 Adlı Kullanıcıdan Alıntı: farklı bir programdan kayıtları export ediyorum. Daha sonra da o dosyayı kendi programıma import etmem gerekiyor. kayıt sayısı bazen 4 - 5 bin kadar olabiliyor.
Yine fark etmez üstadım. Devexpress güncellemesi ile 4-5bin satır onun için hiçbir şey
dxSpreadSheet componenti var onunla çok kolay bir şekilde alınabiliyor.
dxSpreadSheet1.LoadFromFile('C:\....');
buraya kadar işler gayet güzel. dxSpreadSheet den okuyup cxgride yada memtable a aktarmak için örnek bulamadım.
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
30-09-2022, Saat: 10:29
(Son Düzenleme: 30-09-2022, Saat: 10:29, Düzenleyen: Halil Han BADEM.)
(30-09-2022, Saat: 09:51)akuyumcu63 Adlı Kullanıcıdan Alıntı: (29-09-2022, Saat: 14:46)Halil Han BADEM Adlı Kullanıcıdan Alıntı: Yine fark etmez üstadım. Devexpress güncellemesi ile 4-5bin satır onun için hiçbir şey
dxSpreadSheet componenti var onunla çok kolay bir şekilde alınabiliyor.
dxSpreadSheet1.LoadFromFile('C:\....');
buraya kadar işler gayet güzel. dxSpreadSheet den okuyup cxgride yada memtable a aktarmak için örnek bulamadım.
Rica ederim ne demek, teşekkürünüz için ben teşekkür ederim(!)
Dökümanlar ile çok kolay örneklere ulaşabilirsiniz ya da biraz araştırma ile
https://supportcenter.devexpress.com/tic...d-database
Yorumları: 105
Konuları: 22
Kayıt Tarihi: 19-03-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 162 Başlangıç
(30-09-2022, Saat: 10:29)Halil Han BADEM Adlı Kullanıcıdan Alıntı: (30-09-2022, Saat: 09:51)akuyumcu63 Adlı Kullanıcıdan Alıntı: dxSpreadSheet componenti var onunla çok kolay bir şekilde alınabiliyor.
dxSpreadSheet1.LoadFromFile('C:\....');
buraya kadar işler gayet güzel. dxSpreadSheet den okuyup cxgride yada memtable a aktarmak için örnek bulamadım.
Rica ederim ne demek, teşekkürünüz için ben teşekkür ederim(!)
Dökümanlar ile çok kolay örneklere ulaşabilirsiniz ya da biraz araştırma ile
https://supportcenter.devexpress.com/tic...d-database
zaman ayırıp değerli bilgi ve tecrübelerini paylaşan herkese ve Halil kardeşim sana Çok teşekkür ediyorum.
ben genelde konuyu nihayete erdirdikten sonra kendi çözümü mü de paylaşarak sonuçlandırmaya çalışıyorum. tabi burada herkes çok ciddi emekler sonundaki bilgi ve tecrübelerini paylaşıyorlar. teşekkür bu işin nezaketi. bundan asla geri durmam.
Halil kardeşim seni duymak bizi mutlu etti.
yeni konu başlıklarında görüşmek üzere. Allah'a Emanet Olun.
Yorumları: 230
Konuları: 9
Kayıt Tarihi: 07-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.713 Programcı
16-11-2022, Saat: 14:47
(Son Düzenleme: 16-11-2022, Saat: 14:48, Düzenleyen: sabanakman.)
Excel dosyalarına ODBC veya Jet (ACE) sürücüleri üzerinden de bağlanarak içeriğe erişebilirsiniz.
ADO bileşenlerinde ConnectionString ile erişmek için: https://www.connectionstrings.com/excel/
FireDAC ile erişmek için: https://www.delphican.com/showthread.php...5#pid29635
Burada dikkat edilmesi gereken nokta sayfalara tablo gibi erişme imkanı vardır ve sayfa isimleri (mesela Sayfa1 için) "select * from [$Sayfa1] biçiminde sorgulanarak elde edilebilir.
|