NPOI форматирует все ячейки одинаково

Пожалуйста, взгляните на следующий фрагмент кода. Я просто открываю файл Excel myfile.xlsx и добавляю строки из объекта типа List<Account> (где мой объект Account имеет только свойства Date, Account и Amount) и сохраняю файл с именем myoutputfile.xlsx. Я хотел бы, чтобы ячейки, в которых я пишу даты, имели формат даты, а ячейки, в которых у меня есть суммы, имели числовой формат. Однако, если я попробую код ниже, все ячейки будут отформатированы в формате #.00 (даты также). Я пробовал все, может кто-нибудь, пожалуйста, скажите мне, что происходит? Я использую NPOI.

    XSSFWorkbook wb;
    var fileName = "C:/tmp/myfile.xlsx";
    var outputFileName = "C:/tmp/myoutputfile.xlsx";
    using (var file = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
    {
        wb = new XSSFWorkbook(file);
    }

    XSSFSheet sheet = (XSSFSheet) wb.GetSheetAt(0);
    for (int i = 0; i < accountRecs.Count(); ++i) {
        var rec = accountRecs[i];
        var row = sheet.CreateRow(i);
        var dateCell = row.CreateCell(3);
        dateCell.SetCellValue(rec.Date);
        dateCell.CellStyle.DataFormat = wb.CreateDataFormat().GetFormat("dd/MM/yyyy");
        var accountCell = row.CreateCell(4);
        accountCell.SetCellValue(rec.Account);
        var totalValueCell = row.CreateCell(16);
        totalValueCell.SetCellValue(rec.Amount);
        totalValueCell.CellStyle.DataFormat = wb.CreateDataFormat().GetFormat("#.00");
    }
    using (var file = new FileStream(outputFileName, FileMode.Create, FileAccess.Write))
    {
        wb.Write(file);
        file.Close();
    }

person edd    schedule 28.10.2016    source источник
comment
Возможно, связано с stackoverflow.com/a/3603750/619252. Попробуйте использовать встроенный формат для dd/MM/yyyy.   -  person Gabriel Negut    schedule 28.10.2016


Ответы (1)


Вот почему это не работает: создаваемые вами ячейки по умолчанию имеют общую ссылку на один и тот же объект CellStyle. Внутри цикла вы устанавливаете DataFormat в этом экземпляре стиля на "dd/MM/yyyy", а затем устанавливаете тот же самый DataFormat на "#.00". Последний выигрывает, поэтому в конечном итоге все ваши числовые ячейки (дата считается числовым значением в Excel) будут отформатированы как "#.00".

Что вам нужно сделать, так это создать отдельные стили ячеек для ячеек дат и ячеек сумм, установить DataFormats для этих стилей, а затем установить для свойства CellStyle для каждой созданной ячейки соответствующий стиль.

Попробуйте это так:

    IDataFormat format = wb.CreateDataFormat();

    ICellStyle dateStyle = wb.CreateCellStyle();
    dateStyle.DataFormat = format.GetFormat("dd/MM/yyyy");

    ICellStyle amountStyle = wb.CreateCellStyle();
    amountStyle.DataFormat = format.GetFormat("#.00");

    XSSFSheet sheet = (XSSFSheet)wb.GetSheetAt(0);
    for (int i = 0; i < accountRecs.Count(); ++i)
    {
        var rec = accountRecs[i];
        var row = sheet.CreateRow(i);
        var dateCell = row.CreateCell(3);
        dateCell.SetCellValue(rec.Date);
        dateCell.CellStyle = dateStyle;
        var accountCell = row.CreateCell(4);
        accountCell.SetCellValue(rec.Account);
        var totalValueCell = row.CreateCell(16);
        totalValueCell.SetCellValue(rec.Amount);
        totalValueCell.CellStyle = amountStyle;
    }
person Brian Rogers    schedule 30.10.2016