Xlsxwriter 对同一列中不同单元格的不同格式

Xlsxwriter different formats to different cells in same column

我在设置不同单元格的格式时遇到问题。我有两个数据框,其中包含应以不同格式显示的数字。我创建了一个简单的示例来说明我的问题。

import pandas as pd
import numpy as np
import xlsxwriter

frame1 = pd.DataFrame(np.random.randint(0,100,size=(10, 4)),  columns=list('ABCD'))

#want to show this frame as percentage in Excel later
frame2 = pd.DataFrame(np.random.randint(0,100,size=(10, 4)),    columns=list('EFGH'))

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

frame1.to_excel(writer, sheet_name='Sheet1', startcol= 0, startrow= 0)

frame2.to_excel(writer, sheet_name='Sheet1', startcol= 0, startrow = (2 + len(frame1)))

writer.save()

此代码生成此 Excel Sheet:

现在的问题是,例如,我可能想将标记为黄色的单元格设置为 % 或其他格式。我知道我可以在整列或整行上设置格式,但我无法解决如何为某些特定单元格设置格式的问题。我想有一些非常简单的解决方案。

Excel中的列格式适用于整个列,只能被行格式或单元格格式覆盖。

因此,您需要将单元格格式应用于您想要设置不同格式的单元格,而这在 Pandas 界面中是不可能的。

另一种方法是对您感兴趣的单元格范围使用条件格式。例如,请参阅 XlsxWriter 文档中的 this Pandas program

解决方法是使用 conditional_format,如 @jmcnamara 所述,您只需应用 {'type': 'top','value': str(f2rows),'format': format1},其中 f2rows 是数据框的行数,format1 是您要应用的格式。

import pandas as pd
import numpy as np
import xlsxwriter

frame1 = pd.DataFrame(np.random.randint(0,100,size=(10, 4)),  columns=list('ABCD'))

#want to show this frame as percentage in Excel later
frame2 = pd.DataFrame(np.random.randint(0,100,size=(10, 4)),    columns=list('EFGH'))

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

frame1.to_excel(writer, sheet_name='Sheet1', startcol= 0, startrow= 0)

frame2.to_excel(writer, sheet_name='Sheet1', startcol= 0, startrow = (2 + len(frame1)))

# Get the xlsxwriter workbook and worksheet objects.
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

f2rows = frame2.shape[0]
startR = 4 + len(frame1)
endR = startR + f2rows -1

# Apply a conditional format to the cell range.
format1 = workbook.add_format({'bg_color': '#FFFF00',
                               'font_color': '#9C0006'})

worksheet.conditional_format('C{}:C{}'.format(startR, endR), {'type': 'top',
                                           'value': str(f2rows),
                                           'format': format1})

worksheet.conditional_format('E{}:E{}'.format(startR, endR), {'type': 'top',
                                           'value': str(f2rows),
                                           'format': format1})

writer.save()