Ondersteuning voor Free Pascal en Lazarus
HotXLS ondersteunt Free Pascal 3.2.2 met Lazarus/LCL op Windows Win32 en Win64, inclusief de XLS/XLSX-werkmap-API's, formules, opmaak, direct streaming, de exportcomponenten TDataToXLS en TGridToXLS en de renderinghelpers
Native Linux- en macOS-werkmulkern
Zie compound file-opslag voor scoped directory-API's, expliciet native opslageigendom, tijdstempels en canonieke classic-identificatorsleutels
Het opt-in-profiel LX_PORTABLE_CORE stelt TXLSWorkbook en TXLSXWorkbook zonder LCL beschikbaar op Linux en macOS. Native Linux x64 en macOS ARM64 zijn gecompileerd en uitgevoerd met Free Pascal 3.3.1; de bronversiewacht vereist minstens 3.2.2, maar dat minimum is geen claim dat elke native combinatie van compiler en target is gevalideerd
Zet cthreads en cwstring vóór de HotXLS-units, voeg Lib toe aan de unit- en include-paden en definieer LX_PORTABLE_CORE voor de hele build. Een native consoletoepassing heeft Interfaces of een LCL-widgetset niet nodig
Kies een geïnstalleerde UTF-8-locale in de toepassingsomgeving wanneer je met Unicode-bestandspaden werkt. Een ongeldige of niet-UTF-8-locale kan de bestandsnaamconversie van de native RTL verlieslatend maken; de validatiehelper wijst die omgeving expliciet af in plaats van de locale te wijzigen of een codepagina te gokken
program NativeWorkbookExample;
{$mode delphiunicode}
uses
cthreads, cwstring, SysUtils, lxHandleX;
var
Workbook: TXLSXWorkbook;
begin
Workbook:= TXLSXWorkbook.Create;
try
Workbook.Sheets.Add('Data').Cells[1, 1].Value:= 5;
Workbook.Sheets[1].Cells[1, 2].Formula:= 'A1*2';
if Workbook.Recalculate<> 1 then
raise Exception.Create('Workbook calculation failed');
if Workbook.SaveAs('native.xlsx')<> 1 then
raise Exception.Create('Workbook save failed');
finally
Workbook.Free;
end;
end.
| Gebied | Native kerncontract |
|---|---|
| Werkmapbestanden | Maak, open, bewerk, bereken en sla classic BIFF8 XLS, XLSX, de ondersteunde uitgebreide XLSX-subset en de ondersteunde ODS-subset op via de publieke werkmap-API's, met de bestaande conversiecontroles en formaatgrenzen. Classic BIFF2-records met expliciet gedeclareerde CP1252- en CP932-encoderingen zijn ook gevalideerd via import en Unicode BIFF8-export |
| Unicode en namen | Werkmaptekst behoudt UTF-16-semantiek en bestandspaden gebruiken UTF-8 op native grenzen. Identiteit van gedefinieerde namen gebruikt vastgepinde Unicode 16-canonical-normalisatie en volledige BMP case folding, met behoud van symbolen, accenten, Turkse onderscheidingen en astral-hoofdletteridentiteit, onafhankelijk van de hostlocale; gekwalificeerde formules behouden hun exacte bladscope. Gewone werkbladtekstvolgorde gebruikt nog steeds de native RTL-localevergelijking |
| Infrastructuur | Native kritieke secties, volledig-breedte thread-identificatoren, echte workthreads, geregistreerde exclusieve tijdelijke bestanden, atomische vervanging van sibling-bestanden en willekeurige bytes van het besturingssysteem worden gebruikt zonder Windows-emulatie |
| Compressie en cryptografie | De gebundelde Pascal ZIP/compressie en AES blijven beschikbaar. Classic RC4- en RC4 CryptoAPI-XLS-bestanden kunnen native worden gelezen en geschreven met willekeurige bytes van het besturingssysteem. Native versleuteld OOXML lezen gebruikt de pure compound-file-lezer; het schrijven van een versleuteld OOXML-compound-bestand vereist Windows en geeft op native Unix een expliciete platformexception |
| REGEX-formulefuncties | De vastgepinde statische PCRE2 UTF-16-backend wordt op de native target gecompileerd met zijn C-compiler. Voer sh Lib/thirdparty/build-pcre2-unix.sh uit voordat je toepassingen compileert die de formuleengine meenemen; statische targets voor Linux x64 en macOS ARM64 worden geleverd |
| Windows-services | Klembordtoegang, Windows COM-activatie, ingebouwde ADO/WinHTTP-queryproviders, GDI-geometriecapture, HTML-decodering van achtergrondafbeeldingen en legacy PDF-export geven EXLSPlatformUnsupported op hun expliciete grenzen. Custom queryproviders en tekstproviders blijven bruikbaar |
| Legacy-componenten | Het classic-werkmapmodel en de BIFF-lezer/schrijver zijn beschikbaar in de native kern. Het LCL-runtimepakket, de dataset/grid-exportcomponenten en de visuele controls blijven Windows/LCL-componenten. Classic-klembordmethoden, HTML-export en legacy PDF-export geven op native Unix expliciete platformexceptions |
| Bytegeörienteerde tekstformules | Functies die de actieve ANSI/DBCS-codepagina van Windows vereisen, geven op native Unix een expliciet niet-ondersteund formuleresultaat (#NAME?) terug; er wordt geen impliciete locale- of codepaginasubstituut gekozen |
Open- en opslagmethoden behouden hun normale resultaatcode- en diagnostiekcontracten. Directe aanroepen op de platformgrens kunnen EXLSPlatformUnsupported geven; vang deze exception op wanneer je een Windows-only-service vanuit gedeelde applicatiecode aanroept
Reproduceerbare native validatie
Voer de validatiehelper uit op de native gast met een bestaande Free Pascal-toolchain, Python 3 en een native C-compiler. Kies een nieuwe of lege uitvoermap buiten de broncheckout op het gastbestandssysteem
python3 Tests/Lazarus/run_native_core.py --fpc /path/to/fpc --output /guest-local/hotxls-validation
python3 Tests/Lazarus/run_native_core.py --fpc /path/to/fpc --config /path/to/fpc.cfg --output /guest-local/hotxls-validation-2
De helper kopieert en hasht de broninvoer, normaliseert Pascal-unitbestandsnamen in de privé-buildkopie voor de hoofdlettergevoelige bestandsnaamzoektocht van FPC, bouwt PCRE2 lokaal en voert witness-tests uit voor kern, AES, compressie, REGEX, publieke werkmappen en integratie. Hij bewaart bronmanifests, compilerlogs, artifacts en fouten zonder de checkout te wijzigen, tools te installeren of compilerconfiguratie te bewerken. macOS ARM64-builds richten expliciet op macOS 11 of hoger
De integratiewitness-tests omvatten Unicode-paden, door Excel gemaakte XLSB-fixtures, formulecaches en herberekening, herhaald openen, sparse ODS-notities en beveiliging, afgewezen gecontroleerde conversie, annulering die bestemmingen van de aanroeper behoudt, invariante scoped opzoeking van namen, insluiting van echte werkthread-fouten en cryptografische willekeurige bytes
Native classic XLS-contracten
Gebruik lxHandle voor classic TXLSWorkbook en lxHandleX voor TXLSXWorkbook. Classic Recalculate geeft een foutaantal terug, dus nul betekent succes; zijn Calculate-methode geeft een formuleresultaat terug. Classic cel-Formula-toewijzingen vereisen een voorloop-=. Open- en opslagmethoden van de werkmap houden hun gevestigde succesresultaat 1 aan
De native classic-opslagimplementatie gebruikt echte compound-file-hiërarchie en streamidentiteiten, met behoud van geneste scopes, MiniFAT-data en uitgebreide DIFAT-ketens. Streampayloads worden gematerialiseerd en de writer wijst aggregatie-uitvoer buiten zijn ondersteunde signed 32-bit buffer-/sectorgrenzen af vóór het uitschrijven; dit is geen streamingopslagimplementatie voor meerdere gigabytes
Native compound-opslag biedt directe streamoperaties, enumeratie, metadata en kopieeroperaties. Transactionele rollback, region locking, verplaatsen en niet-ondersteunde exclusiemodi geven expliciete opslagfouten. Het emuleert geen Windows COM-, klembord- of GDI-services
Classic native opslag naar bestand serialiseert vóór het atomair vervangen van een geregistreerd sibling-bestand. Streamopslag door de aanroeper zet het volledige compound-bestand klaar vóór het kopiëren op de oorspronkelijke positie, met behoud van prefixes en annuleringsfouten vóór de commit. De laatste voortgangsmelding blijft niet-annuleerbaar. Directe compound-storage-helper-schrijfacties volgen hun gewone direct-write-contract in plaats van de publieke werkmapopslag-transactie
Gewone summary- en document-summary-properties gebruiken begrensde standaard OLE-propertysets met Unicodetekst en UTC-FILETIME-tijdstempels. Deze propertystreams blijven platte tekst wanneer classic werkmapgegevens zijn versleuteld, en de RC4 CryptoAPI-header legt die keuze expliciet vast. Gedefinieerde namen delen de vastgepinde canonieke identificatorsleutels van de XLSX-facade, terwijl ze hun oorspronkelijke spelling en expliciete werkbladscope behouden. Gecodeerde PNG/JPEG-drawinggegevens blijven voor het model beschikbaar; native bitmap/metafile-conversie vereist een aparte ondersteunde renderer en geeft anders EXLSPlatformUnsupported
Compileer Tests/Lazarus/HotXLSNativeClassicWorkbookSmoke.lpr met dezelfde native kernopties en geef daarna Tests/Fixtures/classic-native/native-classic.xls, een wegwerpbaar gast-lokaal uitvoerpad en Tests/Fixtures/classic-native/native-classic-encrypted.xls door. De controles dekken door Excel gemaakte caches, herberekening, exacte Unicodenamen, gewone en versleutelde roundtrips, onafhankelijk gedecodeerde property-tijdstempels, herhaald openen, meer dan 16 MB aan SST-data en behoud van uitvoer van de aanroeper
Legacy BIFF-bytecodering
TXLSWorkbook.SetCodePage kiest de expliciete bytecodering die SaveAs(..., xlExcel5) gebruikt, met CP1252 als standaard; het importeren van een BIFF2–BIFF5-bestand met een bruikbaar, niet-nul CODEPAGE-record kiest die pagina ook voor latere legacy-saves
Legacy-cellabels, formuletekstconstanten en arrays, gecachte formulierstrings, gedefinieerde namen, werkbladnamen en verwijzingen, fontnamen, getalnotaties, stijlnamen, koppen, voetteksten en gewone opmerkingtekst gebruiken die gedeclareerde pagina in plaats van de besturingssysteemlocale of UTF-8
Recordlengtes en werkbladstreamoffsets tellen gecodeerde bytes; de bestaande 255-byte-limieten voor legacy-labels en formuleliterals kappen alleen op een hele tekgrens af, dus een CP932-tweekarakter wordt nooit gesplitst; namen en metadata met een éénbyte-lengte wijzen gecodeerde tekst langer dan hun representeerbare lengte af in plaats van een ongeldige lengte weg te schrijven
Tekst die niet via de gekozen codepagina kan round-trippen geeft EConvertError voordat hij stilletjes een vervangings- of best-pass-teken kan worden; kies een pagina die de documenttekst representeert, of sla op als BIFF8 voor Unicode-strings
Formulecache-strings die over CONTINUE-records lopen worden als bytes samengesteld vóór decoding, zodat een recordgrens een tweekarakter kan splitsen zonder de gecachte waarde te beschadigen
Het wijzigen van de gekozen pagina herbouwt getypeerde legacy-formule- en gedefinieerde-naam-bytes uit hun Unicodemodel; BIFF8-saves blijven Unicode gebruiken en hun CODEPAGE-waarde op schijf blijft 1200
Geïmporteerde BIFF5-grafiekrecords behouden hun oorspronkelijke codepagina voor getypeerde reeks- en gekoppelde titelinspectie, ook na een codepaginabewerking van de werkmap of een grafiekkopie; opslaan naar een andere pagina transcodeert expliciet ondersteunde SeriesText, gewone gecachte labels en formulestrings, koppen, voetteksten en externbladnamen van de huidige werkmap in plaats van behouden bytes te herinterpreteren onder de nieuwe declaratie
Voortgezette grafiektekst, niet-gemodeleerde legacy-externblad-encoderingen en ondoorzichtige legacy-bytetekstrecords weigeren een codepagemigratie met EConvertError; niet-representeerbare ondersteunde tekst weigert ook, en de publieke werkmapopslag behoudt de bestemming van de aanroeper vóór de commit; dit tekstcontract belooft geen volledige conversie van native grafiekuiterlijk
BIFF5 custom stijlnamen beginnen direct na de éénbyte gecodeerde lengte, terwijl BIFF5 SeriesText een identificator en éénbyte gecodeerde lengte heeft zonder Unicode-vlag; BIFF8 SeriesText voegt zijn Unicode-vlag toe, en het converteren van ondersteunde grafiektekst werkt dat record en de grafiek-BOF-versie samen bij
Niet-lege BIFF5-grafiekkoppen en -voetteksten gebruiken een éénbyte gecodeerde lengte met een maximum van 255 bytes; gecachte LABEL- en STRING-records gebruiken tweebyte-lengtes, terwijl BIFF8-koppen en -voetteksten een tweebyte UTF-16-lengte plus hun Unicode-vlag gebruiken; migratie controleert de feitelijke layout van elk record en wijst een te grote legacy-kop of -voettekst met ERangeError af vóór het toevoegen
HotXLS interpreteert legacy-bytes met hun gedeclareerde pagina op Windows, Linux en macOS; de geïnstalleerde Excel 16.0 build 20430 toonde onafhankelijk een beperking aan de ontvangende kant: hij interpreteerde legacy-bytes met zijn lokale Windows CP936, ook nadat uitsluitend het CODEPAGE-record van een native bestand naar CP1252 of CP932 was gewijzigd, dus correct gedeclareerde bytes garanderen geen matchende tekst in die ontvangende configuratie
Behoud de feitelijke encoderingsdeclaratie van het document en test de ontvangende toepassing wanneer je BIFF5 distribueert over verschillende localeconfiguraties; Unicode BIFF8 vermijdt deze specifieke legacy-byte-interoperabiliteitsgrens
Deze bytecoderingscorrectie behoudt de bestaande recordgroottelimiet voor gewone BIFF5-opmerkingen; ze voegt geen velden voor auteur, rich-text-opmaak of shape-geometrie toe aan het legacy-record
Broncodebewerking van VBA-modules gebruikt de gedeclareerde byte-codepagina van het project en behoudt het binaire prefix vóór de bronoffset, inclusief ingebedde null-bytes; dit wijzigt opgeslagen brontekst en voert geen macro's uit
BIFF8 gecomprimeerde Unicode met fHighByte = 0 mapt elke byte direct naar een UTF-16-code-eenheid U+0000 tot en met U+00FF; het is niet CP1252, UTF-8 of de legacy-codepagina van het bestand, zelfs wanneer een niet-standaard CODEPAGE-record voorkomt in een verder BIFF8-bestand
Native tekstformules behouden UTF-16-lengtes en -posities, inclusief surrogate-paarcode-eenheden; Unicode LOWER, UPPER, SEARCH, hoofdletterongevoelige TEXTBEFORE/TEXTAFTER-scheidingstekens, databaseveldkoppen, hoofdletterongevoelige criteria en dynamische textsleutels gebruiken de Unicode-characterdata van de native compiler in plaats van de ASCII-only-casingfuncties van de host-C-locale, terwijl gewone werkbladvolgorde zijn bestaande localevergelijking behoudt
Native LET/LAMBDA-matching van lokale namen en classificatie van lokale arrayopslag gebruiken dezelfde Unicode-bewuste casing, zodat hoofdlettertegenhangers de correcte vastgelegde binding herleiden en zijn arrayvorm behouden; dit verandert het vastgepinde publieke identiteitscontract voor gedefinieerde namen niet
Classic hoofdletterongevoelig FindText en ReplaceText behouden Unicode-tekstmatching voor letterlijke en Excel-wildcard-zoekopdrachten op native FPC; MatchCase onderscheidt nog steeds hoofdletters, letterlijke vervanging behoudt zijn vervang-alle-gedrag, wildcard-vervanging behoudt zijn bestaande linkermeest-span-gedrag, en formulecellen blijven uitgesloten
Compileer Tests/Lazarus/HotXLSNativeLegacyEncodingSmoke.lpr met de native kernopties en geef een wegwerpbare uitvoermap door, gevolgd door Tests/Fixtures/legacy-encoding/native-biff5-cp936-chart.xls; de witness controleert gedeclareerde CP1252-, CP932- en CP936-bytes onafhankelijk, elke werkbladoffset, codepaginawijzigingen, tweekarakter-vervolggrenzen, gecomprimeerde BIFF8-import, formuleberekening, native-gemaakte grafiektekst en behoud van de bestemming bij mislukte saves
Volledige installer
De volledige installer detecteert Lazarus en ondersteunt installatie zonder RAD Studio. Kies op de pagina IDE Integration voor Lazarus / Free Pascal om het runtimepakket, de compatibiliteitsunits en de buildscripts te installeren; deze optie staat standaard aan wanneer Lazarus de enige gedetecteerde IDE is
Kies op de pagina Post-install Compilation het Free Pascal-runtimepakket voor Win32 of Win64. Een target is beschikbaar zodra zijn compiler, RTL, LCL- en LazUtils-units zijn gedetecteerd; is een target niet beschikbaar, dan kun je de pakketbronnen alsnog installeren en ze later compileren
Het pakket bevat alleen runtimecode en wordt in Lazarus als projectafhankelijkheid toegevoegd. De installer compileert de VCL-demo's niet met Free Pascal
Bouwen en testen
Open Lib/FPC/HotXLSLaz.lpk in Lazarus en compileer het runtimepakket, of voer deze opdrachten uit vanuit de HotXLS-map
build-FPC-Lib.cmd Win64
Tests\Lazarus\Run-HotXLSLazarusSmoke.cmd Win64
build-FPC-Lib.cmd Win32
Tests\Lazarus\Run-HotXLSLazarusSmoke.cmd Win32
Stel LAZARUS_DIR in om een installatie te kiezen; FPC_EXE en LAZBUILD_EXE kunnen indien nodig expliciete uitvoerbare bestanden van de compiler en de pakketbuilder kiezen
De gekozen installatie moet FPC en gecompileerde LCL/LazUtils-units voor de doelarchitectuur bevatten; uitvoer en pakketbuilderconfiguratie worden in afzonderlijke architectuurmappen bewaard
Toepassing instellen
Voeg Lib en Lib/FPC toe aan het unit-zoekpad en Lib aan het include-zoekpad, of voeg het runtimepakket toe als afhankelijkheid van het Lazarus-project
Zet Interfaces vóór de HotXLS-units in de uses-lijst van de toepassing, ook bij consoletoepassingen; dit initialiseert de LCL-widgetset en de UTF-8-conversie op de RTL/LCL-grenzen
program WorkbookExample;
{$mode delphiunicode}
uses
Interfaces, SysUtils, lxHandleX;
var
Workbook: TXLSXWorkbook;
begin
Workbook:= TXLSXWorkbook.Create;
try
Workbook.AddSheet('Data');
Workbook.Sheets[1].Cells[1, 1].Value:= 'Hello';
if Workbook.SaveAs('example.xlsx')<> 1 then
raise Exception.Create('Workbook save failed');
finally
Workbook.Free;
end;
end.
De HotXLS-bronunits kiezen intern voor Delphi Unicode-semantiek, zodat tekenreeksen, tekens en formuletekst UTF-16-gedrag behouden; toepassingscode kan zijn eigen gewenste Pascal-modus gebruiken
Compatibiliteitsdetails
- Het runtimepakket vereist Windows en LCL;
TDataToXLSexporteert LCL-datasets enTGridToXLSexporteert eenTDBGrid, met of zonder expliciete kolommen, terwijl Linux, macOS, VCL-demoformulieren, de VCL-werkmapviewer en de DevExpress-gridadapter buiten dit pakket vallen - ZIP- en compressiestreams gebruiken de meegeleverde Pascal-backend en vereisen geen aparte zlib-DLL
- AES gebruikt voor beide architecturen een Pascal-backend, inclusief met wachtwoord beveiligde XLSX-bestanden
- PNG behoudt alfa, EMF gebruikt het opnemen en afspelen van Windows-metafiles, en multipage-TIFF gebruikt de Windows GDI+-runtime
- Direct tekstlezen accepteert UTF-8 en BOM-gemarkeerde UTF-16/UTF-32, verwerkt gestreamde invoer en laat het eigendom van de stream bij de aanroeper
- Initialiseer
TXlsCsvImportOptionsmetTXlsCsvImportOptions.Defaultvoordat u afzonderlijke velden wijzigt - FPC-rapportexpressies en importpatronen gebruiken de Unicode-syntaxis van
URegExprin plaats van de PCRE-backend van Delphi. Lege invoer wordt beantwoord zoalsTRegExdie beantwoordt: een patroon dat een lege tekenreeks accepteert, zoals^$of.*, matcht deze terwijl[0-9]+dat niet doet, en het vervangen van een lege tekenreeks levert alleen de vervangingstekst op als het patroon die accepteert; niet-ondersteunde en lege patronen genererenERegularExpressionError, dat rapportexpressies alsREPORT_EXPRESSION_INVALID_REGEXtonen