[NPOI-一个单元格中2种不同颜色的文本

问题描述 投票:0回答:1

我正在使用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有可能吗?

c# excel fonts npoi
1个回答
0
投票

是的,这是可能的。关键是要使用IRichTextString。该对象具有ApplyFont方法,该方法接受startIndexendIndexIFont。您可以创建具有所需备用颜色的字体,然后将其应用于包含管道字符的单元格值的一部分。

这里是方法:

  1. 首先,为替代颜色创建字体。您只需要执行一次,因此可以在循环之前将这段代码放在某处。

    IFont redFont = workbook.CreateFont();
    redFont.Color = HSSFColor.Red.Index;
    
  2. 创建一个将创建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;
    }
    
  3. 在创建单元格的循环中,根据需要调用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);
        }
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.