首页 > 编程问答 >num_format 不适用于 Excel 列

num_format 不适用于 Excel 列

时间:2024-07-31 08:37:06浏览次数:11  
标签:python excel pandas tkinter xlsxwriter

希望有人能对此有所了解,因为今天到目前为止,这已经打败了我。

上下文: 我有一个通过 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()

在这个修改后的代码中:

  1. 我们首先使用 styler.columns.get_loc() 获取需要格式化的列的索引。
  2. 然后我们使用 enumerate() 遍历数据框的每一行和单元格。
  3. 对于每个单元格,我们检查它是否属于需要格式化的列。
  4. 如果是,我们使用 worksheet.write() 方法并将相应的格式应用于该单元格。
  5. 如果不是,我们使用 worksheet.write() 方法将值写入单元格,但不应用任何特定格式。

这样就可以将数字格式正确应用于单元格内容了。

标签:python,excel,pandas,tkinter,xlsxwriter
From: 78812804

相关文章

  • 具有自引用的类装饰器的 Python 类型提示
    我的最终目标是编写一个系统来轻松记录函数调用(特别是类方法)。我首先编写一个带有包装方法的类Loggable,该方法允许我装饰子类方法并记录它们的调用|||现在我可以编写子类并记录它们的调用:Param=ParamSpec("Param")RetType=TypeVar("RetType")CountType=......
  • Pandas:样式列标题
    我正在使用pandasstyler根据列标题的名称为某些列提供背景颜色。虽然这按预期工作,但列标题的背景颜色不会改变。这是我的脚本中应用样式的部分:defhighlight_col(x):ifx.nameinadded_columns:return['background-color:#67c5a4']*x.shape[0]......
  • 有没有办法根据 Pandas GroupBy 的计数在 2 个数据帧之间重复分配值?
    我有两个结构相同但形状和值不同的Pandas数据框:importpandasaspddataframe_1=pd.DataFrame({'customer_id':['id1','id2','id3','id4','id5','id6'],'gender':[......
  • 如何在 pandas 中设置列​​标题的样式?
    假设我有一个带有列标题“A”和“B”的2x2DataFrame:importpandasaspddata_style=[['background-color:#fdfd96',''],['','background-color:#fdfd96']]df=pd.DataFrame([[1,2],[3,4]],columns=["A",&qu......
  • 如何在for循环中使用curve_fit函数在python中一次性创建多个回归?
    简而言之,我有两个矩阵,一个称为t,另一个称为y。每个都有7列。假设它们被称为a、b、c、d、e、f和g。我想要的是从a对a、b对b、...、g对g这两个矩阵进行回归。我已经设法使我的算法使用curve_fit对一列进行回归一次。但我真正希望的是它能够一次性完成7个回归......
  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......