首页 > 解决方案 > win32com.client 格式化 Excel 列

问题描述

我正在使用 pandas 将输出数据写入 excel。我想使用 win32com.client 格式化 excel,因为我没有更简单的方法。

我的代码来自一些互联网搜索

    Xlsx = win32.DispatchEx('Excel.Application')
    Xlsx.DisplayAlerts = True
    Xlsx.Visible = True
    book = Xlsx.Workbooks.Open('C:\\temp\\test.xlsx')
    ws = book.Worksheets("Sheet1")
    ws.Columns.NumberFormat = "0,0"
    ws.Columns.AutoFit()
    ws.Range("A1:P1").Interior.ColorIndex = 20
    book.Save()
    book.Close()
    Xlsx.Quit()
    del book
    del Xlsx 

在这里,我不想要所有十进制格式的 excel 列,例如,我想要整数格式的 b、d、f 列和所有其他具有十进制格式的数字数据的列,最多 2 位小数和“中心”中的所有文本我该怎么做?

其次,如果您知道任何其他模块可以轻松实现这种简单的格式化,请建议。

标签: pythonpython-3.xpywin32win32com

解决方案


我意识到这是一个旧线程,但 pandas 有一个 to_excel 方法,允许您直接从数据帧编写 excel 工作簿,而无需使用 win32com。

语法如下所示:

# Establish the writer object
writer = pandas.ExcelWriter("output_spreadsheet.xlsx", engine="xlsxwriter")

# Assign the dataframe to an excel sheet
df.to_excel(writer, sheet_name="something meaningful", index=False)

# Save the file
writer.save()

现在,由于您要指定要显示的小数位数,您可以通过两种不同的方式来执行此操作。您可以使用@Kruzchy Klaperman 指定的方法(快速且易于阅读),也可以使用 xlsxwriter 设置表单样式,我们在创建 excel writer 对象时将其指定为引擎,甚至可以使用 pandas赋值方法。第二种方法也可用于格式化输出,使值居中。

让我们想象一种结合这两种方法的方法,因为它是最干净的:

# Again, establish the writer object first
writer = pd.ExcelWriter("output_spreadsheet.xlsx", engine="xlsxwriter")

# Assign the dataframe to a workbook worksheet again and assign the column types all in one go
df.assign(
    "column_a"=lambda x: x.column_b.astype(float).round(2),
    "column_b"=lambda x: x.column_b.astype(int)
).to_excel(writer, sheet_name="Data", index=False)

# create the workbook and worksheet objects for xlsxwriter
workbook = writer.book
sheet = writer.sheets["Data"]

# create a workbook format object for integers, floats, and other types
int_frmt = workbook.add_format({
    "align": "center",
    "num_format": "#,##0"
})
flt_frmt = workbook.add_format({
    "align": "center",
    "num_format": "#,##0.00"
})
gnrl_frmt = workbook.add_format({
    "align": "center"
})


# add your column headers to the formatted workbook
for column, value in enumerate(pivot.columns.values):
    sheet.write(0, column, value)
# loop through the dataframe formating each cell depending on its value
for row, values in enumerate(df.values):
    for column, value in enumerate(values):
        if type(value) == int:
            sheet.write(row, column, value, int_frmt)
        elif type(value) == float:
            sheet.write(row, column, value, flt_frmt)
        else:
            sheet.write(row, column, value, gnrl_frmt)

# Save the writer object
writer.save()

有关使用 xlsx 编写器格式化 excel 工作簿的更多信息,请查看此处的文档。


推荐阅读