Fidelidad de cálculo y conversión
Las matrices calculadas se componen a través de funciones de selección, ordenamiento, búsqueda, matriciales y de reconfiguración de forma, con propiedad automática de desbordamiento XLSX, destinos CSE explícitos y recursos de evaluación acotados
Matrices dinámicas y arreglos CSE explícitos
Asigne una expresión que produce arreglos a un TXLSXCell.Formula y llame a TXLSXWorkbook.Recalculate; el resultado posee un desbordamiento rectangular anclado en esa celda, incluidas fórmulas como SEQUENCE(3,2), A1:A3*10, constantes de arreglo y resultados de LET con valor de arreglo
Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)'; Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)'; Workbook.Recalculate;
El recálculo hace crecer o encoger el resultado, limpia únicamente los seguidores obsoletos de propiedad del ancla y reconstruye las dependencias cuando cambia la extensión; las referencias a los seguidores recién creados y el operador de desbordamiento A1# usan la extensión actual
Los valores existentes, las fórmulas, el texto enriquecido, otros arreglos, los rangos combinados, las tablas y los límites de la hoja obstruyen un desbordamiento y producen #SPILL!; los estilos en celdas que de resto están vacías siguen siendo utilizables, y limpiar una obstrucción permite que el siguiente recálculo reintente el ancla
Editar un seguidor con un valor o texto enriquecido desvincula esa celda del ancla, de modo que el siguiente cálculo preserva la edición como una obstrucción; eliminar o limpiar el ancla libera sus seguidores de su propiedad, mientras que ConvertFormulasToValues conserva sus valores calculados como celdas ordinarias
El guardado XLSX registra la extensión actual del arreglo y sus metadatos, y la carga restaura la propiedad de los seguidores existentes en caché antes del recálculo; las fórmulas de arreglo que contienen errores aún conservan su extensión cuando los errores pertenecen a elementos individuales
SetArrayFormula sigue siendo el punto de entrada CSE explícito de rango fijo en ambos motores de libros; la aritmética de rangos cruda evalúa elemento por elemento dentro de ese rango, mientras que las fórmulas escalares ordinarias conservan la intersección implícita
El operador unario @ intersecta una referencia con la celda de la fórmula y toma el primer elemento de un arreglo calculado; SINGLE y ANCHORARRAY son alias de almacenamiento aceptados para la intersección implícita y las referencias de desbordamiento
MAP acepta varios arreglos de entrada y una lista de parámetros LAMBDA correspondiente, propaga errores de elementos y rechaza los resultados de arreglos anidados con #CALC!; FILTER acepta arreglos calculados y máscaras de fila o columna, incluida la propagación de errores y un #CALC! de resultado vacío cuando no se aporta un fallback
La mutación de desbordamientos dinámicos se ejecuta en serie incluso cuando hay varios subprocesos de cálculo configurados; la estabilización de la extensión está acotada a 32 pasadas, y los arreglos dinámicos en cálculos iterativos circulares se rechazan en lugar de tratarse como resultados escalares
INDEX acepta referencias, constantes de arreglo y arreglos calculados; cuando ambos selectores son escalares, los selectores positivos de fila y columna devuelven un valor, un selector cero devuelve la fila o columna seleccionada, y dos selectores cero devuelven el arreglo completo; una fuente de referencia con selectores escalares conserva el comportamiento de referencia para consumidores como ROW y ISREF
Los selectores de fila y columna también pueden ser arreglos, incluidas constantes, vectores calculados, valores de rango y enlaces LET; las orientaciones opuestas de fila y columna se difunden a un producto cruzado rectangular, mientras que las orientaciones coincidentes seleccionan posiciones emparejadas; las dimensiones singleton se difunden, y las posiciones faltantes en dimensiones desiguales devuelven valores #N/A individuales
Cuando cualquiera de los selectores es un arreglo, un selector cero u omitido elige el primer miembro de ese eje en lugar de expandir una fila o columna completa; los selectores fraccionarios truncan hacia cero, los selectores negativos devuelven valores #VALUE! individuales antes del truncamiento, y los selectores fuera de los límites de la fuente devuelven valores #REF! individuales; las cadenas seleccionadas, los valores Boolean y los errores con tipo conservan sus tipos
SORT y UNIQUE aceptan rangos, constantes y arreglos calculados, incluidos resultados anidados de FILTER, SEQUENCE y LET; la orientación de fila y columna, el ordenamiento ascendente o descendente, el orden de primera aparición y la deduplicación de ocurrencias exactas siguen el mismo contrato para cada forma de fuente
Los nombres definidos por el libro pueden aportar fuentes de referencia, escalares o de arreglos calculados; ISREF(INDEX(...)) distingue un resultado de referencia real de un valor calculado con nombre; los selectores escalares de INDEX y las opciones numéricas de SORT truncan los valores fraccionarios, y los argumentos Boolean opcionales rechazan texto distinto de TRUE o FALSE
Sheet.Cells.Item[1, 6].Formula := 'SORT(UNIQUE(FILTER(A1:B5,A1:A5>1)),1,-1)'; Sheet.Cells.Item[1, 9].Formula := 'INDEX(SORT(UNIQUE(A1:B5)),0,2)'; Sheet.Cells.Item[1, 12].Formula := 'INDEX(SEQUENCE(2,3,10,2),2,3)'; Workbook.Recalculate;
Sheet.Cells.Item[1, 1].Formula := 'INDEX(SEQUENCE(3,3),{1;3},{1,3})';
Workbook.Recalculate;
Este ejemplo de selectores desborda {1,3;7,9} en un resultado de dos por dos; INDEX(SEQUENCE(3,3),{1;3},{1;3}) en cambio devuelve la columna emparejada {1;9}; los selectores de arreglo producen valores incluso cuando la fuente es una referencia, mientras que los selectores escalares de referencia preservan la identidad de referencia
Estas expresiones pueden desbordarse y redimensionarse en XLSX o evaluarse dentro de un destino CSE explícito; los errores de fuente de arreglo permanecen con tipo y un resultado vacío de ocurrencias exactas devuelve #CALC!; las salidas de selectores consumen el presupuesto de pasos de evaluación, y las cargas combinadas de matriz fuente, selectores y resultado se verifican contra el presupuesto de memoria de arreglos
INDEX acepta un cuarto argumento area_num explícito de 1 para una fuente calculada, y los selectores de fila, columna y área pueden difundirse juntos sobre una unión de referencias de la misma hoja admitida; las referencias reales de varias áreas conservan la identidad a través de nombres definidos locales y LET, mientras que un CHOOSE escalar conserva la referencia seleccionada, incluida una elección en otra hoja; los resultados de selectores de arreglo son valores en lugar de arreglos de referencia anidados; consulte selección de áreas de INDEX e identidad de referencia para conocer las reglas de cero, omisión, coerción y errores
Para el cálculo independiente, TXLSCalculator.OnGetSpillRange acepta una devolución de llamada TXLSGetSpillRange que resuelve los límites inclusivos actuales de un ancla; los evaluadores respaldados por libro instalan esta devolución de llamada automáticamente
TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer; var LastRow, LastCol: Integer): Integer of object;
lxNormalizeStorageFormula normaliza la sintaxis de fórmulas escrita para OOXML, lxTryStorageFormulaOperators traduce los operadores de desbordamiento e intersección implícita, y lxApplyXlfnPrefix aplica los prefijos de función futura requeridos; los separadores protegidos de texto y filas de arreglo permanecen intactos, y asignar una fórmula conserva en memoria el texto del llamador
Guardar no cambia la expresión escrita en memoria; reabrir fórmulas XLSX recién escritas devuelve la sintaxis de almacenamiento canónica con argumentos separados por comas y sin = inicial, en consonancia con las importaciones nativas de Excel; el XML de fórmulas importadas sin cambios conserva su ruta de preservación existente
Composición de búsqueda, matrices y reconfiguración de forma
TRANSPOSE acepta referencias, constantes y arreglos calculados preservando texto, valores Boolean y errores individuales; las celdas de fuente en blanco se convierten en cero numérico
MMULT, MDETERM y MINVERSE aceptan matrices calculadas y expresiones anidadas como MMULT(MUNIT(2),SEQUENCE(2,2)); sus entradas de matriz deben ser numéricas, con rechazo del texto, los valores Boolean y los blancos en lugar de coercionarlos, y los errores de la fuente conservan sus códigos de error
CHOOSECOLS y CHOOSEROWS aceptan selectores escalares o vectores unidimensionales, concatenan los selectores en el orden de los argumentos, preservan los duplicados y cuentan los índices negativos desde el final; los selectores fraccionarios truncan hacia cero, los selectores cero y fuera de rango provocan rechazo, y las matrices de selectores bidimensionales no están admitidas
XLOOKUP, XMATCH y MATCH aceptan vectores de búsqueda calculados y solicitudes de búsqueda con valor de arreglo; las claves deben ocupar una fila o una columna, y los arreglos de retorno de XLOOKUP deben alinearse con ese eje de búsqueda
Un XLOOKUP escalar puede devolver una fila o columna completa coincidente, incluidos los errores con tipo; una solicitud de búsqueda con valor de arreglo conserva su propia forma y toma el primer componente de cada porción o arreglo de fallback coincidente
Los escaneos de búsqueda exacta omiten las entradas de error en el vector de claves; las claves Boolean, numéricas y de texto permanecen distintas, mientras que las rutas escalares ordinarias de referencia conservan su comportamiento existente de streaming y caché de recálculo; los modos de búsqueda binaria siguen exigiendo claves correctamente ordenadas
VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS y EXPAND aceptan entradas calculadas y relleno con tipo; un resultado sin filas ni columnas devuelve #CALC!, y el ajuste con wrap exige una entrada unidimensional
El trabajo matricial, el escaneo de búsquedas, el recorrido de selectores, la copia y el relleno consumen el presupuesto de pasos de evaluación; las cargas de matrices de entrada, trabajo y salida retenidas simultáneamente se verifican contra el límite de memoria de arreglos configurado antes de la asignación
Sheet.Cells.Item[1, 1].Formula := 'XLOOKUP({1;3},SEQUENCE(3),SEQUENCE(3,2))';
Sheet.Cells.Item[1, 4].Formula := 'CHOOSECOLS(SEQUENCE(2,3),{-1;1})';
Sheet.Cells.Item[1, 7].Formula := 'TRANSPOSE(UNIQUE({"A";"B";"A"}))';
Workbook.Recalculate;
Errores de cálculo modernos con tipo
#SPILL! y #CALC! permanecen como errores de celda con tipo durante el cálculo, la visualización, la inspección de caché y la reapertura XLSX; la salida XLSX lleva sus metadatos de valor enriquecido mientras conserva el fallback estándar de error en caché para los lectores que no entienden esa extensión
Los resultados de texto de fórmulas, incluidos los seguidores CSE y de matrices dinámicas, usan cachés de cadenas literales para que Excel pueda mostrarlos antes del recálculo; las celdas de valores simples siguen usando cadenas compartidas
La salida moderna de errores enriquecidos incluye la versión del libro y las declaraciones de la función de cálculo Rich Data que Excel necesita para interpretar esas cachés antes del recálculo; el calcId emitido es al menos 191029, preservando los valores solicitados mayores sin cambiar la propiedad CalcId del libro en memoria
Los metadatos importados de celdas y valores, las estructuras de valores enriquecidos no relacionadas y los contenedores opacos conservan sus identidades originales cuando se agregan nuevos contenedores de errores; reemplazar una celda de error limpia los metadatos obsoletos de errores con tipo al guardar
TXLSXRichErrorCodes es el tipo de arreglo de enteros usado para los contenedores de errores enriquecidos decodificados; el código de la aplicación lee los errores con tipo desde el valor Variant de la celda
BIFF8 no puede representar fielmente estos errores modernos ni los operadores de desbordamiento; el serializador Classic rechaza las representaciones modernas no admitidas en lugar de asignar un código de error heredado no relacionado
Verificación previa de conversión
TXLSXWorkbook.GetConversionReport devuelve un TXLSConversionReport de propiedad del llamador sin recalcular ni cambiar el libro; los tipos se declaran en lxDiagnostics
Report := Workbook.GetConversionReport(xlsConversionOpenDocument);
try
for I := 0 to Report.Count - 1 do
InspectIssue(Report.Items[I]);
finally
Report.Free;
end;
| Target | xlsConversionOpenXmlWorkbook, xlsConversionOpenXmlTemplate, xlsConversionMacroEnabledTemplate, xlsConversionOpenDocument, xlsConversionExcel97Workbook o xlsConversionExcelBinaryWorkbook |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped o xlsConversionUnsupported |
| Issue | TXLSConversionIssue expone Feature, Fidelity, SheetIndex, SheetName, Location y Message; HasLoss incluye las entradas degradadas, eliminadas y no admitidas |
El reporte inventaría las pérdidas de formato conocidas, como VBA, protección, vistas del libro, conexiones, tablas de consulta, comentarios, vínculos externos, mapas XML, estructura de tablas, criterios de filtro, dibujos, cachés de errores con tipo, validación o sintaxis de fórmulas no admitidas, propiedad de arreglos y partes de extensión opacas; describe las rutas de conversión implementadas y no certifica cada función en cada aplicación externa
ODS conserva las celdas ordinarias de tablas, los resultados de fórmulas en caché, el texto y los autores de anotaciones admitidos, la protección de hojas sin contraseña y los filtros representables, mientras pierde el objeto de tabla de Excel, la geometría de gráficos más rica o la semántica de reglas no admitidas; una carga de preservación OOXML opaca se reporta como eliminada cuando el destino no puede transportarla
La fachada XLSX reporta la salida BIFF8 como no admitida; use la API de libros Classic para los flujos de trabajo BIFF admitidos; la versión 2.384.93 agrega un backend acotado de valores y estilos XLSB que rechaza las fórmulas, los objetos de funciones, los metadatos y la configuración de cálculo no representados tanto en guardados verificados como no verificados
Guardado verificado
Status := Workbook.SaveAsChecked(Stream, xlsxOpenDocumentSpreadsheet, False);
Las sobrecargas de archivo y de stream ejecutan la verificación previa de pérdidas conocidas antes de escribir; AllowLossy=False rechaza las funciones degradadas o eliminadas con diagnósticos de conversión, mientras que AllowLossy=True acepta explícitamente esas pérdidas y aún rechaza las conversiones no admitidas
Una verificación previa rechazada deja los bytes de destino y la posición del stream sin cambios; las solicitudes exitosas usan la transacción de guardado existente y devuelven las mismas convenciones de estado de guardado que SaveAs
El SaveAs ordinario sigue disponible con su comportamiento existente; las aplicaciones que requieren una decisión explícita de pérdida deberían inspeccionar el reporte y usar el guardado verificado
Formatos de plantilla
xlsxOpenXMLTemplate selecciona XLTX sin macros, mientras que xlsxOpenXMLMacroEnabledTemplate selecciona XLTM y preserva un proyecto VBA existente; el formato es explícito y no se infiere de una extensión de archivo ni de una plantilla importada
El XLTX sin macros rechaza un libro con VBA incluso cuando el guardado verificado con pérdida está habilitado; un paquete XLTM puede emitirse sin proyecto VBA, y HotXLS no crea código VBA
Fórmulas de validación de ODS
La validación Boolean personalizada usa of:is-true-formula(...); los límites escalares admitidos, las fuentes de listas, las referencias A1 calificadas, las cadenas y los separadores de argumentos se traducen a OpenFormula y se rebasan contra la dirección de la celda base de validación en la importación
Las expresiones de validación estructuradas, externas o tridimensionales no admitidas se omiten junto con sus referencias de celda, evitando definiciones de validación colgantes; la verificación previa de conversión reporta las reglas omitidas
Anotaciones, protección y filtros de ODS
Los comentarios ordinarios de celdas se exportan como anotaciones OpenDocument con su texto y autor, incluidas las notas vacías, los tabuladores, los espacios y los saltos de línea; las notas en celdas que de resto están ausentes y en coordenadas lejanas usan ejecuciones dispersas repetidas de filas y columnas sin crear celdas de hoja de cálculo
Un comentario en la celda ancla de un rango combinado conserva su dirección; una nota en una celda cubierta o fuera de la cuadrícula de la hoja se reporta como eliminada; el texto enriquecido de comentarios se aplana a su texto mostrado, y los reportes de conversión identifican la pérdida del estilo de las ejecuciones, las dimensiones de cuadro personalizadas y la presentación siempre visible
El indicador protegido de OpenDocument y los estilos de celda bloqueada o desbloqueada admitidos se conservan; el subconjunto de hojas sin pérdida no usa contraseña ni excepciones de rangos editables y permite únicamente la selección de celdas bloqueadas y desbloqueadas
Sheet.Protect; Sheet.SheetProtectionOptions := [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells]; Sheet.Range['B2:B100'].Locked := False;
Los hashes de contraseñas de Excel, la configuración moderna de contraseñas, los rangos editables y los permisos de acciones fuera de ese subconjunto se reportan como degradados mientras el indicador protegido permanece; el amplio conjunto de permisos predeterminado de Excel también exige una decisión explícita de pérdida
La importación de OpenDocument conserva el indicador protegido y los estilos de bloqueo de celdas; los hashes nativos de contraseñas no se convierten en hashes de Excel, y los metadatos importados de permisos no representados siguen siendo una pérdida nombrada en los reportes de conversión posteriores
La exportación de AutoFilter admite seis operadores escalares de comparación, hasta dos condiciones escalares por columna unidas con AND u OR, y un AND entre columnas; las listas admitidas de selección de valores simples y las selecciones en blanco no tienen límite de dos valores y permanecen como metadatos de filtro nativos
Los criterios escalares numéricos usan valores finitos invariantes; las selecciones de texto preservan sus caracteres literales, incluidos los caracteres comodín dentro de las listas de selección, mientras que las expresiones comodín en filtros personalizados, los criterios Boolean ambiguos, los grupos de fechas, las fechas dinámicas y los filtros de color e icono no tienen una conversión admitida equivalente
Las expresiones de filtro no admitidas se omiten como una expresión completa en lugar de debilitar condiciones seleccionadas; el rango del filtro permanece, y el reporte de conversión identifica los criterios omitidos
Los guardados de streams ODS preparan el paquete completo en un archivo temporal registrado antes de escribir en la posición original del destino; los bytes de prefijo existentes y los desplazamientos ZIP absolutos se conservan, incluidas las posiciones más allá del final original; la cancelación o una excepción de la devolución de llamada de progreso antes de la confirmación preserva los bytes, el tamaño y la posición del destino y libera el archivo temporal; la notificación final de escritura permanece incancelable
La importación de OpenDocument admite las mismas conjunciones escalares y las mismas disyunciones de texto por columna o conjuntos de valores; el OR entre columnas, las expresiones regulares, las comparaciones sensibles a mayúsculas y los operadores de filtro nativos no admitidos siguen siendo pérdidas importadas explícitas
TXLSXOdsImportLoss y TXLSXOdsImportLosses describen las categorías de procedencia privadas de la hoja; los reportes de conversión usan ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria y ImportedOdsCommentFormatting; sobreviven a la copia de hojas y aparecen tanto para los destinos de conversión OpenDocument como Open XML
La conversión de filtros conserva los metadatos y la visibilidad existente de filas sin aplicar filtros ni recalcular celdas; las aplicaciones nativas conservan la responsabilidad de su propio comportamiento de filtrado y edición
Flujos de trabajo relacionados
- Miembros estables y actualización transaccional del caché local de tablas dinámicas
- Proveedores de tablas de consulta aportados por el llamador y actualización transaccional
- Conversaciones por subprocesos en bandas de reportes repetidos
- Actualización del caché de gráficos y paginación nativa combinada
- Declaraciones del libro y métodos de guardado