python - 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 位小数和“中心”中的所有文本我该怎么做?
其次,如果您知道任何其他模块可以轻松实现这种简单的格式化,请建议。
解决方案
我意识到这是一个旧线程,但 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 工作簿的更多信息,请查看此处的文档。
推荐阅读
- reactjs - 无法在 React 中按 ID 呈现/返回 MongoDB 记录
- c++ - 我想用 CMake 生成和编译 Visual Studio projet 我需要从构建中排除单元测试文件。有没有办法做到这一点?
- node.js - websockets是否与谷歌应用引擎灵活环境的多个实例共享数据?
- java - HAPI - 也是规范的自定义模型类?
- java - 为什么读数千分尺测量有时会返回 NaN?
- function - 可以为函数类型创建方法吗?
- ios - 从应用扩展访问 iOS 应用内购买
- javascript - 使用 connectedCallback() 会破坏 Web 组件
- node.js - 使用 node.js 获取带有所有者信息的文件元数据
- c# - 如何使用 Dapper 使用 WILDCARD