Возможно ли иметь два разных цвета текста в одной ячейке с NPOI? - PullRequest
1 голос
/ 10 апреля 2020

Я использую NPOI для экспорта DataTable в виде электронной таблицы:

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?

1 Ответ

0 голосов
/ 21 апреля 2020

Да, это возможно. Ключ должен использовать IRichTextString при установке значения ячейки. Этот объект имеет метод ApplyFont, который принимает startIndex, endIndex и IFont. Вы можете создать шрифт нужного вам цвета, а затем применить его к символам канала в значении ячейки. Вот как:

  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. В вашем l oop, который создает ячейки, вызовите 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);
        }
    }
    
...