Technikai cikk

Excel munkalapok exportálása PDF-be Delphiben Office nélkül

Egy Excel munkalap PDF-be történő exportálásához Delphiből vagy C++Builderből anélkül, hogy az Office telepítve lenne, hívja meg a SaveAsPDF metódust egy HotXLS munkalapon vagy munkafüzeten. A HotXLS egy natív VCL Excel komponens, és a munkalap-PDF export funkciója a munkalap használt tartományát egy önálló PDF 1.4 fájllá rendereli le, leképezve az Excel oszlopszélességeit és a cellák megjelenített szövegeit A4-es oldalakra, automatikus többoldalas tördeléssel. Sem az Excel másolata, sem nyomtató-illesztőprogram, sem külső DLL nem vesz részt a renderelésben

A HotXLS a PDF-et adatbemutatási formátumként kezeli, amely a CSV, TSV és HTML exportálási útvonalak testvére, nem pedig pixelpontos renderelő motor. Az exportálás reprodukálja a táblázatos tartalmat és elrendezést: a rácsban látható értékeket, az oszloparányokat és a cellák körüli rácsvonalakat. Ez a keretezés azért fontos, mert előre tisztázza az elvárásokat, és a cikk többi része pontosan arról szól, hol húzódik a határvonal

Hogyan konvertálható az Excel PDF-be Delphiben Office nélkül?

A legrövidebb út egyetlen hívás. A TXLSWorksheet közzéteszi a SaveAsPDF(FileName) és SaveAsPDF(Stream) metódusokat, a TXLSWorkbook pedig ugyanazt a két túlterhelést, amelyek az aktív munkalapra irányítanak át. Mindegyik egy Integer értéket ad vissza, 1-et siker esetén és -1-et hiba esetén, így az eredmény alapján elágazhat anélkül, hogy a hívást saját kivételkezelésbe csomagolná

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;

Ha meghívja a SaveAsPDF metódust egy munkalapon, a HotXLS a munkalap UsedRange (használt tartomány) részét exportálja, amely minden kitöltött cella befoglaló kerete. A munkafüzet túlterhelése egy kényelmi funkció, amely az aktív munkalapra delegál, így a több munkalapból álló jelentés vagy végigmegy a szükséges lapokon egy cikluson keresztül, vagy kiválasztja az aktív munkalapot a hívás előtt. Nincs olyan teljes munkafüzetet egyetlen lépésben átfogó mód, amely minden lapot összefűzne: minden hívás egy lapot vagy egy tartományt renderel le

Hogyan alakítja a HotXLS a használt tartományt PDF oldalakká?

A HotXLS celláról cellára járja be a használt tartományt, és egy oldalakra osztott rácsként rendezi el. Az oszlopok geometriája közvetlenül az Excelből származik: minden oszlopszélesség az Excel szélességegységből tipográfiai pontokká konvertálódik, egy minimális alsó határral, hogy egyetlen oszlop se zsugorodjon csíkká. Ha az oszlopok együtt szélesebbek, mint a használható oldal, a HotXLS egyenletesen lekicsinyíti őket az illeszkedéshez; ha már eleve elférnek, a természetes szélességükön hagyja őket ahelyett, hogy szétnyújtaná őket a lapon

A sorok ezután lefelé folynak az oldalon, amíg a következő át nem lépné az alsó margót, ekkor a HotXLS egy új oldalt nyit és folytatja, így egy ezer soros munkalap önállóan tördelődik oldalakra, az Ön részéről történő oldaltörés-könyvelés nélkül. Minden cella kiírja a FormattedText tulajdonságát, ami a számformátum alkalmazása után előállított megjelenítési karakterlánc, így a dátum úgy jelenik meg, ahogy a lap mutatja, a pénznem cella pedig megtartja ezreselválasztóit és szimbólumát. A oszlopán túlnyúló szöveg a cellaszélességre vágódik le ahelyett, hogy átfolyna a szomszédos cellába

Tájolás, margók és betűméret szabályozása

Az alapértelmezett elrendezésen túli dolgokhoz vezérelje közvetlenül az exportőrt. A TXLSPDFExport az egysoros segédfüggvények mögötti osztály, és három tulajdonságot tesz közzé: Orientation (xlsPdfPortrait vagy xlsPdfLandscape, alapértelmezetten álló), Margin (pontokban, alapértelmezetten 40) és FontSize (pontokban, alapértelmezetten 9). Állítsa be őket, mielőtt meghívná a SaveAsPDF metódust, és a teljes dokumentum átveszi őket

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;

A TXLSPDFExport a teljes lap helyett egy tartományt is elfogad a SaveAsPDF(Range: IXLSRange; ...) metóduson keresztül, így exportálhat például egy összesítő blokkot egy olyan lapból, amely piszkozati számításokat is tartalmaz. Ez a tartomány-túlterhelés megegyezik azzal, amelyre a munkalap-segítő belsőleg támaszkodik, így az elrendezés, a léptékezés és az oldaltördelés azonosan viselkedik, függetleg attól, hogy a teljes használt tartományt vagy egy kézzel választott kijelölést ad át neki

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;

Miért nem ágyaz be betűtípust a HotXLS: a Helvetica és a WinAnsi kompromisszuma

A HotXLS a szöveget a PDF beépített Helvetica betűtípusával és a WinAnsiEncoding kódolással írja le, ami egy tudatos, nulla-függőségű választás egy valós korláttal. Mivel a Helvetica a szabványos 14 betűtípus egyike, amelyet minden megfelelő PDF-olvasó eleve tartalmaz, az exportőr egyáltalán nem ágyaz be betűtípus-programot: a fájl kicsi marad és bárhol megnyitható, anélkül, hogy bármit is licencelni vagy szállítani kellene mellé. Ennek a választásnak az ára a karakterkészlet, amelyet az oldal megjeleníthet

A WinAnsiEncoding lefedi a Windows-1252 készletet, így a latin szövegek, a gyakori írásjelek és a szokásos nyugat-európai ékezetek helyesen renderelődnek, a HotXLS pedig néhány tipográfiai karaktert, göndör idézőjeleket, en és em kötőjeleket, valamint az euró jelet is behajtja a CP1252 helyeikre. Az ezen a tartományon kívüli karakterek, a CJK ideogrammák, a cirill, a görög és az arab karakterek kérdőjellé esnek össze az oldalon. Ha a munkalapjai nem latin szöveget tartalmaznak, ez az exportőr nem a megfelelő eszköz, és egy teljes formázású PDF-renderelő a megfelelő megoldás

Ahol a munkalap-PDF exportálás véget ér

A HotXLS a tartalmat és a szerkezetet rendereli le, nem a lap teljes vizuális stílusát. A cellakitöltések, a szegélystílusok, a cellánkénti betűtípusok és színek, a diagramok és a beágyazott képek kívül esnek azon, amit az exportőr rajzol; amit kap, az a szöveges rács egyenletes rácsvonalakkal. Ez ugyanaz a szerződés, amelyet a HTML és RTF exportőrök is tiszteletben tartanak, és ez a megfelelő egy olyan jelentéshez vagy adatátadásnak, ahol a számok hordozzák a jelentést, a dizájn pedig nem

Ha a cél egy stílusos, márka-konzisztens dokumentum, a szokásos minta az, hogy a számokat először egy táblázatsablonban állítják össze, amelyet a sablon-alapú jelentésgenerálási munkafolyamat részletesen tárgyal. És mivel mindez nem érinti a COM-ot vagy egy futó Excel példányt, a folyamat illeszkedik ugyanabba az Office-mentes automatizálási modellbe, amelyet a HotXLS végig használ: tiszta Pascal, headless szerverre telepíthető, licencelendő vagy felügyelendő interop nélkül

Az önálló PDF, bájtról bájtra

A HotXLS kézzel építi fel a PDF fájlszerkezetet, és a kereszt-hivatkozási tábláját (cross-reference table) pontos bájt-eltolásokból számítja ki, ez az oka annak, hogy a kimenet minden olvasóban megnyílik. Az egyes objektumok szerializálásakor a HotXLS rögzíti az objektum kezdő eltolását, mielőtt hozzáfűzné a bájtjait, majd a futási pozíciót növeli a leírt hosszal, így az xref táblázat pontosan az egyes objektumokra mutat, a startxref pedig jelzi, hol kezdődik ez a táblázat. Az az olvasó, amelyik akár csak egy bájttal is eltérő eltolást talál, elutasítja az egész fájlt, ami a saját maga által számított eltolást teszi az exportőr teherbíró szerződésévé

Ez a szerződés egy szigorú következményt hordoz, amelyet érdemes tudni. A Pages csomópont íródik le először 1. objektumként, de a gyermekoldalainak listája nem ismert mindaddig, amíg minden oldalt ki nem bocsátottak, így a HotXLS helyőrzőként foglalja le, és az eltolási menet lefutása előtt foltozza be (patches in) a végleges gyermekeket és a számlálót, soha nem utána. Miután egy objektum bájtjait megmérték az xref számára, azok befagynak: egyetlen bájt megváltoztatása utólag elcsúsztatna minden következő eltolást, és megrontaná a táblázatot. Ez egy apró fegyelem, amely egy szabványos érvényességű PDF 1.4-et biztosít, anélkül, hogy bármilyen könyvtár lenne alatta

Az itt bemutatott SaveAsPDF metódusok és a TXLSPDFExport osztály a Delphihez készült HotXLS Delphi Excel Component részei, a CSV, HTML és RTF exportőrökkel, valamint a Delphi és C++Builder teljes munkalap-API-jával együtt