Fidelidade de cálculo e conversão
Matrizes calculadas compõem entre funções de seleção, ordenação, procura, matrizes e reformatação, com propriedade automática de despejo XLSX, destinos CSE explícitos e recursos de avaliação limitados
Matrizes dinâmicas e matrizes CSE explícitas
Atribua uma expressão que produz matriz a uma única TXLSXCell.Formula e chame TXLSXWorkbook.Recalculate; o resultado recebe um despejo retangular ancorado nessa célula, incluindo fórmulas como SEQUENCE(3,2), A1:A3*10, constantes de matriz e resultados de LET com valor de matriz
Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)'; Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)'; Workbook.Recalculate;
O recálculo aumenta ou reduz o resultado, limpa apenas os seguidores obsoletos de propriedade da âncora e reconstrói as dependências quando a extensão muda; referências a seguidores recém-criados e o operador de despejo A1# usam a extensão atual
Valores existentes, fórmulas, rich text, outras matrizes, intervalos mesclados, tabelas e limites de planilha obstruem um despejo e produzem #SPILL!; estilos em células de outra forma vazias continuam utilizáveis, e limpar uma obstrução permite que o próximo recálculo tente a âncora novamente
Editar um seguidor com um valor ou rich text desanexa essa célula da âncora, de modo que o próximo cálculo preserva a edição como uma obstrução; remover ou limpar a âncora libera os seguidores de sua propriedade, enquanto ConvertFormulasToValues mantém os valores calculados deles como células comuns
Salvar em XLSX registra a extensão atual da matriz e os metadados, e carregar restaura a propriedade dos seguidores já em cache antes do recálculo; fórmulas de matriz que contêm erros ainda retêm sua extensão quando os erros pertencem a elementos individuais
SetArrayFormula continua sendo o ponto de entrada CSE explícito de intervalo fixo nos dois motores de pasta de trabalho; aritmética bruta de intervalo avalia elemento a elemento dentro desse intervalo, enquanto fórmulas escalares comuns mantêm a interseção implícita
O operador unário @ cruza uma referência com a célula da fórmula e toma o primeiro elemento de uma matriz calculada; SINGLE e ANCHORARRAY são aliases de armazenamento aceitos para interseção implícita e referências de despejo
MAP aceita várias matrizes de entrada e uma lista de parâmetros LAMBDA correspondente, propaga erros de elemento e rejeita resultados de matriz aninhados com #CALC!; FILTER aceita matrizes calculadas e máscaras de linha ou coluna, incluindo propagação de erros e um #CALC! de resultado vazio quando nenhum fallback é fornecido
A mutação de despejo dinâmico roda em série mesmo quando várias threads de cálculo estão configuradas; a estabilização da extensão é limitada a 32 passadas, e matrizes dinâmicas em cálculos iterativos circulares são rejeitadas em vez de tratadas como resultados escalares
INDEX aceita referências, constantes de matriz e matrizes calculadas; quando os dois seletores são escalares, seletores positivos de linha e coluna retornam um valor, um seletor zero retorna a linha ou coluna selecionada, e dois seletores zero retornam a matriz completa; uma fonte de referência com seletores escalares mantém o comportamento de referência para consumidores como ROW e ISREF
Seletores de linha e coluna também podem ser matrizes, incluindo constantes, vetores calculados, valores de intervalo e vinculações LET; orientações opostas de linha e coluna sofrem difusão para um produto cruzado retangular, enquanto orientações correspondentes selecionam posições em pares; dimensões singleton sofrem difusão, e posições ausentes em dimensões desiguais retornam valores #N/A individuais
Quando qualquer seletor é uma matriz, zero ou um seletor omitido escolhe o primeiro membro desse eixo em vez de expandir uma linha ou coluna inteira; seletores fracionários truncam em direção a zero, seletores negativos retornam valores #VALUE! individuais antes do truncamento, e seletores além dos limites da fonte retornam valores #REF! individuais; strings, valores Boolean e erros tipados selecionados mantêm seus tipos
SORT e UNIQUE aceitam intervalos, constantes e matrizes calculadas, incluindo resultados aninhados de FILTER, SEQUENCE e LET; orientação de linha e coluna, ordenação crescente ou decrescente, ordenação por primeira ocorrência e deduplicação de ocorrência única seguem o mesmo contrato para cada forma de fonte
Nomes definidos da pasta de trabalho podem fornecer fontes de referência, escalares ou de matriz calculada; ISREF(INDEX(...)) distingue um resultado de referência real de um valor calculado nomeado; seletores escalares de INDEX e opções numéricas de SORT truncam valores fracionários, e argumentos Boolean opcionais rejeitam texto diferente de TRUE ou 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 exemplo de seletor despeja {1,3;7,9} em um resultado de dois por dois; INDEX(SEQUENCE(3,3),{1;3},{1;3}) em vez disso retorna a coluna em pares {1;9}; seletores de matriz produzem valores mesmo quando a fonte é uma referência, enquanto seletores escalares de referência preservam a identidade de referência
Essas expressões podem despejar e redimensionar em XLSX ou avaliar dentro de um destino CSE explícito; erros de fonte de matriz permanecem tipados e um resultado vazio de ocorrência única retorna #CALC!; as saídas de seletor consomem o orçamento de etapas de avaliação, e os payloads combinados de matrizes de fonte, seletor e resultado são verificados contra o orçamento de memória de matriz
INDEX aceita um quarto argumento area_num explícito de 1 para uma fonte calculada, e seletores de linha, coluna e área podem sofrer difusão juntos sobre uma união de referências na mesma planilha com suporte; referências reais de múltiplas áreas mantêm a identidade por meio de nomes definidos locais e LET, enquanto um CHOOSE escalar mantém a referência selecionada, incluindo uma escolha em outra planilha; resultados de matriz de seletor são valores, e não matrizes de referência aninhadas; consulte seleção de área do INDEX e identidade de referência para as regras de zero, omissão, coerção e erro
Para cálculo autônomo, TXLSCalculator.OnGetSpillRange aceita um callback TXLSGetSpillRange que resolve os limites atuais inclusivos de uma âncora; avaliadores apoiados na pasta de trabalho instalam esse callback automaticamente
TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer; var LastRow, LastCol: Integer): Integer of object;
lxNormalizeStorageFormula normaliza a sintaxe de fórmula criada para OOXML, lxTryStorageFormulaOperators traduz os operadores de despejo e de interseção implícita, e lxApplyXlfnPrefix aplica os prefixos de future-function exigidos; texto protegido e separadores de linha de matriz permanecem intactos, e atribuir uma fórmula retém o texto do chamador em memória
Salvar não altera a expressão criada em memória; reabrir fórmulas XLSX recém-criadas retorna a sintaxe de armazenamento canônica com argumentos por vírgula e sem = inicial, consistente com importações nativas do Excel; o XML de fórmula importado sem alterações mantém seu caminho de preservação existente
Composição de procura, matriz e reformatação
TRANSPOSE aceita referências, constantes e matrizes calculadas preservando texto, valores Boolean e erros individuais; células de fonte em branco viram zero numérico
MMULT, MDETERM e MINVERSE aceitam matrizes calculadas e expressões aninhadas como MMULT(MUNIT(2),SEQUENCE(2,2)); as entradas dessas matrizes devem ser numéricas, com texto, valores Boolean e brancos rejeitados em vez de coagidos, e erros da fonte mantendo seus códigos de erro
CHOOSECOLS e CHOOSEROWS aceitam vetores de seletor escalares ou unidimensionais, concatenam seletores na ordem dos argumentos, preservam duplicatas e contam índices negativos a partir do fim; seletores fracionários truncam em direção a zero, seletores zero e fora do intervalo são rejeitados, e matrizes de seletor bidimensionais não têm suporte
XLOOKUP, XMATCH e MATCH aceitam vetores de procura calculados e pedidos de procura com valor de matriz; as chaves devem ocupar uma linha ou uma coluna, e as matrizes de retorno do XLOOKUP devem se alinhar a esse eixo de procura
Um XLOOKUP escalar pode retornar uma linha ou coluna inteira correspondente, incluindo erros tipados; um pedido de procura com valor de matriz mantém sua própria forma e toma o primeiro componente de cada fatia correspondente ou matriz de fallback
Varreduras de procura exata ignoram entradas de erro no vetor de chaves; chaves Boolean, numéricas e de texto permanecem distintas, enquanto os caminhos comuns de referência escalar mantêm o comportamento existente de streaming e de cache de recálculo; os modos de busca binária ainda exigem chaves corretamente ordenadas
VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS e EXPAND aceitam entradas calculadas e preenchimento tipado; um resultado sem linhas ou colunas retorna #CALC!, e o encapsulamento exige uma entrada unidimensional
Trabalho com matrizes, varredura de procura, travessia de seletores, cópia e preenchimento consomem o orçamento de etapas de avaliação; os payloads de matrizes de entrada, trabalho e saída retidos simultaneamente são verificados contra o limite de memória de matriz configurado antes da alocação
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;
Erros de cálculo modernos tipados
#SPILL! e #CALC! permanecem erros de célula tipados durante cálculo, exibição, inspeção de cache e reabertura de XLSX; a saída XLSX carrega os metadados de rich value deles, mantendo o fallback padrão de erro em cache para leitores que não entendem essa extensão
Resultados de texto de fórmula, incluindo seguidores CSE e de matriz dinâmica, usam caches de string literal para que o Excel possa exibi-los antes do recálculo; células de valor simples continuam usando shared strings
A saída de rich error moderna inclui a versão da pasta de trabalho e as declarações de recurso de cálculo Rich Data exigidas pelo Excel para interpretar esses caches antes do recálculo; o calcId emitido é pelo menos 191029, preservando valores solicitados mais altos sem alterar a propriedade CalcId da pasta de trabalho em memória
Metadados importados de célula e de valor, estruturas de rich value não relacionadas e buckets opacos mantêm suas identidades originais quando novos buckets de erro são anexados; substituir uma célula de erro limpa os metadados obsoletos de erro tipado ao salvar
TXLSXRichErrorCodes é o tipo de array de inteiros usado para buckets de rich error decodificados; o código da aplicação lê erros tipados do valor Variant da célula
O BIFF8 não consegue representar fielmente esses erros modernos nem os operadores de despejo; o serializador Classic rejeita representações modernas sem suporte em vez de atribuir um código de erro legado sem relação
Preflight de conversão
TXLSXWorkbook.GetConversionReport retorna um TXLSConversionReport de propriedade do chamador sem recalcular nem alterar a pasta de trabalho; os tipos são declarados em 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 ou xlsConversionExcelBinaryWorkbook |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped ou xlsConversionUnsupported |
| Issue | TXLSConversionIssue expõe Feature, Fidelity, SheetIndex, SheetName, Location e Message; HasLoss inclui entradas degradadas, descartadas e sem suporte |
O relatório inventaria perdas de formato conhecidas, como VBA, proteção, views de pasta de trabalho, conexões, tabelas de consulta, comentários, links externos, XML maps, estrutura de tabela, critérios de filtro, desenhos, caches de erro tipado, validação ou sintaxe de fórmula sem suporte, propriedade de matriz e partes de extensão opacas; ele descreve os caminhos de conversão implementados e não certifica cada recurso em cada aplicativo externo
O ODS retém células de tabela comuns, resultados de fórmula em cache, texto e autores de anotação com suporte, proteção de planilha sem senha e filtros representáveis, ao mesmo tempo em que perde o objeto de tabela do Excel, geometria de gráfico mais rica ou semântica de regra sem suporte; um payload de preservação OOXML opaco é relatado como descartado quando o destino não consegue carregá-lo
A fachada XLSX relata saída BIFF8 como sem suporte; use a API de pasta de trabalho Classic para fluxos de trabalho BIFF com suporte; a versão 2.384.93 adiciona um backend XLSB limitado de valores e estilos que rejeita fórmulas, objetos de recurso, metadados e configurações de cálculo não representados tanto em salvamentos verificados quanto não verificados
Salvamento verificado
Status := Workbook.SaveAsChecked(Stream, xlsxOpenDocumentSpreadsheet, False);
Os overloads de arquivo e stream executam o preflight de perdas conhecidas antes de gravar; AllowLossy=False rejeita recursos degradados ou descartados com diagnósticos de conversão, enquanto AllowLossy=True aceita explicitamente essas perdas e ainda rejeita conversões sem suporte
Um preflight rejeitado deixa os bytes de destino e a posição do stream inalterados; solicitações bem-sucedidas usam a transação de salvamento existente e retornam as mesmas convenções de status de salvamento do SaveAs
O SaveAs comum continua disponível com seu comportamento existente; aplicativos que exigem uma decisão explícita de perda devem inspecionar o relatório e usar o salvamento verificado
Formatos de modelo
xlsxOpenXMLTemplate seleciona XLTX sem macros, enquanto xlsxOpenXMLMacroEnabledTemplate seleciona XLTM e preserva um projeto VBA existente; o formato é explícito e não é inferido de uma extensão de arquivo ou modelo importado
XLTX sem macros rejeita uma pasta de trabalho com VBA mesmo quando o salvamento verificado com perdas está habilitado; um pacote XLTM pode ser emitido sem um projeto VBA, e o HotXLS não cria código VBA
Fórmulas de validação ODS
Validação Boolean personalizada usa of:is-true-formula(...); limites escalares com suporte, fontes de lista, referências A1 qualificadas, strings e separadores de argumento são traduzidos para OpenFormula e reajustados com base no endereço da célula base de validação na importação
Expressões de validação estruturadas, externas ou tridimensionais sem suporte são omitidas junto com suas referências de célula, evitando definições de validação pendentes; o preflight de conversão relata as regras omitidas
Anotações, proteção e filtros ODS
Comentários de célula comuns são exportados como anotações OpenDocument com seu texto e autor, incluindo notas vazias, tabulações, espaços e quebras de linha; notas em células de outra forma ausentes e coordenadas distantes usam sequências esparsas repetidas de linhas e colunas sem criar células de planilha
Um comentário na célula âncora de um intervalo mesclado retém seu endereço; uma nota em uma célula coberta ou fora da grade da planilha é relatada como descartada; o rich text de comentários é achatado para seu texto exibido, e os relatórios de conversão identificam a perda de estilo de runs, dimensões personalizadas de caixa e apresentação sempre visível
O sinalizador protegido do OpenDocument e os estilos de célula bloqueada ou desbloqueada com suporte são retidos; o subconjunto de planilha sem perdas não usa senha nem exceções de intervalo editável e permite a seleção apenas de células bloqueadas e desbloqueadas
Sheet.Protect; Sheet.SheetProtectionOptions := [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells]; Sheet.Range['B2:B100'].Locked := False;
Hashes de senha do Excel, configurações modernas de senha, intervalos editáveis e permissões de ação fora desse subconjunto são relatados como degradados enquanto o sinalizador protegido permanece; o amplo conjunto de permissões padrão do Excel também exige uma decisão explícita de perda
A importação OpenDocument retém o sinalizador protegido e os estilos de bloqueio de célula; hashes de senha nativos não são convertidos em hashes do Excel, e metadados de permissão importados não representados continuam sendo uma perda nomeada nos relatórios de conversão seguintes
A exportação AutoFilter aceita seis operadores de comparação escalares, até duas condições escalares por coluna unidas com AND ou OR e um AND entre colunas; listas simples de seleção de valores e seleções em branco com suporte não têm limite de dois valores e continuam sendo metadados nativos de filtro
Critérios escalares numéricos usam valores finitos invariantes; seleções de texto preservam seus caracteres literais, incluindo caracteres curinga dentro de listas de seleção, enquanto expressões curinga em filtros personalizados, critérios Boolean ambíguos, grupos de datas, datas dinâmicas e filtros de cor e ícone não têm conversão equivalente com suporte
Expressões de filtro sem suporte são omitidas como uma expressão completa em vez de enfraquecer condições selecionadas; o intervalo do filtro permanece, e o relatório de conversão identifica os critérios omitidos
Salvamentos de stream ODS preparam o pacote completo em um arquivo temporário registrado antes de gravar na posição original do destino; os bytes de prefixo existentes e os offsets absolutos de ZIP são retidos, incluindo posições além do fim original; cancelamento ou exceção de callback de progresso antes do commit preserva os bytes, o tamanho e a posição do destino e libera o arquivo temporário; a notificação final de gravação continua não cancelável
A importação OpenDocument aceita as mesmas conjunções escalares e disjunções de texto na mesma coluna ou conjuntos de valores; OR entre colunas, expressões regulares, comparações sensíveis a maiúsculas e operadores nativos de filtro sem suporte continuam sendo perdas importadas explícitas
TXLSXOdsImportLoss e TXLSXOdsImportLosses descrevem as categorias privadas de procedência de planilha; os relatórios de conversão usam ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria e ImportedOdsCommentFormatting; eles sobrevivem à cópia de planilhas e aparecem tanto para destinos de conversão OpenDocument quanto Open XML
A conversão de filtros retém metadados e a visibilidade existente das linhas sem aplicar filtros nem recalcular células; aplicativos nativos mantêm a responsabilidade pelo próprio comportamento de filtragem e edição
Fluxos de trabalho relacionados
- Membros estáveis e atualização transacional do cache de Pivot local
- Provedores de query table fornecidos pelo chamador e atualização transacional
- Conversas encadeadas em faixas de relatório repetidas
- Atualização do cache de gráfico e paginação nativa mesclada
- Declarações da pasta de trabalho e métodos de salvamento