Método CreateReadOnlyView
Crea una vista de solo lectura ligera sobre un modelo de libro de trabajo 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 toma 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 de trabajo fallan de forma inmediata con EXLSWorkbookWriteGuardUnavailable antes de cambiar el modelo
Mantenga los libros de trabajo clásicos mediante IXLSWorkbook y los libros de trabajo XLSX mediante IXLSXWorkbookOwner al usar vistas; la interfaz propietaria y cada vista retienen entonces el mismo libro de trabajo con recuento de referencias y pueden liberarse en cualquier orden
No llame a Free en 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 de trabajo
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 de trabajo modificable
| Campo | Significado |
|---|---|
SheetIndex / SheetName | Identidad de hoja de cálculo local 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 de 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, tipo 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 manera predeterminada y rellenado solo cuando el texto de fórmula está habilitado explícitamente |
Política de fórmulas
De manera 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 de trabajo
Add xlsvIncludeFormulaText Agregue Options a TXLSReadOnlyViewOptions = set of TXLSReadOnlyViewOptioncuando se requiera el texto de fórmula; el modo clásico crea un decodificador privado de la vista a petición, mientras que XLSX copia su cadena de fórmula almacenada, y ninguna de las dos rutas inicializa ni modifica la calculadora del libro de trabajo
Una fórmula sin caché cargada ni calculada reporta HasFormulaCache=False y deja Value como Unassigned
Agregue 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 de trabajo 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 las fallas de evaluación no admitidas o internas reportan 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 diferentes permanecen independientes y pueden evaluar la misma fórmula compartida a la vez
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 de trabajo activo ni realiza E/S externa
Subprocesos y rendimiento
Use una vista por subproceso de trabajo; las vistas separadas pueden rastrear 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 de trabajo
La validación de 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 de trabajo, con una puerta p95 de un milisegundo en un modelo de un millón de celdas
El conjunto de pruebas de rendimiento también limita al cinco por ciento el efecto de una vista inactiva sobre los rastreos de cursor existentes de un solo subproceso, y requiere que ocho vistas que rastrean 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, retenga el libro de trabajo 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;