Dokumentace HotXLS

Metody SaveSemanticSnapshot a ComputeSemanticHash

Streamuje verzovanou kanonickou reprezentaci sémantiky sešitu nebo vypočte SHA-256 přesně těchto bajtů

Syntaxe

procedure SaveSemanticSnapshot(AStream: TStream); overload;
procedure SaveSemanticSnapshot(AStream: TStream;
  AProfile: TXLSSemanticSnapshotProfile;
  AOptions: TXLSSemanticSnapshotOptions); overload;

function ComputeSemanticHash: WideString; overload;
function ComputeSemanticHash(
  AProfile: TXLSSemanticSnapshotProfile;
  AOptions: TXLSSemanticSnapshotOptions): WideString; overload;

Metody zpřístupňují klasické IXLSWorkbook a TXLSWorkbook v lxHandle a TXLSXWorkbook v lxHandleX

Typy profilu a možností jsou deklarovány v lxSemanticSnapshot a jsou viditelné přes obě jednotky sešitu

Profily

HodnotaVýznam
xlsspContentKanonický obsah sešitu vhodný pro běžné kontroly sémantické identity
xlsspSecurityCompleteObsah plus podporovaný neprůhledný stav zabezpečení a zachování, z běžné identity obsahu záměrně vyloučený

Možnosti

HodnotaZahrnutý stav
xlssoIncludeViewerStateVýběry, stav aktivního zobrazení a další podporovaný stav orientovaný na prohlížeč
xlssoIncludeVolatileMetadataPodporovaná časová razítka, metadata producenta a další záměrně proměnlivá pole
xlssoIncludeFormulaCachedResultsUložené výsledky vzorců a podporované mezipaměti externích odkazů bez přepočtu a externího vstupně-výstupních operací

Přetížení bez parametrů používají xlsspContent s prázdnou sadou možností

Pravidla streamování a identity

Souběžnost a chyby

Obě metody po celou dobu průchodu drží pronájem čtení sešitu

Souběžná veřejná mutace selže s EXLSWorkbookWriteGuardUnavailable dříve, než se změní stav sešitu, zatímco zjištěná změna generace nebo nepodporovaná nejednoznačná sémantická struktura vyvolá EXLSSemanticSnapshot

Příklad pro Delphi

var
  Snapshot: TFileStream;
  Hash: WideString;
begin
  Snapshot:= TFileStream.Create('workbook.semantic', fmCreate);
  try
    Workbook.SaveSemanticSnapshot(Snapshot,
      xlsspSecurityComplete,
      [xlssoIncludeFormulaCachedResults]);
  finally
    Snapshot.Free;
  end;

  Hash:= Workbook.ComputeSemanticHash;

Příklad pro C++Builder

TFileStream *snapshot = new TFileStream(
  L"workbook.semantic", fmCreate);
try
{
  workbook->SaveSemanticSnapshot(snapshot);
}
__finally
{
  delete snapshot;
}

WideString hash = workbook->ComputeSemanticHash();

Reference modelu snapshotu

Snapshot engine není vázaný na objekty sešitu: vše níže je deklarováno v lxSemanticSnapshot a metody sešitu jsou tenké obálky nad týmitž globálními vstupními body

Rozhraní rozšíření

Implementujte IXLSSemanticWorkbookSource, chcete-li emitovat či hashovat snapshot libovolného zdroje, a volitelně IXLSSemanticFormulaResolver, aby emitované vzorce nesly rozřešené informace o externích referencích a definovaných názvech

IXLSSemanticWorkbookSource = interface
  procedure WriteCommon(AWriter: TXLSSemanticCanonicalWriter);
end;

IXLSSemanticFormulaResolver = interface
  function ResolveFormulaReference(AExternID: Integer;
    out AInfo: TXLSSemanticFormulaReferenceInfo): Boolean;
  function ResolveFormulaName(ANameID, AExternID: Integer;
    out AInfo: TXLSSemanticFormulaNameInfo): Boolean;
end;

TXLSSemanticFormulaReferenceInfo = record
  LinkKind: TXLSSemanticFormulaLinkKind;
  BookName: WideString;
  FirstSheetName: WideString;
  LastSheetName: WideString;
end;

TXLSSemanticFormulaNameInfo = record
  NameKind: TXLSSemanticFormulaNameKind;
  LinkKind: TXLSSemanticFormulaLinkKind;
  Name: WideString;
  ScopeSheetName: WideString;
  BookName: WideString;
end;

Uvnitř WriteCommon je writer neprůhledný handle: nevolejte jeho primitivní metody — BeginContainer / EndContainer orámují tagovaný kontejner a WriteNull, WriteBoolean, WriteUInt32, WriteUInt64, WriteInt32, WriteInt64, WriteBinary64, WriteWideString a WriteBytes kódují po jedné kanonické primitivě, přičemž Finish zapečetí stream a Finished hlásí dokončení — předávejte jej zpět do emisních helperů níže, aby každý producent emitoval identické bajty

Globální vstupní body

procedure XLSSaveSemanticSnapshot(AStream: TStream;
  const ASource: IXLSSemanticWorkbookSource;
  AProfile: TXLSSemanticSnapshotProfile;
  AOptions: TXLSSemanticSnapshotOptions);
function XLSComputeSemanticHash(
  const ASource: IXLSSemanticWorkbookSource;
  AProfile: TXLSSemanticSnapshotProfile;
  AOptions: TXLSSemanticSnapshotOptions): WideString;
procedure XLSInitializeSemanticCellStyle(out AStyle: TXLSSemanticCellStyle);
function XLSBuiltinSemanticNumberFormat(AId: Word): WideString;

XLSInitializeSemanticCellStyle vyplní záznam stylu kanonickými defaults před úpravou jednotlivých polí; XLSBuiltinSemanticNumberFormat namapuje id vestavěného formátu čísel (pod 164) na jeho formátovací řetězec, který konzumenti potřebují k interpretaci emitovaných stylů a dekódovaných streamů

Slovník modelu

GroupTypes
ListTXLSSemanticSheetKind (worksheet, macro, chart, VBA, unknown), TXLSSemanticSheetVisibility (visible, hidden, very hidden), TXLSSemanticDefinedNameScope (sešit nebo list), TXLSSemanticRange / TXLSSemanticRanges (obdélníkové oblasti používané sloučeními, podmíněnými formáty a tabulkami)
BuňkaTXLSSemanticCellKind (blank, number, datetime, text, boolean, error, formula)
StylTXLSSemanticCellStyle (kompletní kanonický styl buňky), TXLSSemanticColor s TXLSSemanticColorKind (none, automatic, system, ARGB, theme, indexed) a tintem, TXLSSemanticBorderEdge / TXLSSemanticBorderStyle, TXLSSemanticFillPattern, TXLSSemanticGradientKind / TXLSSemanticGradientStop / TXLSSemanticGradientStops, TXLSSemanticUnderline, TXLSSemanticFontVerticalAlign
VzorecTXLSSemanticFormulaEncoding (naparsovaný strom versus neprůhledný text), TXLSSemanticFormulaArrayKind (none, CSE, dynamic), TXLSSemanticFormulaNodeKind, TXLSSemanticFormulaRangeKind, TXLSSemanticFormulaLinkKind (stejný list, interní, externí, add-in, DDE, OLE, other), TXLSSemanticFormulaNameKind
Kresby a grafyTXLSSemanticDrawingKind (image, textbox, chart, group, form control), TXLSSemanticDrawingAnchorMode (move and size, move only, absolute), TXLSSemanticImageFormat, TXLSSemanticChartFamily

Emisní helpery

Tyto globální funkce zapisují jeden fragment modelu do writeru předaného do WriteCommon: XLSWriteSemanticLiteralCell, XLSWriteSemanticCellStyle, XLSWriteSemanticColor, XLSWriteSemanticRanges, XLSWriteSemanticMerge, XLSWriteSemanticAxisEntry, XLSWriteSemanticFormulaTree, XLSWriteSemanticFormulaDefinition a XLSWriteSemanticFormulaCell (buňky se vzorci nesou hranice pole a volitelný cacheovaný výsledek). XLSWriteSemanticWorkbookCommon otevře kontejner sešitu a zavolá WriteCommon, kterou vlastní zdroje obvykle volají jako první

Viz také

Rozhraní IXLSWorkbook · Třída TXLSXWorkbook · Metoda CreateReadOnlyView