За експортиране на Excel работен лист в PDF от Delphi или C++Builder без инсталиран Office, извикайте метода SaveAsPDF на работен лист или работна книга на HotXLS. HotXLS е нативен VCL Excel компонент и неговата функция за експорт към PDF рендира използвания диапазон (UsedRange) на листа в самостоятелен PDF 1.4 файл, напасвайки ширината на колоните на Excel и показания текст в клетките към страници формат A4 с автоматично многоетапно странициране. В процеса не участва инстанция на Excel, драйвер за принтер или външна DLL библиотека
HotXLS разглежда PDF като формат за представяне на данни, сроден на неговите пътища за експортиране към CSV, TSV и HTML, а не като визуализиращ механизъм с точност до пиксел. Експортирането пресъздава табличното съдържание и оформление: стойностите в таблицата, пропорциите на колоните и контурните линии на клетките. Това разграничение е важно, тъй като поставя реални очаквания от самото начало, а останалата част от тази статия описва точно границите на функционалността
Как се конвертира Excel в PDF в Delphi без Office?
Най-краткият път е едно извикване. Класът TXLSWorksheet предлага методите SaveAsPDF(FileName) и SaveAsPDF(Stream), а TXLSWorkbook предлага същите две претоварвания (overloads), които пренасочват извикването към активния лист. Всеки от тях връща Integer – стойност 1 при успех и -1 при грешка, което ви позволява да управлявате логиката въз основа на резултата, без да обвивате извикването в собствени блокове за изключения
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;
Как HotXLS превръща използвания диапазон в PDF страници?
HotXLS обхожда използвания диапазон клетка по клетка и го оформя като страницирана таблица. Геометрията на колоните идва директно от Excel: ширината на всяка колона се преобразува от мерните единици на Excel в типографски пунктове (points) с минимален праг, така че никоя колона да не се свие напълно. Когато общата ширина на колоните надвишава използваемата страница, HotXLS ги мащабира пропорционално надолу, за да се поберат; когато те се побират нормално, компонентът ги оставя в техния естествен размер, вместо да ги разтяга по листа
След това редовете се разполагат надолу по страницата, докато следващият ред не пресече долното поле, в който момент HotXLS отваря нова страница и продължава. Така лист с хиляда реда се страницира напълно самостоятелно, без необходимост от управление на прекъсванията на страниците от ваша страна. Всяка клетка отпечатва своя FormattedText – форматирания низ, получен след прилагане на стила за число, така че дадена дата или валутна клетка се показва точно по същия начин, по който изглежда в таблицата. Текст, който надвишава ширината на колоната, се изрязва до границите на клетката, вместо да прелива в съседната
Управление на ориентацията, полетата и размера на шрифта
За всякакви настройки извън стандартното оформление управлявайте директно модула за експортиране. Класът TXLSPDFExport стои зад едноредовите помощни функции и предлага три свойства: Orientation (xlsPdfPortrait или xlsPdfLandscape, портретна по подразбиране), Margin (в пунктове, по подразбиране 40) и FontSize (в пунктове, по подразбиране 9). Задайте техните стойности преди извикването на SaveAsPDF и те ще се приложат към целия документ
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 приема също така диапазон вместо цял лист чрез метода SaveAsPDF(Range: IXLSRange; ...), което ви позволява да експортирате само обобщаващ блок от лист, съдържащ и странични изчисления. Това претоварване с диапазон е същата функция, която се използва вътрешно от методите на работния лист, така че оформлението, мащабирането и страницирането работят по един и същ начин, независимо дали подавате целия използван диапазон или избрана селекция
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 не вгражда шрифтове: балансът между Helvetica и WinAnsi
HotXLS записва текста с вградения в PDF Helvetica и кодирането WinAnsiEncoding – съзнателен избор без външни зависимости, но с едно ограничение. Тъй като Helvetica е един от стандартните 14 шрифта, с които разполага всеки съвместим четец за PDF, модулът не вгражда файлове за шрифтове: генерираният файл остава малък и се отваря навсякъде, без нужда от лицензиране или допълнително разпространение. Цената на този избор е ограничението на символите, които страницата може да визуализира
Кодирането WinAnsiEncoding обхваща символите по Windows-1252, така че латиницата, стандартната пунктуация и обичайните западногермански ударения се рендират коректно, като HotXLS съпоставя типографските знаци, заоблените кавички, тиретата (en/em) и знака за евро в техните позиции по CP1252. Символи извън този обхват, като кирилица, гръцки, арабски или азиатски символи, се заменят с въпросителен знак на страницата. Ако таблиците ви съдържат нелатински текст, този модул за експортиране не е подходящ за вашите нужди и ще ви бъде необходим пълен рендиращ модул за PDF
Къде спира експортирането на работни листове към PDF
HotXLS рендира съдържанието и структурата, а не пълния визуален стил на листа. Цветът за запълване на клетките, специфичните стилове на рамките, индивидуалните шрифтове и цветове на клетките, диаграмите и вградените изображения са извън възможностите за изчертаване на този модул; резултатът, който получавате, е текстова мрежа с еднакви контурни линии. Това е същият принцип, който спазват модулите за експорт към HTML и RTF, и е напълно достатъчен за отчети или трансфер на данни, при които числата носят смисъла, а не визуалната тема
Когато целта е стилизиран документ в корпоративен стил, обичайният модел е първо да съберете числата в шаблон на електронна таблица, процес, разгледан подробно в статията за генериране на отчети с шаблони. И тъй като нищо от това не изисква COM или работеща инстанция на Excel, целият процес следва същия модел на автоматизация без инсталиран Office, който HotXLS използва навсякъде: чист Pascal код, пригоден за внедряване на фонови сървъри, без нужда от лицензи или сложна интеграция
Самостоятелният PDF файл байт по байт
HotXLS изгражда ръчно структурата на PDF файла и изчислява таблицата с препратки (cross-reference table) от точните байтови отмествания, поради което генерираният файл се отваря във всеки четец. При сериализирането на всеки обект HotXLS записва неговото отместване, след което добавя байтовете му и увеличава текущата позиция, така че таблицата xref съвпада точно с всеки обект, а startxref указва къде започва самата таблица. Всеки четец, който установи разминаване в тези отмествания дори с един байт, отхвърля целия файл, което прави правилното изчисляване на отместванията критично за процеса на експортиране
Този механизъм има едно строго следствие, което трябва да се знае. Възелът с описанията на страниците (Pages node) се записва първо като обект 1, но неговият списък с подстраници не е известен, докато не се генерират всички страници, поради което HotXLS го запазва като временен маркер (placeholder) и попълва финалните страници и брой точно преди етапа на изчисляване на отместванията. След като байтовете на даден обект бъдат измерени за таблицата xref, те се фиксират: промяната на един-единствен байт след това би изместила всички следващи отмествания и би повредила таблицата. Това е дисциплина на имплементация, гарантираща съвместим със стандартите PDF 1.4 файл без използване на външни библиотеки
Методите SaveAsPDF и класът TXLSPDFExport, показани тук, се доставят с HotXLS Delphi Excel Component, заедно с модулите за експортиране към CSV, HTML и RTF и пълния приложен програмен интерфейс (API) за Delphi и C++Builder