![]() |
|
Excel Export PDF - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6) +--- Konu Başlığı: Excel Export PDF (/showthread.php?tid=163) Sayfalar:
1
2
|
Cvp: Excel Export PDF - pro_imaj - 07-09-2016 (07-09-2016, Saat: 14:49)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: GetActiveOleObject & CreateOleObject metodlarını mı kullanıyorsunuz Excel OLE nesnesini elde etmek için ? Tuğrul Bey; CreateOleObject nesnesini kullanıyorum. Cvp: Excel Export PDF - QuAdR - 07-09-2016 procedure TForm1.Button1Click(Sender: TObject);
var
xls, wb, ws: Variant;
begin
xls := CreateOleObject('Excel.Application');
wb := xls.Workbooks.Open('C:\deneme.xlsx');
ws := wb.ActiveSheet;
ws.ExportAsFixedFormat(0, 'C:\deneme.pdf', 0,
TRUE, FALSE, EmptyParam, EmptyParam,
TRUE, // Kaydettikten sonra aç
EmptyParam);
wb.Close;
xls.Quit;
xls := unassigned;
end;
Bu şekilde sıkıntısız çalıştı. Cvp: Excel Export PDF - pro_imaj - 07-09-2016 (07-09-2016, Saat: 17:05)QuAdR Adlı Kullanıcıdan Alıntı: Cevabınız için çok teşekkür ederim bende de sorunsuz çalıştı. Benim ilk mesajda yazdığım kodla tek farkı olan ilk EmptyParam cümlesi yerine dosya yolu 'C:\Kitap1.pdf' yazınca da sorunsuz çalıştı. ![]() Kod: Excel.ExportAsFixedFormat(0, EmptyParam, EmptyParam, EmptyParam,Excel Export PDF - SimaWB - 08-09-2016 (07-09-2016, Saat: 11:03)SimaWB Adlı Kullanıcıdan Alıntı: İkincisi; yine aynı sayfaya göre fonksiyonun ilk parametresi type(xlTypePDF yada xlTypeXPS), ikincisi dosya ismi olmalı. Excel Export PDF - engerex - 08-09-2016 Libre Office ve Delphi ile mümkün mü? Cvp: Excel Export PDF - pro_imaj - 08-09-2016 (08-09-2016, Saat: 18:50)engerex Adlı Kullanıcıdan Alıntı: Libre Office ve Delphi ile mümkün mü? Libre Office hiç kullanmadım fakat yol şöyle olmalı. Bahsettiğiniz platformda macro yazabiliyor musunuz? Excel Export PDF - pro_imaj - 04-07-2018 Merhaba; Exceldeki ilgili sayfayı excel tarafında farklı kaydet/PDF yaptığımda yazdırılabilir alanları kaydediyorken, Delphi tarafında yukarıdaki kod kullanıldığında ilgili sayfada ne varsa onu kaydediyor. Exceldeki gibi sadece yazdırılabilir alan PDF olarak nasıl kaydedilebilir. Excel Export PDF - mrmarman - 27-10-2021 Başlığı hortlatmak buna denir... Uzunca bir yazı olacak, umuyorum sabırla okursunuz. Zaten ihtiyacı olan okur, genel kültür bilgisi olarak görmek isteyen için çözümü peşinen yazdım... Ben de benzer bir sorunu (yazdırma alanı içerisindekiyle sınırlandırılmış EXCEL dosyasından PDF çıktı alırken, istemediğim halde dışarıdaki formülasyon alanlarını da dahil etmesi) yaşadım ve derin bir arama sonucu bulgularımı paylaşayım... Önce çözümü : XLSX dosyalarında bu sorun karşıma çıktı, ancak yine ilacı kendi içinde saklı buldum. Şöyle ki MS-EXCEL ile açıp "Farklı Kaydet" diyerek aşağıdaki görseldeki gibi "Kayıt Türü" olarak eski verisyon "Excel 97-2003 Çalışma Kitabı (*.xls)" seçince XLS uzantılı yeni oluşturulan dosyadan Delphi ile okumada sorunsuz çalışıyor. ![]() Sorunu nasıl tespit ettiğime gelince, aşağıdaki gibi bir test yapısı oluşturdum... Orta kısımda göreceğiniz şu satır sorunu anlamada kilit rol oynuyor... Kod: InputBox('','', LExcel.ActiveSheet.PageSetup.PrintArea );XLSX dosyada yazdırma alanı belirlenmiş olsa dahi ComObj ile Excel dosyasını okuduğunuzda PrintArea içeriği boş geliyor. ![]() Bur bir Microsoft "BUG" olmalı. Çünkü örnek olarak oluşturduğum XLSX dosya açıldığında içerikte bu alan tanımlı. Belirttiğim gibi dosyayı açıp Farklı Kaydet deyip eski Excel formatında XLS olarak kaydedip aynı çağrıyı yaparsak içi dolu geliyor. ![]() Hatta aynı örnekte alltaki kod satırının başındaki // comment tagını kaldırdığınızda şunu da göreceksiniz. * Dosyayı açtınız diyelim. İçeriği boş gelen PrintArea için elle müdahale ederek kendi yazdırma alnı adresimizi aşağıdaki şekilde tanımlarsanız, işlem RunTime tanımladığınız bu alan içerisindeki kısım kusursuz şekilde PDF çıktı veriyor. * Yani eğer statik raporlamanız varsa bunu da (yani RunTime PrintArea tanımlamayı) çözüm olarak değerlendirebilirsiniz. Kod: // LWorkSheet.PageSetup.PrintArea := '$A$1:$C$7';Bir üçüncü durum. Ne yaptım?! bunu RunTime tanımlayıp yeni bir XLSX dosyası olarak kaydettim. (MS-Excel 2016 format) * Anlamak istediğim ne idi ? Excel benim Delphi ile OleAutomation ( comobj ) erişimimde neyi beğenmiyor ? onu anlamak istedim. * ButtonClick procedure'ün en alttaki kısmında görüleceği üzere açılan bu yeni tip XLSX ancak içeriği boş gelen dosyayı yeni bir isimle yeni aynı yeni tip Excel formatında ANCAK kaydetme işleminden önce RunTime ile "Yazdırma Alanı" belirleyip de Delphi içerisinden kaydı gerçekleştirdim. Kod: // LWorkBook.SaveAs( ChangeFileExt( LXLSFileName, '_.xlsx'), xlWorkbookDefault);MS-Excel ile bu Delphi yakasında oluşan yeni dosyayı açınca da "printarea" sorunsuz yer aldı. Excel sınavı geçti. Delphi ile yine bu yeni dosyayı okuyunca ne oldu ?!! Şimdi ZURNA'nın kaba ses çıkardığı yere geliyoruz.... Bu yeni oluştuduğum dosyayı Delphi ile çağırınca da olay anlaşılıyor, yabancı dil sorunu. Türkçe Excel ile İngilizce orjinal dil arasında AD ÇAKIŞMASI diye tabir ettiği Print_Area PrintArea olayı... OleAutomation'daki söylem ile Excel'in duymak istediğin örtüşmediği ortaya çıkıyor... Excel'deki Ad Yöneticisi başlığı :
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
const
xlTypePDF = 0;
xlTypeXPS = 1;
xlQualityStandard = 0;
xlQualityMinimum = 1;
xlWorkbookDefault = 51;
var
LExcel,
LWorkBook,
LWorkSheet : OleVariant;
aType,
aFileName,
aQuality,
aIncludeDocProperties,
aIgnorePrintAreas,
aFrom,
aTo,
aOpenAfterPublish,
aFixedFormatExtClassPtr : Variant;
LXLSFileName,
LPDFFileName : String;
begin
LExcel := Null;
LWorkbook := Null;
LXLSFileName := 'c:\ARMAN.Study\Downloads\Kitap1.xlsx';
//LXLSFileName := 'c:\ARMAN.Study\Downloads\Kitap1.xls';
LXLSFileName := 'c:\ARMAN.Study\Downloads\Kitap1_.xlsx';
LPDFFileName := 'c:\ARMAN.Study\Downloads\Kitap1.pdf';
try
LExcel := CreateOleObject('Excel.Application');
except
LExcel := Null;
end;
try
If NOT VarIsNull( LExcel ) then
begin
LExcel.Visible := False;
LExcel.DisplayAlerts := False;
try
LWorkBook := LExcel.Workbooks.Open( LXLSFileName );
LWorkSheet := LWorkBook.ActiveSheet;
aType := xlTypePDF;
aFileName := LPDFFileName;
aQuality := xlQualityStandard;
aIncludeDocProperties := False;
aIgnorePrintAreas := False;
aFrom := 1;
aTo := 1;
aOpenAfterPublish := True;
aFixedFormatExtClassPtr := EmptyParam;
// LWorkSheet.PageSetup.PrintArea := '$A$1:$C$7';
InputBox('','', LExcel.ActiveSheet.PageSetup.PrintArea );
// if LWorkSheet.PageSetup.PrintArea <> ''
//then
LWorkSheet.ExportAsFixedFormat( aType, aFileName, aQuality,
aIncludeDocProperties,
aIgnorePrintAreas,
aFrom, aTo,
aOpenAfterPublish, aFixedFormatExtClassPtr );
except
LWorkBook := Null;
end;
// LWorkBook.SaveAs( ChangeFileExt( LXLSFileName, '_.xlsx'), xlWorkbookDefault);
end;
finally
LExcel.Workbooks.Close;
LExcel.DisplayAlerts := True;
LExcel.Quit;
LWorkBook := Unassigned;
LExcel := Unassigned;
end;
Showmessage('OK');
end;
Excel Export PDF - mrmarman - 27-10-2021 Arkadaşlar. Komik gelecek ama bir çözüm ortaya çıktı. Bir de ActiveX getobject var ki o da bir çözüm oldu ancak ona da hiç girmeye gerek kalmadı... Eski Hali : LWorkBook := LExcel.Workbooks.Open( LXLSFileName ); bunun yerine OpenXML derseniz hata vermediği gibi PrintArea bilgilerini de sorunsuz okuyabiliyor. Dolayısıyla da PDF çıktısı tam istediğimiz gibi yazıcı belirlenmiş alan kadar ile sınırlandırılarak, sorunsuz çıktı veriyor. Yeni Sorunsuz Hali : LWorkBook := LExcel.Workbooks.OpenXML( LXLSFileName ); |