【问题标题】:python xlsxwriter: Keep header in excel when adding a tablepython xlsxwriter:添加表格时在excel中保留标题
【发布时间】:2016-08-18 18:32:39
【问题描述】:

我有一个写入 xslx 文件的 panda 数据框,并希望在该数据上添加一个表。我还想保留我已经写过的标题,而不是再次添加它们。这可能吗?

例子:

import pandas as pd
import xlsxwriter as xw

# random dataframe
d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']), 'two' : pd.Series([5., 6., 7., 8.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)


# write data to file
writer = pd.ExcelWriter("test.xlsx", engine='xlsxwriter')
df.to_excel(writer,"sheet without table")
df.to_excel(writer,"sheet with table")
df.to_excel(writer,"sheet with table and header")

# get sheets to add the tables
workbook  = writer.book
worksheet_table = writer.sheets['sheet with table']
worksheet_table_header = writer.sheets['sheet with table and header']

# the range in which the table is
end_row = len(df.index)
end_column = len(df.columns)
cell_range = xw.utility.xl_range(0, 0, end_row, end_column)


# add the table that will delete the headers
worksheet_table.add_table(cell_range,{'header_row': True,'first_column': True})

######################################
# The hack

# Using the index in the Table
df.reset_index(inplace=True)
header = [{'header': di} for di in df.columns.tolist()]
worksheet_table_header.add_table(cell_range,{'header_row': True,'first_column': True,'columns':header})

writer.save()

【问题讨论】:

    标签: python excel pandas xlsxwriter tableheader


    【解决方案1】:

    这个怎么样(请注意,只有当数据框包含 NA 时才需要“选项”):

    import pandas as pd
    import xlsxwriter
    
    # random dataframe
    d = {'one':pd.Series([1., 2., 3.]), 'two':pd.Series([5., 6., 7., 8.])}
    df = pd.DataFrame(d)
    
    workbook = xlsxwriter.Workbook('test.xlsx', options={'nan_inf_to_errors': True})
    worksheet = workbook.add_worksheet('sheet1')
    worksheet.add_table(0, 0, df.shape[0], df.shape[1]-1,
        {'data': df.values.tolist(),
        'columns': [{'header': c} for c in df.columns.tolist()],
        'style': 'Table Style Medium 9'})
    workbook.close()
    

    【讨论】:

      【解决方案2】:

      在使用 xlsxwriter 版本 0.9.6 时,我不得不修改 @jmcnamara 的 hack。我必须从列数中减去一个,否则我会得到一个不在 pandas.DataFrame 中的额外列(请参阅 end_column 分配)。修改版本如下(pandas 版本 0.19.2)。

      import pandas as pd
      import xlsxwriter
      
      # random dataframe
      d = {'one':pd.Series([1., 2., 3.]), 'two':pd.Series([5., 6., 7., 8.])}
      df = pd.DataFrame(d)
      print df
      
      # write data to file
      writer = pd.ExcelWriter("test.xlsx", engine='xlsxwriter')
      df.to_excel(writer, 'sheet1', index=False)
      
      # get sheets to add the tables
      ws = writer.sheets['sheet1']
      
      # the range in which the table is
      end_row = len(df.index)
      end_column = len(df.columns) - 1
      cell_range = xlsxwriter.utility.xl_range(0, 0, end_row, end_column)
      
      ######################################
      # The hack
      header = [{'header': c} for c in df.columns.tolist()]
      ws.add_table(cell_range,{'header_row': True, 'columns':header, 'style':'Table Style Medium 11'})
      ws.freeze_panes(1, 1)
      writer.save()
      writer.close()
      

      【讨论】:

        【解决方案3】:

        破解/变通是唯一的选择(从@jmcnamara 可以看出)。简而言之就是:

        import pandas as pd
        import xlsxwriter as xw
        
        # random dataframe
        d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']), 'two' : pd.Series([5., 6., 7., 8.], index=['a', 'b', 'c', 'd'])}
        df = pd.DataFrame(d)
        
        
        # write data to file
        writer = pd.ExcelWriter("test.xlsx", engine='xlsxwriter')
        df.to_excel(writer,"sheet with table and header")
        
        # get sheets to add the tables
        workbook  = writer.book
        worksheet_table_header = writer.sheets['sheet with table and header']
        
        # the range in which the table is
        end_row = len(df.index)
        end_column = len(df.columns)
        cell_range = xw.utility.xl_range(0, 0, end_row, end_column)
        
        ######################################
        # The hack
        
        # Using the index in the Table
        df.reset_index(inplace=True)
        header = [{'header': di} for di in df.columns.tolist()]
        worksheet_table_header.add_table(cell_range,{'header_row': True,'first_column': True,'columns':header})
        
        writer.save()
        

        【讨论】:

        • 如何避免写索引?
        【解决方案4】:

        我还想保留我已经编写的标题,而不是再次添加它们。这可能吗?

        没有。

        worksheet_table_header 中的第三个解决方案可能是实现它的最佳方式。

        【讨论】:

          猜你喜欢
          • 2020-12-04
          • 2016-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-21
          • 2017-12-19
          • 1970-01-01
          • 2018-12-26
          相关资源
          最近更新 更多