Ole nesnesi kullanmadan excel dosyası oluşturma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Ole nesnesi kullanmadan excel dosyası oluşturma
Arkadaşlar veritabanındaki verileri ole nesnesi kullanarak excel'e aktarıyorum.Ancak eğer programı verdiğim kişide excel kurulu değilse bu probleme neden olacağını düşündüm.Yaptığım olay şu kullanıcı veritabanından almak istediği ürünü seçiyor ve bunu sipariş adlı table'a attırıyorum.Bu siparişlerin listesini 2.formda görebiliyor ve ordan mail gönder butonuna tıkladığında otomatik olarak şirkete excel dosyası ekli mail geliyor.Müşterim mailin excel formatında olmasını istiyor.
Arkadaşlar kişide excel yoksa bu problem çıkartacak.Ole nesnesi excel'i bulamayacak.Text dosyasına yazdırıp excel formatında kaydettirsem olurmu..
Yardımlarınızı ve fikirlerinizi bekliyorum..
Arkadaşlar kişide excel yoksa bu problem çıkartacak.Ole nesnesi excel'i bulamayacak.Text dosyasına yazdırıp excel formatında kaydettirsem olurmu..
Yardımlarınızı ve fikirlerinizi bekliyorum..
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
Bu konular forumda çok geçti
yalım.
verdiğim link size fikir verebilir. Özellikle Musatafa Hocam ın yanıtı viewtopic.php?p=4605#4605
Kolay gelsin...

verdiğim link size fikir verebilir. Özellikle Musatafa Hocam ın yanıtı viewtopic.php?p=4605#4605
Kolay gelsin...
Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
excel'veri atma ile ilgili
Hüseyin hocam benim anlatmak istediğim database'den excel'a aktarmaktı.Zaten bunu ole ile yaptım.Ama kişide excel yoksa nasıl createobject oluşturacağız.Sizin verdiğiniz linkte excelden veritabanına aktarma konusu var.
Ayrıca ben dediğim işlemi hallettim.
Belki bir arkadaşıma lazım olur.Çünkü ole excel varsa çalışıyor.
Yoksa excel formatında kayıt için
Internet bileşeninde bulunan datasettableproducer componentini kullandım.
Ondan memoya aktarıp memoyu gizleyerak tabi.Formun showunda memoda excel formatında kayıt yaptırıyorum..
Yardımlarınız için çok teşekkür ederim..
Ayrıca ben dediğim işlemi hallettim.
Belki bir arkadaşıma lazım olur.Çünkü ole excel varsa çalışıyor.
Yoksa excel formatında kayıt için
Internet bileşeninde bulunan datasettableproducer componentini kullandım.
Ondan memoya aktarıp memoyu gizleyerak tabi.Formun showunda memoda excel formatında kayıt yaptırıyorum..
Kod: Tümünü seç
form1.ADOTable1.First;
memo1.Text:=datasettableproducer1.Content;
memo1.Lines.SaveToFile(form1.way2+'order_spare.xls');
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
Aslında benim demek istediğim olay CSV formatında çıktı alman dı. Yani bir Text dosyasına kayıt gönderiyormuş gibi sadece sutunlar ;(Noktalı Virgül) koyarak yapılandırma yapman yeterli olabileceğini belirtmek istemiştim. Verdiğim linkte direk Mustafa Hocam ın açıklamasına odaklanıyordu. Gerçi Probleminizi aşmışsınız sevindim ayrıca bizimle paylaştığınız için Teşekkür Ederiz.
Örnek Csv formatı
Örnek Csv formatı
Kolay Gelsin..."13.0110";"12 V 53 6W AMPUL";"";"AD";940;
"13.0117";"12 V 53 2 W AMPUL";"";"AD";3010;
Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Re: excel'veri atma ile ilgili
Bu kodları Excel kurulu olmayan bilgisayarlar için kullanmıştım, OLE Object kullanarak yapılana göre çok da hızlı çalışıyor. Ancak kayıt sayısı az iken gayet güzel çalışan bu kod, kayıt sayısı bir kaç yüzü geçince çalışmamaya başladı. Benden başka kullanan ve bu sorunu aşan oldu mu acaba ?AliRiza yazdı: Ayrıca ben dediğim işlemi hallettim.
Belki bir arkadaşıma lazım olur.Çünkü ole excel varsa çalışıyor.
Yoksa excel formatında kayıt için
Internet bileşeninde bulunan datasettableproducer componentini kullandım.
Ondan memoya aktarıp memoyu gizleyerak tabi.Formun showunda memoda excel formatında kayıt yaptırıyorum..
Yardımlarınız için çok teşekkür ederim..Kod: Tümünü seç
form1.ADOTable1.First; memo1.Text:=datasettableproducer1.Content; memo1.Lines.SaveToFile(form1.way2+'order_spare.xls');
Sevgi, Saygı.....
Kod: Tümünü seç
procedure TSipExcelForm.BtnCSVClick(Sender: TObject);
var
dosya: TextFile ;
yaz : string;
k1 : integer;
begin
AssignFile(dosya,'C:\' + edit1.text + '.CSV');
Rewrite (dosya);
if IOResult = 0 then
begin
For k1:=0 to IBQGar.FieldCount - 1 do
begin
yaz := IBQGar.Fields[k1].FieldName;
write (dosya,yaz + ',');
end;
writeln (dosya);
IBQGar.First;
While not(IBQGAR.Eof) do
begin
For k1:=0 to IBQGar.FieldCount -1 do
begin
yaz := IBQGar.Fields[k1].Text;
write (dosya,yaz,',');
end;
writeln (dosya);
IBQGar.Next;
end;
closeFile(dosya);
end
else
begin
MessageDlg('Yazdığınız dosya kullanılıyor....', mtWarning, [mbOk], 0);
end;
end;
Sevgi, Saygı.....
bazı Componentler (mesela Quantum Grid) orjinal Excel formatında kaydedebiliyor. Ama bunun için XLS formatını incelemeniz lazım. Daha önce bir siteden bu tarz uzantılarla ilgili format bilgilerini gördüğümü hatırlıyorum ama adresi şu an aklımda değil.
Biraz vakit alacak alt düzey bir işlem yani.
Kolay gelsin.
Biraz vakit alacak alt düzey bir işlem yani.
Kolay gelsin.
Merhaba ,
Delphiturk sitesinden indirdiğim kodbank isimli programda OLE ye ihtiyaç duymadan belirtilen TDBGrid in içeriğini Orijinal Excel dosyasına aktarabilen bir procedure gözüme çarptı. procedure içerisinde çağrılan diğer funtion ve procedureleri içeren uniti ekliyorum. Umarım işinizi çözer,
Delphiturk sitesinden indirdiğim kodbank isimli programda OLE ye ihtiyaç duymadan belirtilen TDBGrid in içeriğini Orijinal Excel dosyasına aktarabilen bir procedure gözüme çarptı. procedure içerisinde çağrılan diğer funtion ve procedureleri içeren uniti ekliyorum. Umarım işinizi çözer,
Kod: Tümünü seç
unit DBGridExportToExcel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, DB, IniFiles, Buttons, dbgrids, ADOX_TLB, ADODB;
type TScrollEvents = class
BeforeScroll_Event: TDataSetNotifyEvent;
AfterScroll_Event: TDataSetNotifyEvent;
AutoCalcFields_Property: Boolean;
end;
procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
implementation
procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
begin
with DataSet do
begin
DisableControls;
ScrollEvents := TScrollEvents.Create();
with ScrollEvents do
begin
BeforeScroll_Event := BeforeScroll;
AfterScroll_Event := AfterScroll;
AutoCalcFields_Property := AutoCalcFields;
BeforeScroll := nil;
AfterScroll := nil;
AutoCalcFields := False;
end;
end;
end;
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
begin
with DataSet do
begin
EnableControls;
with ScrollEvents do
begin
BeforeScroll := BeforeScroll_Event;
AfterScroll := AfterScroll_Event;
AutoCalcFields := AutoCalcFields_Property;
end;
end;
end;
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
var
cat: _Catalog;
tbl: _Table;
col: _Column;
i: integer;
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ScrollEvents: TScrollEvents;
SavePlace: TBookmark;
begin
cat := CoCatalog.Create;
cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0');
tbl := CoTable.Create;
tbl.Set_Name(SheetName);
DBGrid.DataSource.DataSet.First;
with DBGrid.Columns do
begin
for i := 0 to Count - 1 do
if Items[i].Visible then
begin
col := nil;
col := CoColumn.Create;
with col do
begin
Set_Name(Items[i].Title.Caption);
Set_Type_(adVarWChar);
end;
tbl.Columns.Append(col, adVarWChar, 20);
end;
end;
cat.Tables.Append(tbl);
col := nil;
tbl := nil;
cat := nil;
ADOConnection := TADOConnection.Create(nil);
ADOConnection.LoginPrompt := False;
ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0';
ADOQuery := TADOQuery.Create(nil);
ADOQuery.Connection := ADOConnection;
ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]';
ADOQuery.Open;
DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);
SavePlace := DBGrid.DataSource.DataSet.GetBookmark;
try
with DBGrid.DataSource.DataSet do
begin
First;
while not Eof do
begin
ADOQuery.Append;
with DBGrid.Columns do
begin
ADOQuery.Edit;
for i := 0 to Count - 1 do
if Items[i].Visible then
begin
ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString;
end;
ADOQuery.Post;
end;
Next;
end;
end;
finally
DBGrid.DataSource.DataSet.GotoBookmark(SavePlace);
DBGrid.DataSource.DataSet.FreeBookmark(SavePlace);
EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);
ADOQuery.Close;
ADOConnection.Close;
ADOQuery.Free;
ADOConnection.Free;
end;
end;
end.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Admin'im;mussimsek yazdı:bazı Componentler (mesela Quantum Grid) orjinal Excel formatında kaydedebiliyor. Ama bunun için XLS formatını incelemeniz lazım. Daha önce bir siteden bu tarz uzantılarla ilgili format bilgilerini gördüğümü hatırlıyorum ama adresi şu an aklımda değil.
Mesajınız üzerine biraz araştırma yaptım,


http://www.wotsit.org/ olabilir mi bahsettiğiniz adres ?
http://web.archive.org/web/200105012116 ... e/archive/
bu adres te güzele benziyor.
Sevgi, Saygı.....
datasettableproducer hatası
Evet arkadaşlar bende yeni farkına vardım.Önceden size datasettableproducer ile hallettiğimi söylemiştim.Ama bir müşterimden gelen mesajda müşterilerinin ürün ekleyip bunu maille gönderdikleri zaman datasettableproducer'ın 20'den fazla ürünü göstermediğini belirtti.
Bende onun uyarısıyla yeni farkına vardım.Yani datasettableproducer 20 kaydı html veya xls dosyalarında gösteriyor.20'den fazla ürün dbgridde ekli olsada html veya xls dosyarına eklemiyor..
Bunun nedeni nedir.Forumda gördüğüm kadarıyla aynı problemle karşılan bir arkadaş daha varmış.
Yardımlarınızı bekliyorum..
Bende onun uyarısıyla yeni farkına vardım.Yani datasettableproducer 20 kaydı html veya xls dosyalarında gösteriyor.20'den fazla ürün dbgridde ekli olsada html veya xls dosyarına eklemiyor..
Bunun nedeni nedir.Forumda gördüğüm kadarıyla aynı problemle karşılan bir arkadaş daha varmış.
Yardımlarınızı bekliyorum..
Kod: Tümünü seç
form1.ADOTable1.First;
memo1.Text:=datasettableproducer1.Content;
memo1.Lines.SaveToFile(form1.way2+'order_spare.htm');
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
volkan kamadan'a
volkan arkadaş bu unitin kullanımı ile ilgili bilgi verirseniz çok memmun olurum.Bunu delphide açıp unit olarak kaydedip formdak dbgrid'imle veya butonumla nasıl ilişkilendiririm.
Uses kısmına uniti ekledim..Formdan çağırmayı denemedim. file not found ADOX_TLB.dcu hatasını alıyorum.
Sizden bu konuda yardım bekliyorum..
Uses kısmına uniti ekledim..Formdan çağırmayı denemedim. file not found ADOX_TLB.dcu hatasını alıyorum.
Sizden bu konuda yardım bekliyorum..
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
mehaba,
bu uniti daha önce denememiştim,
mesajın üzerine denedim delphi5 ve 7 de ADOX_TBL unitini bulamadım.
zannedersem ekstra bir bileşenin uniti.
Sonuç olaark uniti çalıştıramadım.
bu uniti daha önce denememiştim,
mesajın üzerine denedim delphi5 ve 7 de ADOX_TBL unitini bulamadım.
zannedersem ekstra bir bileşenin uniti.
Sonuç olaark uniti çalıştıramadım.

Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Re: volkan kamadan'a
Project menüsünden Import Type Library komutunu verin.AliRiza yazdı:file not found ADOX_TLB.dcu hatasını alıyorum.
Microsoft ADO Extensions .... diye devam eden seçeneği seçin ve Create Unit deyin.
Kolay gelsin.
unitin kullanımı
Kod: Tümünü seç
Exporting a DBGrid to excel without OLE
I develop software and about 95% of my work deals with databases.
I enjoied the advantages of using Microsoft Excel in my projects
in order to make reports but recently I decided to convert myself
to the free OpenOffice suite.
I faced with the problem of exporting data to Excel without having
Office installed on my computer.
The first solution was to create directly an Excel format compatible file:
this solution is about 50 times faster than the OLE solution but there
is a problem: the output file is not compatible with OpenOffice.
I wanted a solution which was compatible with each "DataSet";
at the same time I wanted to export only the dataset data present in
a DBGrid and not all the "DataSet".
Finally I obtained this solution which satisfied my requirements.
I hope that it will be usefull for you too.
First of all you must import the ADOX type library
which will be used to create the Excel file and its
internal structure: in the Delphi IDE:
1)Project->Import Type Library:
2)Select "Microsoft ADO Ext. for DDL and Security"
3)Uncheck "Generate component wrapper" at the bottom
4)Rename the class names (TTable, TColumn, TIndex, TKey, TGroup, TUser, TCatalog) in
(TXTable, TXColumn, TXIndex, TXKey, TXGroup, TXUser, TXCatalog)
in order to avoid conflicts with the already present TTable component.
5)Select the Unit dir name and press "Create Unit".
It will be created a file named AOX_TLB.
Include ADOX_TLB in the "uses" directive inside the file in which you want
to use ADOX functionality.
That is all. Let's go now with the implementation:
}
unit DBGridExportToExcel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, DB, IniFiles, Buttons, dbgrids, ADOX_TLB, ADODB;
type TScrollEvents = class
BeforeScroll_Event: TDataSetNotifyEvent;
AfterScroll_Event: TDataSetNotifyEvent;
AutoCalcFields_Property: Boolean;
end;
procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
implementation
//Support procedures: I made that in order to increase speed in
//the process of scanning large amounts
//of records in a dataset
//we make a call to the "DisableControls" procedure and then disable the "BeforeScroll" and
//"AfterScroll" events and the "AutoCalcFields" property.
procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
begin
with DataSet do
begin
DisableControls;
ScrollEvents := TScrollEvents.Create();
with ScrollEvents do
begin
BeforeScroll_Event := BeforeScroll;
AfterScroll_Event := AfterScroll;
AutoCalcFields_Property := AutoCalcFields;
BeforeScroll := nil;
AfterScroll := nil;
AutoCalcFields := False;
end;
end;
end;
//we make a call to the "EnableControls" procedure and then restore
// the "BeforeScroll" and "AfterScroll" events and the "AutoCalcFields" property.
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
begin
with DataSet do
begin
EnableControls;
with ScrollEvents do
begin
BeforeScroll := BeforeScroll_Event;
AfterScroll := AfterScroll_Event;
AutoCalcFields := AutoCalcFields_Property;
end;
end;
end;
//This is the procedure which make the work:
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
var
cat: _Catalog;
tbl: _Table;
col: _Column;
i: integer;
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ScrollEvents: TScrollEvents;
SavePlace: TBookmark;
begin
//
//WorkBook creation (database)
cat := CoCatalog.Create;
cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0');
//WorkSheet creation (table)
tbl := CoTable.Create;
tbl.Set_Name(SheetName);
//Columns creation (fields)
DBGrid.DataSource.DataSet.First;
with DBGrid.Columns do
begin
for i := 0 to Count - 1 do
if Items[i].Visible then
begin
col := nil;
col := CoColumn.Create;
with col do
begin
Set_Name(Items[i].Title.Caption);
Set_Type_(adVarWChar);
end;
//add column to table
tbl.Columns.Append(col, adVarWChar, 20);
end;
end;
//add table to database
cat.Tables.Append(tbl);
col := nil;
tbl := nil;
cat := nil;
//exporting
ADOConnection := TADOConnection.Create(nil);
ADOConnection.LoginPrompt := False;
ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0';
ADOQuery := TADOQuery.Create(nil);
ADOQuery.Connection := ADOConnection;
ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]';
ADOQuery.Open;
DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);
SavePlace := DBGrid.DataSource.DataSet.GetBookmark;
try
with DBGrid.DataSource.DataSet do
begin
First;
while not Eof do
begin
ADOQuery.Append;
with DBGrid.Columns do
begin
ADOQuery.Edit;
for i := 0 to Count - 1 do
if Items[i].Visible then
begin
ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString;
end;
ADOQuery.Post;
end;
Next;
end;
end;
finally
DBGrid.DataSource.DataSet.GotoBookmark(SavePlace);
DBGrid.DataSource.DataSet.FreeBookmark(SavePlace);
EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);
ADOQuery.Close;
ADOConnection.Close;
ADOQuery.Free;
ADOConnection.Free;
end;
end;
end.
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
Projeye uniti ekleme
Project menüsünden add to project deyip uniti ekledim.
Ancak derlemek istediğimde
unitte bağlantı satırında şu tip uyumsuzluğu hatasını alıyorum.
Hata
Hata veren satır
Ayrıca bu hatayı giderdikten sonra form1'de uses kısmına uniti ekleyip
Bir butonun clik veya herhangi bir olayında formde yer alan griddeki verileri aktarmak için unitteki procedure'i aşağıdaki gibi kullansam olur mu?
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
Yukarıdaki procedure'
unitten aşağıdaki gibi çağırsam doğrumu olur sizce..
Ancak derlemek istediğimde
unitte bağlantı satırında şu tip uyumsuzluğu hatasını alıyorum.
Hata
Kod: Tümünü seç
[Error] DBGridExportToExcel.pas(116): Incompatible types: 'String' and 'IDispatch'
Kod: Tümünü seç
cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0');
Bir butonun clik veya herhangi bir olayında formde yer alan griddeki verileri aktarmak için unitteki procedure'i aşağıdaki gibi kullansam olur mu?
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
Yukarıdaki procedure'
unitten aşağıdaki gibi çağırsam doğrumu olur sizce..
Kod: Tümünü seç
DBGridToExcelADO(dbgrid1,'aktarilcacakdosya.xls','aktarılansayfa');
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ