python xlsxwriter:添加表时将标题保留在excel中

问题描述 投票:4回答:4

我有一个panda数据帧,我写入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()
python excel pandas xlsxwriter tableheader
4个回答
4
投票

黑客/解决方案是唯一的选择(从@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的第三个解决方案可能是实现它的最佳方式。


1
投票

使用xlsxwriter 0.9.6时,我不得不修改@jmcnamara的hack。我不得不从列数中减去一个,或者最后得到一个不在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()

1
投票

怎么样(请注意,只有在数据框包含NA时才需要'选项'):

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)

workbook = xlsxwriter.Workbook('test.xlsx', options={'nan_inf_to_errors': True})
worksheet = workbook.add_worksheet('sheet1')
worksheet.add_table(0, 0, df.shape[0], df.shape[1]-1,
    {'data': df.values.tolist(),
    'columns': [{'header': c} for c in df.columns.tolist()],
    'style': 'Table Style Medium 9'})
workbook.close()
© www.soinside.com 2019 - 2024. All rights reserved.