2016-04-25 101 views
3

我有一个熊猫数据框,我写入到一个xslx文件,并且希望为该数据添加一个表格。我还想保留已经写好的标题,而不是再次添加它们。那可能吗?python xlsxwriter:在添加表格时在Excel中保留标题

例子:

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

回答

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

我也想继续,而不是再次加入他们,我已经写了头。那可能吗?

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

+0

好的 - 感谢一个很棒的python软件包! – Doellner

0

我必须在使用xlsxwriter 0.9.6版时修改@jmcnamara的黑客行为。我不得不从列数中减去一个,或者结束了一个不在pandas.DataFrame中的额外列(请参阅end_column分配)。下面的修改版本(熊猫版本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() 
相关问题