Documentación HotXLS

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

CampoSignificado
SheetIndex / SheetNameIdentidad de hoja de cálculo local 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 de 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, tipo 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 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;

Véase también