我想使用 C# NPOI 将条件交通灯图标集添加到 Excel 文件中,该图标集会根据单元格中的值而变化。但不幸的是,没有关于此功能的良好指南。
我尝试了几种方法,但远程都不起作用。
由于我找不到任何关于如何在 NPOI 中设置具有条件格式的 Excel 图标集的有用帖子或指南,我想发布受此 answer 启发的解决方案。
您可以使用此代码格式化 NPOI 中的图标集(我使用的是 NPOI 2.5.6):
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.OpenXmlFormats.Spreadsheet;
var cf = oSheet.GetCTWorksheet().AddNewConditionalFormatting(); //oSheet is an XSSFSheet.
cf.sqref = "C1"; //Or "C1:C2"
var rule = cf.AddNewCfRule();
rule.type = ST_CfType.iconSet;
rule.priority = 1;
var IconSet = rule.AddNewIconSet();
IconSet.iconSet = ST_IconSetType.Item3Signs; //You can choose another IconSet type here.
IconSet.showValue = true;
IconSet.reverse = true; //Reverses the default order of icons.
var value_1 = IconSet.AddNewCfvo();
value_1.type = ST_CfvoType.num; //Depending on what you need, you can choose precentages or other types. I found that using numbers when defining thresholds works better.
value_1.val = "0"; //Why you should start with a zero is further below.
var value_2 = IconSet.AddNewCfvo();
value_2.type = ST_CfvoType.num;
value_2.val = "10";
var value_3 = IconSet.AddNewCfvo();
value_3.type = ST_CfvoType.num;
value_3.val = "20";
为什么需要在阈值中添加零?
我发现 Excel 工作表的 XML 文件中定义了正确的图标集,如下所示:
<cfRule type="iconSet" priority="1">
<iconSet iconSet="3Signs" reverse="1">
<cfvo type="num" val="0" />
<cfvo type="num" val="10" />
<cfvo type="num" val="20" />
</iconSet>
</cfRule>
关于阈值的注释:
由于阈值是一个字符串值,因此在将数值转换为字符串时应该小心。例如,浮点数在转换为字符串时可以接收科学记数法或逗号。
为了正确转换浮点数,您应该摆脱科学记数法并将逗号替换为点,因为 Excel 不接受科学记数法和逗号。
这帮助我克服了这个问题。