Teknik Makale

Office Olmadan Delphi'de Excel Çalışma Sayfalarını PDF'e Aktarma

Office yüklü olmadan Delphi veya C++Builder'dan bir Excel çalışma sayfasını PDF'e aktarmak için bir HotXLS çalışma sayfası veya çalışma kitabı üzerinde SaveAsPDF yöntemini çağırın. HotXLS, yerel bir VCL Excel bileşenidir og çalışma sayfasından PDF'e aktarım özelliği, Excel sütun genişliklerini ve hücre görüntüleme metinlerini otomatik çoklu sayfa düzeniyle A4 sayfalarına eşleyerek çalışma sayfasının kullanılan aralığını (used range) kendi kendine yeten bir PDF 1.4 dosyası olarak işler. İşleme aşamasında hiçbir Excel kopyası, yazıcı sürücüsü ve harici DLL yer almaz

HotXLS, PDF'i piksel düzeyinde hassas bir işleme motorundan ziyade, CSV, TSV ve HTML dışa aktarma yollarının kardeşi olan bir veri sunum biçimi olarak görür. Dışa aktarma, tablo içeriğini ve düzenini yeniden üretir: ızgarada gördüğünüz değerler, sütun oranları ve hücrelerin etrafındaki kılavuz çizgileri. Bu çerçeve önemlidir çünkü başlangıçta dürüst bir beklenti oluşturur ve bu makalenin geri kalanı tam olarak çizginin nereye düştüğü hakkındadır

Office olmadan Delphi'de Excel'i PDF'e nasıl dönüştürürsünüz?

En kısa yol tek bir çağrıdır. TXLSWorksheet, SaveAsPDF(FileName) ve SaveAsPDF(Stream) yöntemlerini sunar, TXLSWorkbook ise aktif sayfaya yönlendiren aynı iki aşırı yüklemeyi (overload) sunar. Her biri başarı durumunda 1, başarısızlık durumunda -1 olmak üzere bir Integer döndürür, böylece çağrıyı kendi istisna işleme yapınızla sarmalamadan sonuca göre dallanabilirsiniz

uses
  lxHandle;

var
  Book: TXLSWorkbook;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('sales-june.xlsx');
    // Render the active sheet's used range straight to report.pdf.
    if Book.SaveAsPDF('report.pdf') = 1 then
      Writeln('PDF written');
  finally
    Book.Free;
  end;
end;

Bir çalışma sayfasında SaveAsPDF yöntemini çağırdığınızda HotXLS, o sayfanın doldurulmuş her hücresinin sınırlayıcı kutusu olan UsedRange aralığını dışa aktarır. Çalışma kitabı aşırı yüklemesi, aktif sayfaya delege eden bir kolaylıktır; bu nedenle çok sayfalı bir rapor, ihtiyaç duyduğu sayfalar üzerinde döner veya çağrıdan önce aktif sayfayı seçer. Her sekmesini birleştiren tek geçişli, tüm çalışma kitabını kapsayan bir mod yoktur: her çağrı tek bir sayfayı veya tek bir aralığı işler

HotXLS, kullanılan bir aralığı PDF sayfalarına nasıl dönüştürür?

HotXLS, kullanılan aralığı hücre hücre tarar ve sayfalandırılmış bir ızgara olarak düzenler. Sütun geometrisi doğrudan Excel'den gelir: her sütun genişliği Excel genişlik biriminden tipografik noktalara (points) dönüştürülür, hiçbir sütunun ince bir şerit haline gelmemesi için minimum bir taban sınır uygulanır. Sütunlar birlikte kullanılabilir sayfadan daha geniş olduğunda HotXLS, sığdırmak için bunları tek biçimli olarak ölçeklendirir; zaten sığıyorlarsa, sayfaya yaymak yerine doğal genişliklerinde bırakır

Daha sonra satırlar, bir sonrakinin alt kenar boşluğunu geçeceği ana kadar sayfadan aşağıya doğru akar ve bu noktada HotXLS yeni bir sayfa açıp devam eder; böylece bin satırlık bir sayfa, sizin sayfa sonu takibi yapmanıza gerek kalmadan kendi kendine sayfalanır. Her hücre, sayı biçimi uygulandıktan sonra üretilen görüntü dizesi olan FormattedText değerini yazdırır; böylece bir tarih sayfanın gösterdiği tarih olarak görünür ve bir para birimi hücresi binlik ayırıcılarını ve simgesini korur. Sütununu aşan metin, komşuya taşmak yerine hücre genişliğine göre kırpılır

Yönlendirmeyi, kenar boşluklarını ve yazı tipi boyutunu kontrol etme

Varsayılan düzenin ötesindeki her şey için dışa aktarıcıyı doğrudan yönlendirin. TXLSPDFExport, tek satırlık yardımcıların arkasındaki sınıftır ve üç özellik yayınlar: Orientation (xlsPdfPortrait veya xlsPdfLandscape, varsayılan olarak dikey), Margin (nokta cinsinden, varsayılan 40) og FontSize (nokta cinsinden, varsayılan 9). Bunları SaveAsPDF yöntemini çağırmadan önce ayarlayın; tüm belge bunları alacaktır

uses
  lxHandle, lxPDF;

var
  Book: TXLSWorkbook;
  Exporter: TXLSPDFExport;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('wide-ledger.xlsx');
    Exporter := TXLSPDFExport.Create;
    try
      Exporter.Orientation := xlsPdfLandscape;  // fit wide sheets on the page
      Exporter.Margin := 28;                     // tighter page margin, in points
      Exporter.FontSize := 8;                    // denser rows
      Exporter.SaveAsPDF(Book.ActiveSheet, 'ledger.pdf');
    finally
      Exporter.Free;
    end;
  finally
    Book.Free;
  end;
end;

TXLSPDFExport ayrıca SaveAsPDF(Range: IXLSRange; ...) aracılığıyla tüm sayfa yerine bir aralığı da kabul eder, bu da karalama hesaplamalarını tutan bir sayfadan bir özet bloğunu nasıl dışa aktaracağınızdır. Bu aralık aşırı yüklemesi, çalışma sayfası yardımcısının dahili olarak yaslandığı aralıkla aynıdır; bu nedenle düzen, ölçekleme ve sayfalandırma, tam bir kullanılan aralık veya elle seçilmiş bir alan vermenizden bağımsız olarak aynı şekilde davranır

var
  Book: TXLSWorkbook;
  Exporter: TXLSPDFExport;
  Summary: IXLSRange;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('quarter.xlsx');
    // Export only the summary block, not the scratch columns beside it.
    Summary := Book.Sheets[1].Range['A1', 'F20'];
    Exporter := TXLSPDFExport.Create;
    try
      Exporter.SaveAsPDF(Summary, 'summary.pdf');
    finally
      Exporter.Free;
    end;
  finally
    Book.Free;
  end;
end;

HotXLS neden hiçbir yazı tipi gömmez: Helvetica ve WinAnsi dengesi

HotXLS, metni PDF'in yerleşik Helvetica yazı tipi ve WinAnsiEncoding ile yazar; bu, tek bir gerçek sınırı olan bilinçli, sıfır bağımlılıklı bir seçimdir. Helvetica, her uyumlu PDF okuyucusunun zaten taşıdığı standart 14 yazı tipinden biri olduğundan, dışa aktarıcı hiçbir yazı tipi programını gömmez: dosya küçük kalır ve yanında lisanslanacak veya gönderilecek hiçbir şey olmadan her yerde açılır. Bu seçimin maliyeti, sayfanın gösterebileceği karakter repertuarıdır

WinAnsiEncoding, Windows-1252 kümesini kapsar; bu nedenle Latin metni, yaygın noktalama işaretleri ve olağan Batı Avrupa aksanları doğru şekilde işlenir ve HotXLS birkaç tipografik karakteri, süslü tırnakları, en ve em tirelerini ve euro simgesini CP1252 yuvalarına katlar. Bu aralığın dışındaki karakterler, CJK ideogramları, Kiril, Grekçe ve Arapça sayfada bir soru işaretine dönüşür. Sayfalarınız Latin dışı metinler taşıyorsa, bu dışa aktarıcı yanlış araçtır ve tam stil destekli bir PDF oluşturucu işe uygun olanıdır

Çalışma sayfasından PDF'e aktarımın durduğu yer

HotXLS, sayfanın tam görsel stilini değil, içeriği ve yapıyı işler. Hücre dolguları, kenar bazında kenarlık stilleri, hücre bazında yazı tipleri ve renkler, grafikler ve gömülü görüntüler dışa aktarıcının çizdiği sınırların dışındadır; elde ettiğiniz şey, tek biçimli kılavuz çizgilerine sahip metin ızgarasıdır. Bu, HTML ve RTF dışa aktarıcılarının onurlandırdığı sözleşmenin aynısıdır ve sayıların anlam taşıdığı ve temanın önemli olmadığı bir rapor veya veri teslimi için doğru olandır

Hedef stillendirilmiş, marka ile tutarlı bir belge olduğunda, genel model sayıları önce bir elektronik tablo şablonunda bir araya getirmektir; bu da şablon tabanlı rapor oluşturma iş akışı makalesinde derinlemesine ele alınmıştır. Ve bunların hiçbiri COM'a veya çalışan bir Excel örneğine dokunmadığından, işlem hattı HotXLS'in genelinde kullandığı Office olmadan otomasyon modeline uyar: lisanslanacak veya bakılacak hiçbir birlikte çalışabilirlik (interop) olmadan arka planda çalışan bir sunucuya dağıtılabilir saf Pascal

Bayt bayt kendi kendine yeten PDF

HotXLS, PDF dosya yapısını elle oluşturur ve çapraz referans (cross-reference) tablosunu kesin bayt farklarına göre hesaplar, bu da çıktının her okuyucuda açılmasının nedenidir. Her nesneyi serileştirirken, HotXLS baytlarını eklemeden önce o nesnenin başlangıç farkını kaydeder, ardından yürütülen konumu az önce yazdığı uzunluk kadar ilerletir, böylece xref tablosu tam olarak her nesnenin üzerine düşer ve startxref bu tablonun başladığı yeri işaretler. Bu farkları bir bayt bile yanlış bulan bir okuyucu tüm dosyayı reddeder, bu da kendi kendine hesaplanan farkı dışa aktarıcının yük taşıyan sözleşmesi haline getirir

Bu sözleşme, bilinmesi gereken kesin bir sonuç taşır. Pages düğümü ilk olarak nesne 1 olarak yazılır, ancak alt sayfalarının listesi her sayfa yayımlanana kadar bilinmez; bu nedenle HotXLS onu bir yer tutucu olarak rezerve eder og fark geçişi çalıştırılmadan önce son sayfaları ve sayıyı yamalar, asla sonrasında değil. Bir nesnenin baytları xref için ölçüldükten sonra dondurulur: sonrasında tek bir baytı değiştirmek takip eden her farkı kaydıracak ve tabloyu bozacaktır. Altında hiçbir kütüphane olmadan standartlara uygun bir PDF 1.4 kazandıran küçük bir disiplindir

Burada gösterilen SaveAsPDF yöntemleri ve TXLSPDFExport sınıfı, CSV, HTML ve RTF dışa aktarıcıları ve Delphi ve C++Builder için tam çalışma sayfası API'siyle birlikte HotXLS Delphi Excel Bileşeni ile birlikte gelir