以下は再現可能であり、目的の出力を生成します。
import xlsxwriter, pandas as pd
workbook = xlsxwriter.Workbook('pandas_with_rich_strings.xlsx')
worksheet = workbook.add_worksheet()
# Set up some formats to use.
bold = workbook.add_format({'bold': True})
italic = workbook.add_format({'italic': True})
red = workbook.add_format({'color': 'red'})
df = pd.DataFrame({
'numCol': [1, 50, 327],
'plainText': ['plain', 'text', 'column'],
'richText': [
['This is ', bold, 'bold'],
['This is ', italic, 'italic'],
['This is ', red, 'red']
]
})
headRows = 1
for colNum in range(len(df.columns)):
xlColCont = df[df.columns[colNum]].tolist()
worksheet.write_string(0, colNum , str(df.columns[colNum]), bold)
for rowNum in range(len(xlColCont)):
if df.columns[colNum] == 'numCol':
worksheet.write_number(rowNum+headRows, colNum , xlColCont[rowNum])
Elif df.columns[colNum] == 'richText':
worksheet.write_rich_string(rowNum+headRows, colNum , *xlColCont[rowNum])
else:
worksheet.write_string(rowNum+headRows, colNum , str(xlColCont[rowNum]))
workbook.close()
ただし、各列を反復処理せずに同じことを行い、pandasデータフレーム全体を一度にExcelファイルに書き込むand write_rich_string
フォーマットを含めますか?
以下は動作しません。
writer = pd.ExcelWriter('pandas_with_rich_strings.xlsx', engine='xlsxwriter')
workbook = xlsxwriter.Workbook('pandas_with_rich_strings.xlsx')
worksheet = workbook.add_worksheet('pandas_df')
df.to_Excel(writer,'pandas_df')
writer.save()
私の答えがあなたの答えよりもはるかに優れているかどうかはわかりませんが、forループを1つだけ使用するように切り詰め、pandas.DataFrame.to_Excel()
を使用して最初にデータフレームをExcelに配置しました。次に、worksheet.write_rich_string()
を使用して最後の列を上書きすることに注意してください。
import pandas as pd
writer = pd.ExcelWriter('pandas_with_rich_strings.xlsx', engine='xlsxwriter')
workbook = writer.book
bold = workbook.add_format({'bold': True})
italic = workbook.add_format({'italic': True})
red = workbook.add_format({'color': 'red'})
df = pd.DataFrame({
'numCol': [1, 50, 327],
'plainText': ['plain', 'text', 'column'],
'richText': [
['This is ', bold, 'bold'],
['This is ', italic, 'italic'],
['This is ', red, 'red']
]
})
df.to_Excel(writer, sheet_name='Sheet1', index=False)
worksheet = writer.sheets['Sheet1']
# you then need to overwite the richtext column with
for idx, x in df['richText'].iteritems():
worksheet.write_rich_string(idx + 1, 2, *x)
writer.save()
期待される出力.xlsxの場合: