python xlsxwriter:在添加表格时,在Excel中保留标题

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

例:

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() 

黑客/解决办法是唯一的select(从@ 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() 

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

没有。

您在worksheet_table_header第三个解决scheme可能是实现它的最好方法。

在使用xlsxwriter 0.9.6版本时,我不得不通过@jmcnamara来修改这个黑客行为。 我不得不从列数中减去一个,或者结束了一个不在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()