Método CreateReadOnlyView
Crea una vista de solo lectura ligera sobre un modelo de libro clásico o XLSX cargado
Sintaxis
function CreateReadOnlyView: IXLSReadOnlyWorkbookView;
CreateReadOnlyView lo declaran el IXLSWorkbook clásico en lxHandle y el IXLSXWorkbookOwner de XLSX en lxHandleX; la interfaz de vista compartida, las opciones y los tipos de instantánea se declaran en lxStandard
Estado y tiempo de vida de la vista
Crear una vista lleva tiempo constante y no recorre hojas de cálculo, celdas, estilos, nombres ni dibujos
Cada vista tiene su propio ActiveSheetIndexbasado en uno, de modo que varias vistas pueden seleccionar hojas de cálculo distintas sin cambiar el ActiveSheetIndex clásico ni ActiveIndex, IsSelectedy ActiveTab
La vista mantiene una concesión de lectura mientras existe, y las mutaciones del libro fallan de forma inmediata con EXLSWorkbookWriteGuardUnavailable antes de cambiar el modelo
Mantenga los libros clásicos mediante IXLSWorkbook y los libros XLSX mediante IXLSXWorkbookOwner al usar vistas; la interfaz propietaria y cada vista retienen entonces el mismo libro con recuento de referencias y pueden liberarse en cualquier orden
No llame a Free sobre un TXLSWorkbook o TXLSXWorkbook concreto mientras una interfaz propietaria o una vista siga haciendo referencia a él
Instantáneas de celdas
TryReadCell usa coordenadas de fila y columna basadas en uno en la hoja activa de la vista y devuelve False solo cuando no existe ninguna celda almacenada en esa coordenada
Una lectura de celda ausente no crea almacenamiento ni hace avanzar la generación del libro
TXLSReadOnlyCellSnapshot es propietario de su nombre de hoja, valor, texto de fórmula, información de caché y evaluación, coordenadas, clase e índice de estilo, y nunca expone un objeto de libro modificable
| Campo | Significado |
|---|---|
SheetIndex / SheetName | Identidad de la hoja de cálculo en el ámbito de la vista |
Row / Col | Coordenadas de celda basadas en uno |
StyleIndex | Índice XF clásico almacenado o índice de formato de celda XLSX |
Kind | Clasificación como texto, número, fecha y hora, booleano, fórmula, error o blanco |
Value | Valor escalar almacenado o valor de caché de fórmula sin recálculo |
HasFormulaCache / FormulaCache | Presencia, procedencia, clase de valor y valor en caché de propiedad del llamador de la caché de fórmulasTXLSFormulaCacheState), value kind (TXLSFormulaCacheValueKind), and owned cached value |
FormulaEvaluation | A TXLSFormulaEvaluationInfo record whose TXLSFormulaEvaluationState Si la evaluación no era aplicable, no se solicitó, se calculó o falló, además del código de resultado del evaluador y el valor de resultado de propiedad del llamador |
Formula | Vacío de forma predeterminada y rellenado solo cuando el texto de fórmula está habilitado explícitamente |
Directiva de fórmulas
De forma predeterminada, las celdas de fórmula usan la caché almacenada existente y nunca calculan, invocan una función de usuario, actualizan el estado de modificación ni escriben una caché de vuelta al libro
Add xlsvIncludeFormulaText Añada Options a TXLSReadOnlyViewOptions = set of TXLSReadOnlyViewOptioncuando se necesite el texto de fórmula; el modo clásico crea un descodificador privado de la vista a demanda, mientras que XLSX copia su cadena de fórmula almacenada, y ninguna de las dos rutas inicializa ni modifica la calculadora del libro
Una fórmula sin caché cargada ni calculada informa HasFormulaCache=False y deja Value como Unassigned
Añada xlsvEvaluateFormulas para evaluar fórmulas mediante una calculadora privada de la vista, estado de recursión, caché escalar, caché de matrices y caché de fórmulas compiladas de XLSX; el Value resultante y FormulaEvaluation.Value nunca reemplazan la caché almacenada del libro ni los campos en tiempo de ejecución de fórmulas compiladas
Los errores estándar de hoja de cálculo se devuelven como valores de error Variant con xlfesCalculated, mientras que los fallos de evaluación no compatibles o internos informan xlfesFailed y retienen la caché almacenada original en FormulaCache
Las lecturas repetidas a través de una misma vista reutilizan su caché de evaluación privada para la generación de la concesión, mientras que las vistas distintas permanecen independientes y pueden evaluar la misma fórmula compartida de forma simultánea
La evaluación de fórmulas externas de XLSX lee solo la caché de externalLink local del archivo y nunca desreferencia un registro débil de libro activo ni realiza E/S externa
Subprocesos y rendimiento
Use una vista por subproceso de trabajo; las vistas separadas pueden examinar hojas de cálculo distintas o evaluar la misma fórmula simultáneamente, mientras que los llamadores no deben mutar la hoja activa ni las opciones de una vista desde otro subproceso
Después de la creación, las lecturas ordinarias de celdas no entran en un monitor ni en una sección crítica, porque la concesión impide la mutación simultánea del libro
La validación de la versión mantiene cada vista inactiva por debajo de 64 KiB de estado fijo, cien vistas inactivas por debajo de 8 MiB, y la creación de vistas independiente del tamaño del libro, con un umbral p95 de un milisegundo en un modelo de un millón de celdas
La suite de rendimiento también limita al cinco por ciento el efecto de una vista inactiva sobre los exámenes de cursor existentes de un solo subproceso, y exige que ocho vistas que examinan hojas de cálculo independientes alcancen al menos cinco veces el rendimiento de una sola vista en el host de validación
Ejemplo
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;Para XLSX, conserve el libro concreto mediante su interfaz propietaria antes de crear vistas
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;