Delphi Can
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ı:
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ı.

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ı.  Blush
Kod:
Excel.ExportAsFixedFormat(0, EmptyParam, EmptyParam, EmptyParam,
  EmptyParam, EmptyParam, 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... Smile  
 
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.

yma2jvch1oflrzsxymti.png

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

dwa4msaps7icxztn658h.png

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.

lkfxb4p8dseahdlpxjnz.png


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....  Cool

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...


wzkcf7t5t6o3ehuelb1s.png



Excel'deki Ad Yöneticisi başlığı :

njctwmtyxsqohwoeawxr.png

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 );