Ошибка форматирования в NPOI

Я разрабатываю бухгалтерское программное обеспечение, которое также будет создавать отчеты в формате Excel (.xls).
Я использовал NPOI почти во всех проектах, где требуется отчет Excel, без каких-либо серьезных проблем.

Но теперь я столкнулся с проблемой и не могу найти решение в Интернете.

Это отчет, который я создаю

Как видите, в середине отчета столбец «Валюта» автоматически меняет формат, неправильно форматируя валюту, границу и все в этом столбце.

Я работал над этим несколько раз, но безуспешно.

Вот код, который я использовал для создания стиля (C#):

var baseStyle = workBook.CreateCellStyle();
        baseStyle.VerticalAlignment = VerticalAlignment.Top;
        baseStyle.FillForegroundColor = IndexedColors.White.Index;
        baseStyle.FillPattern = FillPattern.SolidForeground;
        baseStyle.BorderTop = BorderStyle.Thin;
        baseStyle.BorderBottom = BorderStyle.Thin;
        baseStyle.BorderLeft = BorderStyle.Thin;
        baseStyle.BorderRight = BorderStyle.Thin;
        baseStyle.WrapText = true;
       

private static void SetCellValuePrice(IRow row, ICellStyle cellStyle, int colIndex, decimal value)
    {
        var xlCell = row.CreateCell(colIndex);

        xlCell.SetCellValue(Convert.ToDouble(value));

        var newStyle = row.Sheet.Workbook.CreateCellStyle();
        newStyle.CloneStyleFrom(cellStyle);

        newStyle.DataFormat = row.Sheet.Workbook.CreateDataFormat().GetFormat("€ #,##0.00");

        xlCell.CellStyle = newStyle;
    }

И пример использования (который, похоже, не вызывает проблем в других ячейках:

SetCellValue(row, baseStyle, colIndex++, data.Description);

Есть предположения? Заранее спасибо!


person Cosimo Gallo    schedule 27.04.2017    source источник


Ответы (1)


Проблема в том, что вы создаете стиль для каждой ячейки, в то время как вы должны создать только ОДИН стиль для каждого типа ячейки.

var baseStyle = workBook.CreateCellStyle();
...
var priceStyle = workBook.CreateCellStyle();
priceStyle.CloneStyleFrom(numberStyle);
priceStyle.DataFormat = workBook.CreateDataFormat().GetFormat("€ #,##0.00");

private static void SetCellValuePrice(IRow row, ICellStyle cellStyle, int colIndex, decimal value)
{
    var xlCell = row.CreateCell(colIndex);

    xlCell.SetCellValue(Convert.ToDouble(value));

    xlCell.CellStyle = cellStyle;
}

Применение:

SetCellValue(row, priceStyle, colIndex++, data.Description);
person Dany    schedule 04.05.2017
comment
О боже, спасибо, чувак, это действительно сработало! Спасибо!! :D - person Cosimo Gallo; 04.05.2017
comment
Действительно, создание шрифтов и стилей постоянно утомляло программу. Мы должны создать шрифт один раз и добавить его в нужный столбец. Большое спасибо! - person Umut Sun; 20.04.2021