Documentación HotXLS

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

CampoSignificado
SheetIndex / SheetNameIdentidad de la hoja de cálculo en el ámbito de la vista
Row / ColCoordenadas de celda basadas en uno
StyleIndexÍndice XF clásico almacenado o índice de formato de celda XLSX
KindClasificación como texto, número, fecha y hora, booleano, fórmula, error o blanco
ValueValor escalar almacenado o valor de caché de fórmula sin recálculo
HasFormulaCache / FormulaCachePresencia, 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
FormulaEvaluationA 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
FormulaVací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;

Véase también