sty*_*ane 5 python excel xlsxwriter
我已经从如下所示的数据框中创建了一个excel文件:
In [215]: import pandas as pd
In [216]: df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": ['y', 'n', 'yy']})
In [217]: df
Out[217]:
Name Status
0 A y
1 B n
2 C yy
Run Code Online (Sandbox Code Playgroud)
如何bg_color基于的值设置“名称” Status?我尝试了几种选择,但均未成功:
format1 = workbook.add_format({"bg_color": "#669731"})
format2 = workbook.add_format({"bg_color": "#FFFA22"})
format3 = workbook.add_format({"bg_color": "#A43829"})
Run Code Online (Sandbox Code Playgroud)
选项1
worksheet.conditional_format("A2",
{"type": "formula",
"criteria": "=ISNUMBER(SEARCH('y', B2))",
"format": format1
}
)
Run Code Online (Sandbox Code Playgroud)
选项2
worksheet.conditional_format("A2",
{"type": "formula",
"criteria": "=$B$2='y'",
"format": format1
}
)
Run Code Online (Sandbox Code Playgroud)
这些都没有得到预期的结果,并且当我打开文件时,出现以下错误:.xlsx中的内容不可读
如果我能以某种方式设置它而不迭代数据帧的值,那也将是个好习惯。
Excel 似乎不喜欢在字符串上使用单引号进行条件格式设置。如果内部有双引号,即有效
"criteria": '=($B$2="y")'
Run Code Online (Sandbox Code Playgroud)
相对
"criteria": "=($B$2='y')"
Run Code Online (Sandbox Code Playgroud)
我在下面放置了一个完整的可重现示例以及解决方案的屏幕截图。
import pandas as pd
df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": ['y', 'n', 'yy']})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
format1 = workbook.add_format({"bg_color": "#669731"})
worksheet.conditional_format("A2",
{"type": "formula",
"criteria": '=($B$2="y")',
"format": format1
}
)
workbook.close()
Run Code Online (Sandbox Code Playgroud)
如果您想为列中 1000 个单元格的范围设置此条件格式,可以使用条件格式的代码。
worksheet.conditional_format("A2:A1001",
{"type": "formula",
"criteria": '=(B2:B1001="y")',
"format": format1
}
)
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您想在一个范围内设置多个条件,我认为唯一可能的方法是使用 for 循环,用与条件匹配的格式编写每个单元格。我提供了下面的示例及其预期输出。请注意,这有点作弊,因为如果它满足三个条件中的任何一个,它就会覆盖单元格中已经放入的内容。
import pandas as pd
df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": ['y', 'n', 'yy']})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
format1 = workbook.add_format({"bg_color": "#669731"})
format2 = workbook.add_format({"bg_color": "#FFFA22"})
format3 = workbook.add_format({"bg_color": "#A43829"})
for i in range (0, len(df)):
if df['Status'].ix[i] == "y":
worksheet.write(i+1, 0, df['Name'].ix[i], format1)
elif df['Status'].ix[i] == "n":
worksheet.write(i+1, 0, df['Name'].ix[i], format2)
elif df['Status'].ix[i] == "yy":
worksheet.write(i+1, 0, df['Name'].ix[i], format3)
workbook.close()
Run Code Online (Sandbox Code Playgroud)