2016-04-25 5 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でハックを変更する必要がありました。私は列の数から1つを減算するか、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() 
関連する問題