希望有人能对此有所了解,因为今天到目前为止,这已经打败了我。
上下文: 我有一个通过 pandas styler 设计的 pandas 数据框,我通过文件对话导出该数据框,以便可以使用 tkinter 通过 Windows 文件对话 GUI 输入正确的扩展名的文件名。
在导出过程中,我使用 xlsxwriter格式化列宽并使用正确的数据类型(GBP 货币字段 £1,234.00)格式化列
列宽和工作表缩放设置完全适用。但是数据类型不适用。
预期结果: £1,234.00
实际结果 1234.00
下面的代码。
with filedialog.asksaveasfile(mode='w', defaultextension=".xlsx", filetypes=[("Excel files", ".xlsx .xls")]) as file:
writer = pd.ExcelWriter(file.name, engine="xlsxwriter")
styler.to_excel(writer, columns=['Consultant','Dept','T/S ID','Client','Candidate','P/E Date','Charge','Pay','Split GP','Split %','Margin%','Comm %','Comm Value','Perm Salary','Placement'], index=False, sheet_name= "561 Comms")
workbook = writer.book
worksheet = writer.sheets['561 Comms']
number_fmt = workbook.add_format({'num_format' : '0'})
money_fmt = workbook.add_format({'num_format' : '£#,##0.00'})
rate_fmt = workbook.add_format({'num_format' : '#0.00%'})
worksheet.set_zoom(80)
worksheet.set_column('G:I', 20, money_fmt)
worksheet.set_column('J:L', 12, rate_fmt)
writer.close()
except AttributeError as ae:
print(ae)
Excel 文件导出并保存得很好 - 只是 number_fmt、money_fmt 和rate_fmt 行似乎无法正常工作。
任何信息或建议将不胜感激! 谢谢
使用 Python xlsxwriter 设置 Excel 列格式
预期结果: £1,234.00
实际结果 1234.00
问题在于你将格式应用于
列宽
而不是
列数据
。
worksheet.set_column()
方法用于设置列宽和基本格式,但它不会将数字格式应用于单元格内容。
为了将数字格式应用于单元格内容,你需要遍历数据并使用
worksheet.write()
方法分别对每个单元格应用格式。
以下是修改后的代码:
import pandas as pd
import xlsxwriter
from tkinter import filedialog
# ... (你的styler和数据框代码)
with filedialog.asksaveasfile(mode='w', defaultextension=".xlsx", filetypes=[("Excel files", ".xlsx .xls")]) as file:
writer = pd.ExcelWriter(file.name, engine="xlsxwriter")
styler.to_excel(writer, columns=['Consultant', 'Dept', 'T/S ID', 'Client', 'Candidate', 'P/E Date', 'Charge', 'Pay', 'Split GP', 'Split %', 'Margin%', 'Comm %', 'Comm Value', 'Perm Salary', 'Placement'], index=False, sheet_name="561 Comms")
workbook = writer.book
worksheet = writer.sheets['561 Comms']
money_fmt = workbook.add_format({'num_format': '£#,##0.00'})
rate_fmt = workbook.add_format({'num_format': '#0.00%'})
# 获取需要格式化的列的索引
money_cols = ['Charge', 'Pay', 'Split GP', 'Comm Value', 'Perm Salary', 'Placement']
rate_cols = ['Split %', 'Margin%', 'Comm %']
money_col_indices = [styler.columns.get_loc(col) for col in money_cols]
rate_col_indices = [styler.columns.get_loc(col) for col in rate_cols]
# 遍历数据并将格式应用于相应的单元格
for row_num, row_data in enumerate(styler.data.itertuples(index=False)):
for col_num, value in enumerate(row_data):
if col_num in money_col_indices:
worksheet.write(row_num + 1, col_num, value, money_fmt)
elif col_num in rate_col_indices:
worksheet.write(row_num + 1, col_num, value, rate_fmt)
else:
worksheet.write(row_num + 1, col_num, value) # 其他列使用默认格式
worksheet.set_zoom(80)
worksheet.set_column('G:I', 20)
worksheet.set_column('J:L', 12)
writer.close()
在这个修改后的代码中:
-
我们首先使用
styler.columns.get_loc()
获取需要格式化的列的索引。 -
然后我们使用
enumerate()
遍历数据框的每一行和单元格。 - 对于每个单元格,我们检查它是否属于需要格式化的列。
-
如果是,我们使用
worksheet.write()
方法并将相应的格式应用于该单元格。 -
如果不是,我们使用
worksheet.write()
方法将值写入单元格,但不应用任何特定格式。
这样就可以将数字格式正确应用于单元格内容了。
标签:python,excel,pandas,tkinter,xlsxwriter From: 78812804