2016-04-25 102 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() 
相關問題