2016-10-28 6 views
2

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

Возможно, связано с http://stackoverflow.com/a/3603750/619252. Попробуйте использовать встроенный формат для 'dd/MM/yyyy'. –

ответ

2

Вот почему это не работает: клетки вы создаете разделяют ссылку на тот же объект 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; 
    } 
+0

Большое спасибо Брайан. Вы дали мне объяснение и ответ. Работает. Хороший – edd

+0

Рад, что я мог помочь. –

Смежные вопросы