I am trying to write a pandas DataFrame
to an .xlsx
file where different numerical columns would have different formats. For example, some would show o
You can do this with Pandas 0.16 and the XlsxWriter engine by accessing the underlying workbook and worksheet objects:
import pandas as pd
# Create a Pandas dataframe from some data.
df = pd.DataFrame(zip(
[1010, 2020, 3030, 2020, 1515, 3030, 4545],
[.1, .2, .33, .25, .5, .75, .45],
[.1, .2, .33, .25, .5, .75, .45],
))
# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
# Get the xlsxwriter objects from the dataframe writer object.
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# Add some cell formats.
format1 = workbook.add_format({'num_format': '#,##0.00'})
format2 = workbook.add_format({'num_format': '0%'})
format3 = workbook.add_format({'num_format': 'h:mm:ss AM/PM'})
# Set the column width and format.
worksheet.set_column('B:B', 18, format1)
# Set the format but not the column width.
worksheet.set_column('C:C', None, format2)
worksheet.set_column('D:D', 16, format3)
# Close the Pandas Excel writer and output the Excel file.
writer.save()
Output:
See also Working with Python Pandas and XlsxWriter.
As you rightly point out applying formats to individual cells is extremely inefficient.
openpyxl 2.4 includes native support for Pandas Dataframes and named styles.
https://openpyxl.readthedocs.io/en/latest/changes.html#id7