Article technique

Exporter des feuilles de calcul Excel au format PDF dans Delphi sans Office

Pour exporter une feuille de calcul Excel au format PDF depuis Delphi ou C++Builder sans qu'Excel ne soit installé, appelez SaveAsPDF sur une feuille ou un classeur HotXLS. HotXLS est un composant Excel VCL natif, et sa fonction d'exportation de feuille vers PDF convertit la plage utilisée de la feuille en un fichier PDF 1.4 autonome, en transposant les largeurs de colonnes Excel et le texte affiché des cellules sur des pages A4 avec une pagination multipage automatique. Aucun exemplaire d'Excel, aucun pilote d'imprimante ni aucune DLL externe ne participe au rendu

HotXLS traite le format PDF comme un format de présentation des données, proche de ses chemins d'exportation CSV, TSV et HTML, plutôt que comme un moteur de rendu précis au pixel près. L'exportation reproduit le contenu et la disposition tabulaire : les valeurs visibles dans la grille, les proportions des colonnes et les lignes de grille autour des cellules. Ce cadre est important car il définit des attentes claires dès le départ, le reste de cet article détaillant précisément les caractéristiques de ce rendu

Comment convertir Excel au format PDF dans Delphi sans Office ?

Le chemin le plus court consiste en un simple appel. TXLSWorksheet expose SaveAsPDF(FileName) et SaveAsPDF(Stream), et TXLSWorkbook expose les deux mêmes surcharges qui renvoient vers la feuille active. Chacune renvoie un entier (Integer), 1 en cas de réussite et -1 en cas d'échec, ce qui vous permet de gérer le résultat sans avoir à encapsuler l'appel dans une gestion d'exceptions personnalisée

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;

Lorsque vous appelez SaveAsPDF sur une feuille de calcul, HotXLS exports la plage UsedRange de cette feuille, à savoir le rectangle englobant toutes les cellules renseignées. La surcharge du classeur est une fonction de commodité qui délègue l'action à la feuille active, de sorte qu'un rapport sur plusieurs feuilles doit soit boucler sur les feuilles requises, soit sélectionner la feuille active avant l'appel. Il n'existe pas de mode global pour l'ensemble du classeur qui concaténerait tous les onglets en un seul passage : chaque appel effectue le rendu d'une seule feuille ou d'une seule plage

Comment HotXLS transforme-t-il une plage utilisée en pages PDF ?

HotXLS parcourt la plage utilisée cellule par cellule et la met en page sous forme de grille paginée. La géométrie des colonnes provient directement d'Excel : chaque largeur de colonne est convertie de l'unité de largeur Excel en points typographiques, avec un seuil minimal pour éviter qu'une colonne ne soit réduite à une simple ligne. Lorsque l'ensemble des colonnes dépasse la largeur utile de la page, HotXLS les réduit uniformément pour les adapter ; si elles tiennent déjà, la fonction conserve leur largeur naturelle plutôt que de les étirer sur la feuille

Les lignes s'enchaînent ensuite vers le bas de la page jusqu'à ce que la suivante dépasse la marge inférieure, point auquel HotXLS ouvre une nouvelle page et poursuit, de sorte qu'une feuille de mille lignes se pagine d'elle-même sans aucune gestion des sauts de page de votre part. Chaque cellule affiche son texte FormattedText, à savoir la chaîne générée après application du format de nombre, garantissant qu'une date s'affiche comme sur la feuille et qu'une cellule de devise conserve ses séparateurs de milliers et son symbole. Le texte qui dépasse de sa colonne est tronqué à la largeur de la cellule plutôt que de déborder sur la cellule voisine

Contrôler l'orientation, les marges et la taille de la police

Pour toute configuration sortant du cadre de la mise en page par défaut, pilotez directement l'exportateur. TXLSPDFExport est la classe sous-jacente aux fonctions de raccourci d'une ligne, et elle publie trois propriétés : Orientation (xlsPdfPortrait ou xlsPdfLandscape, portrait par défaut), Margin (en points, par défaut 40) et FontSize (en points, par défaut 9). Définissez-les avant d'appeler SaveAsPDF pour que l'ensemble du document les applique

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 accepte également une plage au lieu d'une feuille complète via SaveAsPDF(Range: IXLSRange; ...), ce qui s'avère utile pour exporter un bloc de synthèse à partir d'une feuille qui contient également des calculs temporaires. Cette surcharge de plage est celle que l'assistant de feuille de calcul utilise en interne, de sorte que la mise en page, la mise à l'échelle et la pagination se comportent de manière identique, que vous lui fournissiez une plage utilisée complète ou une sélection spécifique

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;

Pourquoi HotXLS n'intègre aucune police : le compromis Helvetica et WinAnsi

HotXLS écrit le texte avec la police Helvetica intégrée au PDF et le codage WinAnsiEncoding, un choix délibéré d'absence de dépendance qui comporte toutefois une réelle limite. Helvetica faisant partie des 14 polices standard déjà présentes dans tout lecteur de PDF conforme, l'exportateur n'intègre aucun programme de police : le fichier reste léger et s'ouvre partout, sans aucune licence à acquérir ni fichier à joindre. La contrepartie de ce choix réside dans le répertoire de caractères que la page peut afficher

WinAnsiEncoding couvre le jeu de caractères Windows-1252, assurant le rendu correct du texte latin, de la ponctuation courante et des accents ouest-européens habituels, et HotXLS fait correspondre quelques caractères typographiques, guillemets anglais, tirets demi-cadratin et cadratin, ainsi que le symbole de l'euro dans leurs emplacements CP1252. Les caractères hors de cette plage, comme les idéogrammes CJK, le cyrillique, le grec et l'arabe, sont remplacés par un point d'interrogation sur la page. Si vos feuilles contiennent du texte non latin, cet exportateur n'est pas adapté, et un moteur de rendu PDF gérant l'intégralité des styles est requis

Où s'arrête l'exportation de feuilles de calcul en PDF

HotXLS effectue le rendu du contenu et de la structure, et non du style visuel complet de la feuille. Les remplissages de cellules, les styles de bordure par contour, les polices et couleurs par cellule, les graphiques ainsi que les images intégrées ne sont pas gérés par l'exportateur ; vous obtenez une grille de texte avec des lignes de grille uniformes. C'est le même contrat que respectent les exportateurs HTML et RTF, parfaitement adapté pour un rapport ou un transfert de données où les chiffres portent le sens et non le graphisme

Lorsque l'objectif est d'obtenir un document stylisé et conforme à une charte graphique, la méthode habituelle consiste à rassembler d'abord les chiffres dans un modèle de feuille de calcul, un aspect traité en détail dans le flux de génération de rapports basé sur des modèles. Et comme rien de tout cela ne fait appel à COM ou à une instance active d'Excel, le pipeline s'inscrit dans le même modèle d'automatisation sans Office que HotXLS utilise partout : du pur Pascal, déployable sur un serveur sans tête (headless), sans interopérabilité logicielle à acquérir ou à surveiller

Le PDF autonome, au bit près

HotXLS construit manuellement la structure du fichier PDF et calcule sa table de références croisées à partir des décalages (offsets) d'octets exacts, ce qui explique pourquoi le fichier généré s'ouvre dans tous les lecteurs. Lors de la sérialisation de chaque objet, HotXLS enregistre le décalage initial de cet objet avant d'ajouter ses octets, puis fait progresser la position courante de la longueur écrite, pour que la table xref pointe précisément sur chaque objet et que startxref indique le début de cette table. Un lecteur qui trouve ces décalages décalés d'un seul octet rejette l'intégralité du fichier, ce qui fait du décalage calculé en interne le contrat fondamental de l'exportateur

Ce contrat entraîne une conséquence stricte qu'il convient de connaître. Le nœud Pages est écrit en premier sous la forme de l'objet 1, mais sa liste de pages enfants n'est connue qu'une fois toutes les pages émises. HotXLS le réserve donc comme espace réservé et y insère les pages enfants finales ainsi que leur nombre avant l'exécution du passage de décalage, jamais après. Une fois que les octets d'un objet sont mesurés pour le xref, ils sont figés : la modification d'un seul octet par la suite décalerait tous les décalages suivants et corromprait la table. C'est une discipline stricte qui permet de générer un fichier PDF 1.4 conforme aux normes sans aucune bibliothèque sous-jacente

Les méthodes SaveAsPDF et la classe TXLSPDFExport présentées ici sont fournies avec le composant HotXLS Delphi Excel, aux côtés des exportateurs CSV, HTML et RTF et de l'API complète des feuilles de calcul pour Delphi et C++Builder