Como @Blackwood já mencionado no comentário, um arquivo .xlsx é apenas um arquivo zip com uma pasta e estrutura de arquivos definidas. Se você quiser saber como o Excel armazena a formatação, renomeie um arquivo do Excel para .zip e descompacte-o. Você verá uma estrutura como esta:
_rels
docProps
xl
+-- _rels
+-- worksheets
| +-- sheet1.xml
+-- sharedStrings.xml
+-- styles.xml <-- this is what you are after :-)
+-- workbook.xml
[Content_Types].xml
Se você quiser aprender sobre formatação e estilos, examine este arquivo. A estrutura geral assim:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<styleSheet
xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<numFmts />
<fonts />
<fills />
<borders />
<cellStyleXfs />
<cellXfs />
<cellStyles />
</styleSheet>
Deixei de fora o conteúdo de cada elemento, mas o elemento numFmts
armazena os formatos Número (e Data etc.). Aqui você também encontra o ID interno de um formato. Vamos dar uma olhada no conteúdo mais simples:
<numFmts count="1">
<numFmt formatCode="GENERAL" numFmtId="164"/>
</numFmts>
Apenas os padrões: temos um formato, o formato "GENERAL". O formato de preenchimento e a cor de segundo plano são armazenamentos no elemento fills
. Eu fiz um exemplo simples:
<fills count="1">
<fill>
<patternFill patternType="solid">
<fgColor rgb="FF00FF00"/>
<bgColor rgb="FF33CCCC"/>
</patternFill>
</fill>
</fills>
Aqui você vê os valores patternType
que você pode especificar e cor. Talvez você queira postar o pacote Python que está usando, porque a maioria dos pacotes é capaz de escrever essas informações de formatação, além de definir a largura das colunas. Desisti de modelos para o meu projeto e escrevi tudo diretamente do Python usando uma DSL muito simples que descreve uma entrada de célula em uma linha de texto que meu script analisa. Parece assim:
<addr>|<content>|<format>|<alignment>|<color>
example:
C2|=A2*B2|#0.00|right|#0000FF@#CCCCCC
A1|"Text"||center|#000000
Torna mais fácil ter apenas uma lista de strings no meu script e usá-lo como modelo. Eu não preciso mais de um template e como temos uma struct spec para o layout e formatação, ninguém pode acidentalmente "melhorar". : -)