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
| Champ | Signification |
|---|---|
SheetIndex / SheetName | Identité de la feuille de calcul locale à la vue |
Row / Col | Coordonnées de cellule en base 1 |
StyleIndex | Index XF classique stocké ou index de format de cellule XLSX |
Kind | Classification texte, nombre, date-heure, booléen, formule, erreur ou vide |
Value | Valeur scalaire stockée ou valeur du cache de formules sans recalcul |
HasFormulaCache / FormulaCache | Présence, provenance, type de valeur et valeur en cache détenue du cache de formulesTXLSFormulaCacheState), value kind (TXLSFormulaCacheValueKind), and owned cached value |
FormulaEvaluation | A 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 |
Formula | Vide 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;