Estou sendo solicitado a gerar alguns relatórios do Excel. No momento, estou usando bastante o pandas para meus dados, então, naturalmente, gostaria de usar o método pandas.ExcelWriter para gerar esses relatórios. No entanto, as larguras fixas das colunas são um problema.
O código que tenho até agora é bastante simples. Digamos que eu tenha um dataframe chamado 'df':
writer = pd.ExcelWriter(excel_file_path, engine='openpyxl')
df.to_excel(writer, sheet_name="Summary")
Eu estava examinando o código do pandas e não vejo nenhuma opção para definir as larguras das colunas. Existe algum truque no universo para fazer com que as colunas se ajustem automaticamente aos dados? Ou há algo que posso fazer após o fato no arquivo xlsx para ajustar as larguras das colunas?
(Estou usando a biblioteca OpenPyXL e gerando arquivos .xlsx - se isso fizer alguma diferença.)
Obrigado.
to_excel
, talvezcol_style=dict
que contenha elementos de estilo de cabeçalho col (em vez do padrãoheader_style
que parece estar codificado agoraRespostas:
Inspirado pela resposta do usuário6178746 , tenho o seguinte:
fonte
worksheet.set_column(idx+nlevels, idx+nlevels, max_len)
. Caso contrário, o comprimento é calculado para a primeira coluna do quadro e, em seguida, aplicado à primeira coluna do Excel, que provavelmente é o índice.enumerate(df)
deve ser,enumerate(df.columns)
já que você está iterando cada coluna emdf
.dict
realmente itera sobre as chaves nodict
(você não precisa dizer manualmentedict.keys()
), iterar sobre apd.DataFrame
itera sobre as colunas. Você não precisa iterar manualmentedf.columns
.Estou postando isso porque acabei de ter o mesmo problema e descobri que a documentação oficial do Xlsxwriter e do pandas ainda tem essa funcionalidade listada como sem suporte. Eu criei uma solução que resolveu o problema que eu estava tendo. Basicamente, eu apenas itero por cada coluna e uso worksheet.set_column para definir a largura da coluna == o comprimento máximo do conteúdo dessa coluna.
Uma nota importante, entretanto. Esta solução não cabe nos cabeçalhos das colunas, apenas nos valores das colunas. Essa deve ser uma mudança fácil se você precisar ajustar os cabeçalhos. Espero que isso ajude alguém :)
fonte
()
função max: `max (column_len (), len (col)) + 2`Provavelmente não há uma maneira automática de fazer isso agora, mas como você usa openpyxl, a seguinte linha (adaptada de outra resposta do usuário Bufke sobre como fazer manualmente ) permite que você especifique um valor lógico (em larguras de caracteres):
fonte
column_dimensions
atributo. Se você quiser continuar usando o openpyxl, simplesmente especifique-o ao criar o gravador usandopd.ExcelWriter(excel_filename, engine='openpyxl')
Xlsxwriter
como mecanismo para ver como especificar a largura da coluna com o mecanismo padrão de hoje.Há um bom pacote que comecei a usar recentemente chamado StyleFrame.
obtém DataFrame e permite estilizá-lo com muita facilidade ...
por padrão, a largura das colunas é ajustada automaticamente.
por exemplo:
você também pode alterar a largura das colunas:
ATUALIZAR
Na versão 1.4, o
best_fit
argumento foi adicionadoStyleFrame.to_excel
. Veja a documentação .fonte
best_fit
parâmetro. Além disso, quando tentei fazer isso, obtive resultados muito ruins .index
parâmetro mas nenhum dado.sf.apply_headers_style(Styler(bold=False))
demorei muito para descobrir isso. E na declaração de importaçãofrom StyleFrame import StyleFrame, Styler
,. aqui estão todas as opções, exceto negrito: styleframe.readthedocs.io/en/2.0.5/…Usando pandas e xlsxwriter você pode fazer sua tarefa, o código abaixo funcionará perfeitamente em Python 3.x. Para obter mais detalhes sobre como trabalhar com XlsxWriter com pandas, este link pode ser útil https://xlsxwriter.readthedocs.io/working_with_pandas.html
fonte
Descobri que era mais útil ajustar a coluna com base no cabeçalho da coluna do que no conteúdo da coluna.
Usando,
df.columns.values.tolist()
eu gero uma lista dos cabeçalhos das colunas e uso os comprimentos desses cabeçalhos para determinar a largura das colunas.Veja o código completo abaixo:
fonte
No trabalho, estou sempre gravando os dataframes em arquivos do Excel. Portanto, em vez de escrever o mesmo código repetidamente, criei um módulo. Agora, acabei de importá-lo e usá-lo para escrever e formatar os arquivos do Excel. Há uma desvantagem, porém, leva muito tempo se o dataframe for muito grande. Então, aqui está o código:
fonte
Ajuste dinamicamente todos os comprimentos das colunas
Ajuste manualmente uma coluna usando o nome da coluna
Ajuste manualmente uma coluna usando o Índice de coluna
Caso alguma das opções acima esteja falhando com
certifique-se de instalar
xlsxwriter
:fonte
Combinando as outras respostas e comentários e também suportando vários índices:
fonte
fonte
A solução mais fácil é especificar a largura da coluna no método set_column.
fonte
fonte