HotXLS-documentatie

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.
GebiedNative kerncontract
WerkmapbestandenMaak, 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 namenWerkmaptekst 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
InfrastructuurNative 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 cryptografieDe 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-formulefunctiesDe 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-servicesKlembordtoegang, 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-componentenHet 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 tekstformulesFuncties 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