我正在使用NPOI将数据表导出为电子表格:
for (var i = 0; i < _instance.ResultsData.Rows.Count; i++)
{
var row = sheet.CreateRow(i + 1);
for (var j = 0; j < _instance.ResultsData.Columns.Count; j++)
{
row.CreateCell(j).SetCellValue(_instance.ResultsData.Rows[i][_instance.ResultsData.Columns[j].ToString()].ToString());
}
}
对于某列,我希望有两种不同颜色的文本。基本上在以下字符串中:
abc|123|xyz
我希望管道字符的颜色与两者之间的实际文本不同。 NPOI有可能吗?
是的,这是可能的。关键是要使用IRichTextString
。该对象具有ApplyFont
方法,该方法接受startIndex
,endIndex
和IFont
。您可以创建具有所需备用颜色的字体,然后将其应用于包含管道字符的单元格值的一部分。
这里是方法:
首先,为替代颜色创建字体。您只需要执行一次,因此可以在循环之前将这段代码放在某处。
IFont redFont = workbook.CreateFont();
redFont.Color = HSSFColor.Red.Index;
创建一个将创建IRichTextString
并将字体应用于管道字符的方法。注意:如果您的工作簿是HSSFWorkbook
,请使用HSSFRichTextString
而不是XSSFRichTextString
。
static IRichTextString ApplyColorToPipeChars(string value, IFont font)
{
var richString = new XSSFRichTextString(value);
for (int i = 0; i < value.Length; i++)
{
if (value[i] == '|')
{
var j = i + 1;
while (j < value.Length && value[j] == '|') j++;
richString.ApplyFont(i, j, font);
i = j;
}
}
return richString;
}
在创建单元格的循环中,根据需要调用ApplyColorToPipeChars
方法并从中设置单元格值:
DataTable table = _instance.ResultsData;
for (var i = 0; i < table.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (var j = 0; j < table.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
string value = table.Rows[i][j].ToString();
if (shouldApplyColorToCellValue) // change this condition to suit your needs
cell.SetCellValue(ApplyColorToPipeChars(value, redFont));
else
cell.SetCellValue(value);
}
}