2

当我使用 POI 写出日期时,我还会在 Excel 中看到时间。(显示的时间是写入单元格时我机器上的时间)。这是我用过的代码

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);

单元格中的日期是正确的,即 2013 年 12 月 12 日,但对于该单元格,在公式栏中,时间也会显示。因此单元格显示 2013 年 12 月 12 日,公式栏显示 2013 年 12 月 12 日上午 7:14:39。我在 excel 中检查了单元格的格式,它显示为自定义 dd-mm-yyyy,这是我所期望的。太清楚了 - 单元格本身显示 2012 年 12 月 12 日,但对于公式栏中的该单元格,时间也会显示。我还用日期替换了日历——同样的问题。

添加信息:在 excel 中,我将 col 的格式更改为“常规”-对于 POI 添加的单元格,我看到值是 xxx.xxx,例如 41319.3769490278,而当我只是手动输入日期时,值看起来像 41319。看起来小数点后的数字导致时间显示。当我使用 POI 写出来时,不知道如何避免这种情况

4

2 回答 2

7

好的解决了。为遇到相同问题的其他人提供此信息。我查看了 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);
double d = DateUtil.getExcelDate(cal, false); //get double value f
cell.setCellValue((int)d);  //get int value of the double
于 2013-02-22T00:38:23.007 回答
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);
于 2013-02-21T10:00:42.933 回答