2016-04-25 12 views
3

У меня есть фрейм данных panda, который я пишу в файл 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

Я также хотел бы сохранить заголовки, которые я уже написал, а не добавлять их снова. Это возможно?

No.

Ваше третье решение в worksheet_table_header, вероятно, лучший способ его реализации.

+0

ОК - и спасибо за удивительный пакет python! – Doellner

0

мне пришлось изменить хак по @jmcnamara при использовании xlsxwriter версии 0.9.6. Мне пришлось вычесть один из числа столбцов, или я закончил с дополнительным столбцом, который не был в 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()