2013-02-21 2 views
1

Когда я пишу дату с помощью POI, я также вижу время в Excel. (показанное время - это время на моей машине, когда ячейка была написана). Это код, который я использовалИспользование POI для записи даты (без времени)

XSSFCellStyle dateStyle = wb.createCellStyle(); 
CreationHelper createHelper = wb.getCreationHelper(); 
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd-mmm-yyyy")); 
Calendar cal = Calendar.getInstance(); 
cal.set(xx.getYear(), xx.getMonthOfYear(), xx.getDayOfMonth()); 
cell.setCellStyle(dateStyle); 
cell.setCellValue(cal); 

даты в ячейке правильна т.е. 12-Dec-2013, но для этой ячейки в формуле бар, время также показывает. Так показывают ячейки 12-дек-2013 и шоу-бары 12-дек-2013 7:14:39 утра. Я проверил формат ячейки в excel, и он показывает как пользовательский dd-mm-yyyy, чего я ожидаю. Слишком ясно - сама ячейка показывает 12-12-2012, но для этой ячейки в баре формулы время также показывает. Я также заменил Calendar Date - той же проблемой.

Информация о добавлении: В excel я изменил формат col на 'general' - для ячеек, которые были добавлены POI, я вижу, что значения xxx.xxx похожи на 41319.3769490278, а когда я просто вводил дату вручную значение выглядит примерно как 41319. Похоже, цифры после десятичной точки заставляют время появляться. Не знаю, как избежать этого, когда я использовать POI, чтобы записать его

+0

Формат dateStyle, который вы создали, применяется только к ячейке, когда вы делаете «cell.setCellStyle (dateStyle); Поэтому это форматирование относится только к ячейке, а не к панели формул. Я не уверен, что вы можете изменить форматирование строки формул через API POI. –

ответ

5

Хорошо. Помещая это для других, сталкивающихся с той же проблемой. Я заглянул в исходный код POI и понял, что из календаря вычисляется double, а значение ячейки установлено на это. Из комментариев видно, что цифры после десятичной точки представляют время. Так что все, что я сделал в своем коде, - это усечение этого двойника. Измененные строки комментируются в фрагменте кода ниже.

XSSFCellStyle dateStyle = wb.createCellStyle(); 
CreationHelper createHelper = wb.getCreationHelper(); 
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd-mmm-yyyy")); 
Calendar cal = Calendar.getInstance(); 
cal.set(xx.getYear(), xx.getMonthOfYear(), xx.getDayOfMonth()); 
cell.setCellStyle(dateStyle); 
double d = DateUtil.getExcelDate(cal, false); //get double value f 
cell.setCellValue((int)d); //get int value of the double 
+0

Perfect! Большое спасибо, искал решение на один день! – NinaNa

2

Вы не полностью очистив экземпляр календаря вы получаете даты, поэтому наступает время через

Вы должны также установите значения времени равными нулю, поэтому ваш код захочет выглядеть примерно так:

Calendar cal = Calendar.getInstance(); 
cal.set(xx.getYear(), xx.getMonthOfYear(), xx.getDayOfMonth()); 
calendar.set(Calendar.HOUR, 0); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MILLISECOND, 0); 
+0

Спасибо Гагравар. Я сделал так, как вы предложили, - установите поля времени на 0 - но безрезультатно - время все еще отображается в строке формул, за исключением того, что теперь время отображается как 12:00:00 PM. – user1578364

+1

Интересно, нужен ли вам HOUR_OF_DAY, а не HOUR - это будет зависеть от вашего языка – Gagravarr

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