Orlando, miembro de este gran equipo de trabajo, nos ha hecho el favor de redactar este tutorial ya que domina perfectamente el tema.
Solución:
Puedes hacerlo con Pandas también. Aquí hay un ejemplo:
import pandas as pd
df = pd.DataFrame(
'city': ['New York', 'London', 'Prague'],
'population': [19.5, 7.4, 1.3],
'date_of_birth': ['1625', '43', 'early 8th century'],
'status_of_magnetism': ['nice to visit', 'nice to visit', 'definetely MUST visit']
)
# initialize ExcelWriter and set df as output
writer = pd.ExcelWriter(r'D:tempsample.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Cities', index=False)
# worksheet is an instance of Excel sheet "Cities" - used for inserting the table
worksheet = writer.sheets['Cities']
# workbook is an instance of the whole book - used i.e. for cell format assignment
workbook = writer.book
Luego defina el formato de una celda (es decir, gire el texto, establezca la alineación vertical y horizontal) a través de workbook.add_format
header_cell_format = workbook.add_format()
header_cell_format.set_rotation(90)
header_cell_format.set_align('center')
header_cell_format.set_align('vcenter')
Después…
# create list of dicts for header names
# (columns property accepts 'header': value as header name)
col_names = ['header': col_name for col_name in df.columns]
# add table with coordinates: first row, first col, last row, last col;
# header names or formatting can be inserted into dict
worksheet.add_table(0, 0, df.shape[0], df.shape[1]-1,
'columns': col_names,
# 'style' = option Format as table value and is case sensitive
# (look at the exact name into Excel)
'style': 'Table Style Medium 10'
)
Alternativamente worksheet.add_table('A1:D'.format(shape[0]), ...)
se puede usar, pero para df con más columnas o posición de inicio desplazada, las combinaciones AA, AB, … tendrían que calcularse (en lugar de “D”)
Y, por último, el siguiente bucle reescribe los encabezados y aplica el formato header_cell_. que ya hicimos en worksheet.add_table(...)
y parece redundante, pero esta es una forma de usar Excel Autoajustar opción: sin esto, todas las celdas del encabezado tendrían un ancho predeterminado (o la altura de la celda si usa la rotación de 90 grados) y, por lo tanto, no se vería todo el contenido o se tendría que aplicar set_shrink () … y luego el contenido sería no ser legible :). (probado en Office 365)
# skip the loop completly if AutoFit for header is not needed
for i, col in enumerate(col_names):
# apply header_cell_format to cell on [row:0, column:i] and write text value from col_names in
worksheet.write(0, i, col['header'], header_cell_format)
# save writer object and created Excel file with data from DataFrame
writer.save()
OK, después de buscar en la web, me di cuenta de que con xlwt
no es posible hacerlo, pero con XlsxWriter
es posible y muy fácil y conveniente.