Docs HotXLS

Méthode CreateReadOnlyView

Crée une vue légère en lecture seule sur un modèle de classeur XLS classique ou XLSX chargé

Syntaxe

function CreateReadOnlyView: IXLSReadOnlyWorkbookView;

CreateReadOnlyView est déclarée par le IXLSWorkbook classique dans lxHandle et par le IXLSXWorkbookOwner XLSX dans lxHandleX; l'interface de vue partagée, les options et les types d'instantanés sont déclarés dans lxStandard

État et durée de vie de la vue

La création d'une vue s'effectue en temps constant et ne parcourt ni les feuilles de calcul, ni les cellules, ni les styles, ni les noms, ni les dessins

Chaque vue dispose de son propre ActiveSheetIndexen base 1, de sorte que plusieurs vues peuvent sélectionner différentes feuilles de calcul sans modifier le ActiveSheetIndex classique ni ActiveIndex, IsSelectedet ActiveTab

La vue détient un bail de lecture tant qu'elle existe, et les mutations du classeur échouent immédiatement avec EXLSWorkbookWriteGuardUnavailable avant de modifier le modèle

Conservez les classeurs classiques via IXLSWorkbook et les classeurs XLSX via IXLSXWorkbookOwner lors de l'utilisation de vues ; l'interface propriétaire et chaque vue retiennent alors le même classeur à comptage de références et peuvent être libérées dans n'importe quel ordre

N'appelez pas Free sur un TXLSWorkbook ou un TXLSXWorkbook concret tant qu'une interface propriétaire ou une vue y fait encore référence

Instantanés de cellules

TryReadCell utilise des coordonnées de ligne et de colonne en base 1 sur la feuille active de la vue et renvoie False uniquement lorsqu'aucune cellule stockée n'existe à ces coordonnées

Une lecture de cellule absente ne crée pas de stockage et ne fait pas avancer la génération du classeur

TXLSReadOnlyCellSnapshot possède son nom de feuille, sa valeur, son texte de formule, ses informations de cache et d'évaluation, ses coordonnées, son type et son index de style et n'expose jamais un objet de classeur inscriptible

ChampSignification
SheetIndex / SheetNameIdentité de la feuille de calcul locale à la vue
Row / ColCoordonnées de cellule en base 1
StyleIndexIndex XF classique stocké ou index de format de cellule XLSX
KindClassification texte, nombre, date-heure, booléen, formule, erreur ou vide
ValueValeur scalaire stockée ou valeur du cache de formules sans recalcul
HasFormulaCache / FormulaCachePrésence, provenance, type de valeur et valeur en cache détenue du cache de formulesTXLSFormulaCacheState), value kind (TXLSFormulaCacheValueKind), and owned cached value
FormulaEvaluationA TXLSFormulaEvaluationInfo record whose TXLSFormulaEvaluationState Indique si l'évaluation n'était pas applicable, non demandée, calculée ou échouée, plus le code de résultat de l'évaluateur et la valeur de résultat détenue
FormulaVide par défaut et renseigné uniquement lorsque le texte de formule est explicitement activé

Stratégie de formule

Par défaut, les cellules à formule utilisent le cache stocké existant et ne calculent jamais, n'invoquent pas de fonction utilisateur, ne mettent pas à jour l'état de modification ni ne réécrivent un cache dans le classeur

Add xlsvIncludeFormulaText Ajoutez Options à TXLSReadOnlyViewOptions = set of TXLSReadOnlyViewOptionlorsque le texte de formule est requis ; le classique crée un décodeur privé de la vue à la demande, tandis que le XLSX copie sa chaîne de formule stockée, et aucun des deux chemins n'initialise ni ne modifie la calculatrice du classeur

Une formule sans cache chargé ou calculé signale HasFormulaCache=False et laisse Value à Unassigned

Ajoutez xlsvEvaluateFormulas pour évaluer les formules via une calculatrice privée de la vue, un état de récursion, un cache scalaire, un cache de matrices de tableaux et un cache de formules compilées XLSX ; la Value résultante et FormulaEvaluation.Value ne remplacent jamais le cache stocké du classeur ni les champs d'exécution des formules compilées

Les erreurs de tableur standard sont renvoyées comme valeurs d'erreur Variant avec xlfesCalculated, tandis que les échecs d'évaluation non pris en charge ou internes signalent xlfesFailed et conservent le cache stocké d'origine dans FormulaCache

Les lectures répétées via une même vue réutilisent son cache d'évaluation privé pour la génération du bail, tandis que différentes vues restent indépendantes et peuvent évaluer la même formule partagée simultanément

L'évaluation des formules externes XLSX ne lit que le cache externalLink local au fichier et ne déréférence jamais un enregistrement faible de classeur actif ni ne réalise d'E/S externes

Threads et performances

Utilisez une vue par thread de travail ; des vues séparées peuvent balayer différentes feuilles de calcul ou évaluer la même formule simultanément, tandis que les appelants ne doivent pas muter la feuille active ou les options d'une vue depuis un autre thread

Après la création, les lectures ordinaires de cellules n'entrent pas dans un moniteur ni une section critique car le bail empêche toute mutation concurrente du classeur

La validation de libération maintient chaque vue inactive en dessous de 64 KiB d'état fixe, cent vues inactives en dessous de 8 MiB, et la création de vue indépendante de la taille du classeur avec un seuil p95 d'une milliseconde sur un modèle d'un million de cellules

La suite de performances limite également l'effet d'une vue inactive sur les balayages de curseurs mono-thread existants à cinq pour cent et exige que huit vues balayant des feuilles indépendantes atteignent au moins cinq fois le débit d'une vue unique sur l'hôte de validation

Exemple

var
  Workbook: IXLSWorkbook;
  View: IXLSReadOnlyWorkbookView;
  Cell: TXLSReadOnlyCellSnapshot;
begin
  Workbook := TXLSWorkbook.Create;
  Workbook.Sheets.Add;
  Workbook.Sheets[1].Cells[1, 1].Value := 'ready';

  View := Workbook.CreateReadOnlyView;
  View.Options := [xlsvEvaluateFormulas];
  if View.TryReadCell(1, 1, Cell) then
    Memo1.Lines.Add(VarToStr(Cell.Value));
end;

Pour XLSX, conservez le classeur concret via son interface propriétaire avant de créer des vues

var
  Owner: IXLSXWorkbookOwner;
  Workbook: TXLSXWorkbook;
  View: IXLSReadOnlyWorkbookView;
begin
  Workbook := TXLSXWorkbook.Create;
  Owner := Workbook;
  Workbook.Sheets.Add('Data').Cells[1, 1].Value := 42;
  View := Owner.CreateReadOnlyView;
end;

Voir aussi