Fórmulas e objetos de folhas de cálculo XLSB
A facade XLSX do livro lê e escreve um subconjunto XLSB validado com valores com tipo, fórmulas comuns em cache, nomes, estilos comuns e objetos de folhas de cálculo representados; o estado não representado provoca rejeição antes da saída para o destino
Abrir e gravar
if Workbook.Open('values.xlsb') <> 1 then
raise Exception.Create('XLSB input is unsupported or invalid');
if Workbook.SaveAsChecked('values-copy.xlsb', xlsxExcelBinaryWorkbook) <> 1 then
raise Exception.Create('XLSB output is unsupported or failed');
O Open deteta o conteúdo e o tipo registado da parte do livro; uma entrada binária bem sucedida define SourceFormat=xlsxExcelBinaryWorkbook, enquanto os quatro ordinais originais de TXLSXFileFormat permanecem inalterados e o novo membro tem o ordinal 4
As sobrecargas de SaveAs e SaveAsChecked para ficheiro e stream aceitam o formato binário explicitamente; a gravação predefinida continua a selecionar o formato comum de livro Open XML, independentemente da extensão do nome de ficheiro
O GetConversionReport(xlsConversionExcelBinaryWorkbook) inspeciona o estado atual sem expandir o armazenamento comprimido de células; as entradas não suportadas continuam a ser falhas obrigatórias mesmo para gravação não verificada ou AllowLossy=True
Estado suportado
- Folhas de cálculo comuns, nomes e cadeias Unicode, números, valores Boolean, células em branco e em branco com estilo, e valores de erro comuns representáveis
- Entradas de cadeias partilhadas e inline, registos nativos compactos numéricos e de células curtas, visibilidade de folhas de cálculo, a flag de sistema de datas, vistas e seleções comuns de livros e folhas de cálculo
- Tipos de letra comuns, preenchimentos de padrão, limites de margens, formatos numéricos, referências de formatos de células, flags de alinhamento e proteção, e cores RGB, de tema e indexadas representadas
- Alturas de linhas, larguras de colunas, flags de dimensões suportadas e margens de página
- Fórmulas de células comuns usando tokens legados de funções suportados, operadores escalares, referências A1, referências de folha única no mesmo livro e nomes de livros ou folhas de cálculo, com caches numéricas, de cadeia, Boolean e de erros comuns
- Nomes definidos globais e com âmbito de folha de cálculo, flags e comentários de nomes ocultos, células unidas, hiperligações comuns externas e internas, painéis divididos ou congelados e seleções de painéis
- Intervalos de AutoFilter, comparações personalizadas escalares com um ou dois critérios AND/OR, e listas arbitrárias de valores selecionados com uma seleção em branco opcional
- Tabelas de folhas de cálculo comuns com identidade, intervalo, visibilidade de cabeçalho e linha de totais, identidade e legendas de colunas, legendas literais de linhas de totais, critérios de AutoFilter representados e flags de estilos de tabelas incorporados
- Compressão ZIP configurada e carimbos temporais ZIP determinísticos através das opções existentes do livro
O relatório de conversão cobre as funcionalidades do modelo vivo, e a validação completa do pacote continua a ser a última barreira para referências inválidas, registos malformados, atributos desconhecidos ou conteúdo retido não suportado
A importação binária retém o tipo de letra predefinido explícito do ficheiro e os formatos numéricos incorporados suportados, incluindo células em branco com estilo; os formatos numéricos dependentes do locale exigem um código de formato explícito, para que o leitor não adivinhe a formatação regional
Fronteiras explícitas
Registos de fórmulas partilhadas, detenção de matrizes e matrizes dinâmicas, constantes de matriz e funções que devolvem matrizes, funções futuras, funções definidas pelo utilizador, referências a livros externos e a várias folhas, VBA, ligações de dados externas, PivotTables e Slicers, gráficos e desenhos, comentários e texto formatado, validação, formatação condicional e metadados avançados de página ou de extensão ficam fora deste backend
Colunas calculadas de tabelas, fórmulas de agregação de totais, estado de ordenação, formatação diferencial ou personalizada de tabelas, tabelas vinculadas a consultas e mapeamentos XML provocam rejeição; os filtros de cor, ícone, dinâmicos e de grupos de datas, critérios personalizados nativos Boolean com tipo, critérios personalizados nativos de cadeias com aparência numérica e substituições de visibilidade de botões de filtro também provocam rejeição
Os critérios importados de filtros de folhas de cálculo não personalizados são retidos como RawXml; as comparações personalizadas preenchem as propriedades existentes de critérios com tipo, enquanto os valores selecionados e a seleção em branco continuam a ser um critério suportado por XML em vez de uma nova API com tipo de listas de valores
A conversão de tokens de fórmulas preserva a semântica e as flags de referências; pode normalizar o texto de fórmulas com parênteses e nomes de folhas entre aspas, pelo que a identidade byte a byte do texto não é prometida
A saída de fórmulas exige uma cache explícita numérica, de cadeia, Boolean ou de erro comum; uma cache em falta provoca rejeição quando a política de gravação não recalcula, incluindo xrmManual e um grafo de dependências limpo com xrmIfDirty; as aplicações podem chamar Recalculate ou selecionar xrmAlways antes de gravar, e a cadeia vazia, False e o zero numérico são caches válidas
As propriedades de cálculo têm de usar predefinições suportadas; cálculo manual, iteração, precisão reduzida, modo de referência alternativo, cálculo forçado ou incompleto, configuração explícita de threads e outras definições significativas diferentes das predefinidas provocam rejeição
As cadeias de cálculo e os índices binários de células são metadados regenerados e não são copiados através da ponte do pacote; registos de funcionalidades ou relações desconhecidos continuam a ser falhas em vez de se tornarem partes Open XML fabricadas
A entrada binária exige o carregamento imediato de folhas completas; MetadataOnly e uma lista SelectedSheets não vazia provocam rejeição antes de substituir o modelo existente, porque o carregamento lazy exigiria um arquivo convertido retido
Garantias de falha e detenção
Os pacotes binários são validados e convertidos antes de o parser XML comum repor o livro; entrada não suportada, conteúdo binário malformado, modos de leitura rejeitados e cancelamento da conversão preservam os objetos existentes da folha de cálculo, o nome de ficheiro, o formato de origem e a ligação ao arquivo de origem
Depois de a conversão binária validada entrar no parser XML existente, falhas tardias de análise XML ou de callbacks da aplicação seguem o ciclo de vida comum de abertura XML; a garantia de preflight não promete a reversão de escritas arbitrárias de callbacks
A gravação prepara o pacote binário inteiro; a saída para ficheiro usa um ficheiro temporário irmão e uma única substituição final, e a saída para stream legível e com capacidade de posicionamento retém uma snapshot de bytes, tamanho e posição para reversão após uma falha de commit
O LastSaveUsedStreaming=False reflete a preparação binária completa mesmo quando o escritor XML intermédio faz streaming; a memória inclui as partes convertidas e o pacote completo, por isso este backend não é um escritor de streaming de memória limitada
Os relatórios de conversão e o preflight retêm o armazenamento comprimido de células, incluindo uma mistura de valores comprimidos e fórmulas materializadas; a gravação bem sucedida pode expandir valores comprimidos através da preparação de estilos existente e do escritor de folhas de cálculo, pelo que a pureza do relatório não implica uma operação de gravação imutável ou sem materialização
A gravação binária bem sucedida em ficheiro limpa as ligações de origem anteriores de XML bruto; a gravação em stream retém o comportamento de nome de ficheiro, e o cancelamento é verificado antes do commit no destino
APIs de conversão de pacotes
procedure XlsbToOpenXml(Source: TZipArchive; Destination: TStream; CancelCheck: TXLSStreamCancelCheck = nil; EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0); procedure OpenXmlToXlsb(Source: TZipArchive; Destination: TStream; CancelCheck: TXLSStreamCancelCheck = nil; EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0); function XlsbStylesToXml(const Data: AnsiString): AnsiString; function XlsbStylesFromXml(const Data: AnsiString): AnsiString; function XlsbStringsToXml(const Data: AnsiString): AnsiString; function XlsbStringsFromXml(const Data: AnsiString): AnsiString;
O TXlsbFormulaValidator.Create(WorkbookXml) valida o contexto de nomes do livro e o Validate(FormulaText, SheetIndex) valida uma fórmula sem acesso às células da folha de cálculo; o SheetIndex é de base zero e o chamador é o detentor do validador
O XlsbValidateTableXml(Data) e o XlsbValidateAutoFilterXml(Data) validam XML de objetos UTF-8 contra os mesmos contratos de codificador usados pela saída do pacote; as falhas lançam as exceções existentes de formato ou de funcionalidade não suportada
Estas APIs de lxXlsb retêm a detenção do chamador; a conversão do pacote valida e prepara todas as partes antes de substituir o Destination a partir do offset zero, e as pontes de partes centrais usam XML UTF-8 e bytes binários brutos
O EXlsbUnsupported deriva de EXlsbFormatError e distingue a rejeição esperada do subconjunto de dados malformados; o cancelamento lança a exceção estabelecida de cancelamento de streams antes do commit
A compressão aceita -1 a 9, e a data fixa aceita zero ou uma data finita representável em DOS de 1980 a 2107; opções inválidas provocam rejeição antes de mudar o destino