Fidelidad de cálculo y conversión
Las matrices calculadas se componen a lo largo de funciones de selección, ordenación, búsqueda, matrices y reconfiguración de forma, con propiedad automática del derrame XLSX, destinos CSE explícitos y recursos de evaluación acotados
Matrices dinámicas y matrices CSE explícitas
Asigna una expresión que produzca una matriz a una sola TXLSXCell.Formula y llama a TXLSXWorkbook.Recalculate; el resultado posee un derrame rectangular anclado en esa celda, incluidas fórmulas como SEQUENCE(3,2), A1:A3*10, constantes de matriz y resultados de LET con valor de matriz
Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)'; Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)'; Workbook.Recalculate;
El recálculo agranda o reduce el resultado, limpia solo los seguidores obsoletos propiedad del ancla y reconstruye las dependencias cuando cambia la extensión; las referencias a seguidores recién creados y el operador de derrame A1# usan la extensión actual
Los valores existentes, las fórmulas, el texto enriquecido, otras matrices, los rangos combinados, las tablas y los límites de la hoja obstruyen un derrame y producen #SPILL!; los estilos en celdas por lo demás vacías siguen siendo utilizables, y despejar una obstrucción permite que el siguiente recálculo reintente el ancla
Editar un seguidor con un valor o texto enriquecido lo separa del ancla, de modo que el siguiente cálculo conserva la edición como obstrucción; eliminar o despejar el ancla libera sus seguidores propios, mientras que ConvertFormulasToValues conserva sus valores calculados como celdas ordinarias
El guardado XLSX registra la extensión actual de la matriz y sus metadatos, y la carga restaura la propiedad de los seguidores ya almacenados en caché antes del recálculo; las fórmulas de matriz que contienen errores 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 libro; la aritmética de rango sin procesar se evalúa elemento a 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 una matriz calculada; SINGLE y ANCHORARRAY son alias de almacenamiento aceptados para la intersección implícita y las referencias de derrame
MAP acepta varias matrices de entrada y una lista de parámetros LAMBDA coincidente, propaga errores de elemento y rechaza resultados de matriz anidados con #CALC!; FILTER acepta matrices calculadas y máscaras de fila o columna, incluida la propagación de errores y un #CALC! de resultado vacío cuando no se aporta alternativa
La mutación de derrames dinámicos se ejecuta en serie aunque se configuren varios hilos de cálculo; la estabilización de la extensión está acotada a 32 pasadas, y las matrices dinámicas en cálculos iterativos circulares se rechazan en lugar de tratarse como resultados escalares
INDEX acepta referencias, constantes de matriz y matrices calculadas; 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 la matriz completa; un origen 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 matrices, incluidas constantes, vectores calculados, valores de rango y enlaces de 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 ausentes en dimensiones desiguales devuelven valores #N/A individuales
Cuando algún selector es una matriz, un selector cero u omitido elige el primer miembro de ese eje en lugar de expandir una fila o columna entera; los selectores fraccionarios truncan hacia cero, los selectores negativos devuelven valores #VALUE! individuales antes del truncado, y los selectores más allá de los límites del origen devuelven valores #REF! individuales; las cadenas, los valores Boolean y los errores con tipo seleccionados conservan sus tipos
SORT y UNIQUE aceptan rangos, constantes y matrices calculadas, incluidos resultados anidados de FILTER, SEQUENCE y LET; la orientación de fila y columna, la ordenación ascendente o descendente, el orden de primera aparición y la deduplicación de aparición exacta siguen el mismo contrato para cada forma de origen
Los nombres definidos del libro pueden aportar orígenes de referencia, escalares o de matriz calculada; 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 derrama {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 matriz producen valores incluso cuando el origen es una referencia, mientras que los selectores escalares de referencia conservan la identidad de referencia
Estas expresiones pueden derramarse y redimensionarse en XLSX o evaluarse dentro de un destino CSE explícito; los errores de origen de matriz permanecen con tipo y un resultado vacío de aparición exacta devuelve #CALC!; las salidas de los selectores consumen el presupuesto de pasos de evaluación, y las cargas combinadas de matriz origen, selector y resultado se comprueban contra el presupuesto de memoria de matrices
INDEX acepta un cuarto argumento area_num explícito de 1 para un origen calculado, 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 multiárea 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 matriz son valores y no matrices de referencia anidadas; consulta la selección de áreas de INDEX e identidad de referencias para las reglas de cero, ausencia, coerción y errores
Para el cálculo independiente, TXLSCalculator.OnGetSpillRange acepta un callback TXLSGetSpillRange que resuelve los límites inclusivos actuales de un ancla; los evaluadores respaldados por libro instalan este callback automáticamente
TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer; var LastRow, LastCol: Integer): Integer of object;
lxNormalizeStorageFormula normaliza la sintaxis de fórmula escrita para OOXML, lxTryStorageFormulaOperators traduce los operadores de derrame e intersección implícita, y lxApplyXlfnPrefix aplica los prefijos de función futura requeridos; los separadores de texto protegido y de filas de matriz permanecen intactos, y asignar una fórmula conserva el texto del llamador en memoria
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, coherente con las importaciones nativas de Excel; el XML de fórmula importado sin cambios conserva su vía de preservación existente
Composición de búsqueda, matrices y reconfiguración de forma
TRANSPOSE acepta referencias, constantes y matrices calculadas conservando texto, valores Boolean y errores individuales; las celdas de origen 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 de texto, valores Boolean y blancos en lugar de coerción, y los errores del origen conservan sus códigos de error
CHOOSECOLS y CHOOSEROWS aceptan vectores de selección escalares o unidimensionales, concatenan los selectores en orden de argumento, conservan duplicados y cuentan los índices negativos desde el final; los selectores fraccionarios truncan hacia cero, el cero y los selectores fuera de rango se rechazan, y las matrices de selección bidimensionales no están admitidas
XLOOKUP, XMATCH y MATCH aceptan vectores de búsqueda calculados y peticiones de búsqueda con valor de matriz; las claves deben ocupar una fila o una columna, y las matrices de retorno de XLOOKUP deben alinearse con ese eje de búsqueda
Un XLOOKUP escalar puede devolver una fila o columna coincidente completa, incluidos errores con tipo; una petición de búsqueda con valor de matriz conserva su propia forma y toma el primer componente de cada porción coincidente o matriz alternativa
Los escaneos de búsqueda exacta se saltan las entradas de error en el vector de claves; las claves Boolean, numéricas y de texto permanecen distintas, mientras que las vías 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 o columnas devuelve #CALC!, y el replegado 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 comprueban contra el límite de memoria de matrices 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 a través del cálculo, la visualización, la inspección de caché y la reapertura XLSX; la salida XLSX lleva sus metadatos de valor enriquecido conservando la alternativa estándar de error en caché para lectores que no entienden esa extensión
Los resultados de texto de fórmula, incluidos los seguidores CSE y de matriz dinámica, usan cachés de cadenas literales para que Excel pueda mostrarlos antes del recálculo; las celdas de valor simples siguen usando cadenas compartidas
La salida moderna de errores enriquecidos incluye la versión del libro y las declaraciones de la característica 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 valores solicitados superiores sin cambiar la propiedad CalcId del libro en memoria
Los metadatos importados de celda y valor, las estructuras de valor enriquecido no relacionadas y los contenedores opacos conservan sus identidades originales cuando se añaden nuevos contenedores de error; reemplazar una celda de error limpia los metadatos de error con tipo obsoletos al guardar
TXLSXRichErrorCodes es el tipo de matriz de enteros usado para los contenedores de errores enriquecidos decodificados; el código de la aplicación lee los errores con tipo del valor Variant de la celda
BIFF8 no puede representar fielmente estos errores modernos ni los operadores de derrame; el serializador Classic rechaza las representaciones modernas no admitidas en lugar de asignar un código de error heredado no relacionado
Comprobación previa de conversión
TXLSXWorkbook.GetConversionReport devuelve un TXLSConversionReport 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, descartadas y no admitidas |
El informe 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órmula no admitidas, propiedad de matrices y partes de extensión opacas; describe las vías de conversión implementadas y no certifica cada característica en cada aplicación externa
ODS conserva las celdas de tabla ordinarias, los resultados de fórmula en caché, el texto y los autores de anotaciones admitidos, la protección de hoja 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 informa como descartada cuando el destino no puede transportarla
La fachada XLSX informa la salida BIFF8 como no admitida; usa la API del libro Classic para los flujos de trabajo BIFF admitidos; la versión 2.384.93 añade un backend acotado de valores y estilos XLSB que rechaza las fórmulas, los objetos de característica, los metadatos y los ajustes de cálculo no representables tanto en guardados comprobados como sin comprobar
Guardado comprobado
Status := Workbook.SaveAsChecked(Stream, xlsxOpenDocumentSpreadsheet, False);
Las sobrecargas de archivo y stream ejecutan la comprobación previa de pérdidas conocidas antes de escribir; AllowLossy=False rechaza las características degradadas o descartadas con diagnósticos de conversión, mientras que AllowLossy=True acepta explícitamente esas pérdidas y sigue rechazando las conversiones no admitidas
Una comprobación previa rechazada deja los bytes de destino y la posición del stream sin cambios; las peticiones con éxito 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 actual; las aplicaciones que exigen una decisión explícita de pérdidas deben inspeccionar el informe y usar el guardado comprobado
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
Un XLTX sin macros rechaza un libro con VBA incluso cuando el guardado comprobado con pérdidas está activado; un paquete XLTM puede emitirse sin proyecto VBA, y HotXLS no crea código VBA
Fórmulas de validación ODS
La validación Boolean personalizada usa of:is-true-formula(...); los límites escalares admitidos, los orígenes de lista, las referencias A1 calificadas, las cadenas y los separadores de argumentos se traducen a OpenFormula y se reubican contra la dirección de la celda base de validación al importar
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 comprobación previa de conversión informa las reglas omitidas
Anotaciones, protección y filtros ODS
Los comentarios de celda ordinarios 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 por lo demás ausentes y en coordenadas lejanas usan series dispersas repetidas de filas y columnas sin crear celdas de hoja
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 informa como descartada; el texto enriquecido de los comentarios se aplana a su texto mostrado, y los informes de conversión identifican la pérdida del estilo de las porciones, las dimensiones personalizadas de caja y la presentación siempre visible
El indicador de protección OpenDocument y los estilos de celda bloqueada o desbloqueada admitidos se conservan; el subconjunto de hoja sin pérdidas no usa contraseña ni excepciones de rango editable y permite solo la selección de celdas bloqueadas y desbloqueadas
Sheet.Protect; Sheet.SheetProtectionOptions := [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells]; Sheet.Range['B2:B100'].Locked := False;
Los hashes de contraseña de Excel, los ajustes de contraseña modernos, los rangos editables y los permisos de acción fuera de ese subconjunto se informan como degradados mientras el indicador de protección permanece; el amplio conjunto de permisos por defecto de Excel también exige una decisión explícita de pérdidas
La importación OpenDocument conserva el indicador de protección y los estilos de bloqueo de celda; los hashes de contraseña nativos no se convierten en hashes de Excel, y los metadatos de permisos importados no representables siguen siendo una pérdida con nombre en los informes de conversión posteriores
La exportación de AutoFilter admite seis operadores de comparación escalares, 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 de blancos no tienen límite de dos valores y siguen siendo metadatos de filtro nativos
Los criterios escalares numéricos usan valores finitos invariantes; las selecciones de texto conservan sus caracteres literales, incluidos los caracteres comodín dentro de 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 expresión completa en lugar de debilitar condiciones seleccionadas; el rango del filtro permanece, y el informe de conversión identifica los criterios omitidos
Los guardados de stream ODS dejan preparado 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 offsets ZIP absolutos se conservan, incluidas las posiciones más allá del final original; la cancelación o una excepción del callback 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 sigue siendo no cancelable
La importación OpenDocument admite las mismas conjunciones escalares y las disyunciones de texto de la misma columna o los 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 privadas de procedencia de la hoja; los informes de conversión usan ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria e 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 de la caché de tabla dinámica local
- Proveedores de tabla de consulta aportados por el llamador y actualización transaccional
- Conversaciones por hilos en bandas de informe repetidas
- Actualización de la caché de gráficos y paginación nativa combinada
- Declaraciones del libro y métodos de guardado