【问题标题】:pandas xlsxwriter, format headerpandas xlsxwriter,格式头
【发布时间】:2016-08-10 05:03:24
【问题描述】:

我正在使用 xlsxwriter 将 pandas DataFrame 保存为 to_excel。除了更改标题的字体外,我已经设法格式化所有数据(设置列宽、字体大小等),但我找不到这样做的方法。这是我的例子:

import pandas as pd
data = pd.DataFrame({'test_data': [1,2,3,4,5]})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

data.to_excel(writer, sheet_name='test', index=False)

workbook  = writer.book
worksheet = writer.sheets['test']

font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})

worksheet.set_column('A:A', None, font_fmt)
worksheet.set_row(0, None, header_fmt)

writer.save()

尝试设置标题格式的倒数第二行没有任何作用。

【问题讨论】:

    标签: python excel pandas format xlsxwriter


    【解决方案1】:

    我认为您需要先重置默认标题样式,然后您可以更改它:

    pd.core.format.header_style = None
    

    大家一起:

    import pandas as pd
    
    data = pd.DataFrame({'test_data': [1,2,3,4,5]})
    writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
    
    pd.core.format.header_style = None
    
    data.to_excel(writer, sheet_name='test', index=False)
    
    workbook  = writer.book
    worksheet = writer.sheets['test']
    
    font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
    header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})
    
    worksheet.set_column('A:A', None, font_fmt)
    worksheet.set_row(0, None, header_fmt)
    
    writer.save()
    

    jmcnamara解释,谢谢:

    在 Excel 中,单元格格式覆盖行格式覆盖列格式。pd.core.format.header_style 被转换为格式并应用于标题中的每个单元格。因此,set_row() 不能覆盖默认值。将pd.core.format.header_style 设置为None 意味着标题单元格没有用户定义的格式,因此可以被set_row() 覆盖。

    编辑:在 0.18.1 版本中,您必须更改

    pd.core.format.header_style = None
    

    到:

    pd.formats.format.header_style = None
    

    编辑:从 0.20 版开始,这又发生了变化

    import pandas.io.formats.excel
    pandas.io.formats.excel.header_style = None
    

    感谢krvkir

    编辑:从 0.24 版开始,现在需要此功能

    import pandas.io.formats.excel
    pandas.io.formats.excel.ExcelFormatter.header_style = None
    

    感谢Chris Vecchio

    【讨论】:

    【解决方案2】:

    在 pandas 0.20 中,接受答案的解决方案再次改变。

    应该设置为无的格式可以在以下位置找到:

    pandas.io.formats.excel.header_style
    

    【讨论】:

      【解决方案3】:

      针对看到这篇文章并使用 Pandas 0.20.1 的任何人的更新。

      现在好像是需要的代码

      import pandas.io.formats.excel
      pandas.io.formats.excel.header_style = None
      

      显然excel 子模块不会自动导入,因此仅尝试pandas.io.formats.excel.header_style = None 会引发AttributeError

      【讨论】:

        【解决方案4】:

        对于熊猫 0.24:

        以下不再起作用:

        import pandas.io.formats.excel
        pandas.io.formats.excel.header_style = None
        

        相反,创建一个单元格格式对象,并使用新的单元格格式对象一次一个单元格重写第一行的内容(您的标题)。
        现在,你是未来的证明。

        使用以下伪代码:

        # [1] write df to excel as usual
        writer = pd.ExcelWriter(path_output, engine='xlsxwriter')
        df.to_excel(writer, sheet_name, index=False)
        
        # [2] do formats for other rows and columns first
        
        # [3] create a format object with your desired formatting for the header, let's name it: headercellformat
        
        # [4] write to the 0th (header) row **one cell at a time**, with columnname and format
        for columnnum, columnname in enumerate(list(df.columns)):
            worksheet.write(0, columnnum, columnname, headercellformat)
        

        【讨论】:

        【解决方案5】:

        Pandas 0.25(可能也是 0.24)的另一个选项。可能不是最好的方法,但它对我有用。

        import pandas.io.formats.excel
        pandas.io.formats.excel.ExcelFormatter.header_style = None
        

        【讨论】:

          【解决方案6】:

          如果您不想完全为 pandas 设置标题样式,您也可以将 header=False 传递给 ExcelWriter

          import pandas as pd
          import numpy as np
          
          df = pd.DataFrame(np.random.rand(3, 5), 
                            columns=pd.date_range('2019-01-01', periods=5, freq='M'))
          
          file_path='output.xlsx'
          writer = pd.ExcelWriter(file_path, engine='xlsxwriter')
          df.to_excel(writer, sheet_name='Sheet1', header=False, index=False )
          workbook = writer.book
          fmt = workbook.add_format({'num_format': 'mm/yyyy', 'bold': True})
          worksheet = writer.sheets['Sheet1']
          worksheet.set_row(0, None, fmt)
          writer.save()
          

          【讨论】:

            【解决方案7】:

            不幸的是 add_format 不再可用

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-02-16
              • 1970-01-01
              • 1970-01-01
              • 2023-03-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多