Konuyu Oyla:
  • Derecelendirme: 4.5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Excel Export PDF
#11
(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.
Cevapla
#12
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ı.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#13
(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
Excel.ExportAsFixedFormat(0, EmptyParam, EmptyParam, EmptyParam,
  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Cevapla
#14
(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ı.
There's no place like 127.0.0.1
WWW
Cevapla
#15
Libre Office ve Delphi ile mümkün mü?
Cevapla
#16
(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?
Cevapla
#17
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.
Cevapla
#18
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...

     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

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

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

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#19
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 );

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi Sürekli Adı Değişen Excel Dosyasından Veri Çekme bünyamin68 2 610 05-10-2023, Saat: 12:50
Son Yorum: mcuyan
  Excel Aktarım OZCANK 2 435 21-08-2023, Saat: 12:57
Son Yorum: frmman
  Delphi 7 Excel'e Veri Aktarma mahone 6 1.091 02-05-2023, Saat: 08:34
Son Yorum: COMMANDX
  Klasördeki Tüm Excel Dosyalarından Veri Alma bünyamin68 13 2.787 09-01-2023, Saat: 09:33
Son Yorum: RAD Coder
  cxgrid Excel içine sayfa sayfa export Etme Mesut 2 1.004 08-09-2022, Saat: 15:39
Son Yorum: Mesut



Konuyu Okuyanlar: 1 Ziyaretçi