【问题标题】:Issue with time cell - adding 24 minutes时间单元问题 - 添加 24 分钟
【发布时间】:2014-09-18 13:25:09
【问题描述】:

我使用 apache poi 3.7 和 java 7。

我在 .xls 格式的 excel 中输出时间单元格时遇到问题。小时和分钟在数据库中作为一个值存储为双精度值。 如果我在生成的 xls 文件中传递值 1.0 将显示为 1h 24 min。不幸的是,这个问题不会在本地发生。我无权访问数据,也无法在本地环境中重复此问题。

下面是我初始化工作簿和问题单元格格式的代码:

Workbook workbook = WorkbookFactory.create(template);
DateFormat df = workbook.createDataFormat();
CellStyle style = workbook.createCellStyle();
style.setDataFormat(df.getFormat("h:mm"));

以下是用于创建单元格的函数。函数从数据库中获取参数值:

private void createTimeCell(Row r, int pos, double value) {
    int hours = (int) value;
    int minutes = (int) Math.round((value - hours) * 60);
    Date date = new Date(0, 0, 1);
    date.setHours(hours);
    date.setMinutes(minutes);
    Cell c = r.createCell(pos);     
    c.setCellValue(date);
    c.setCellStyle(style);
}

【问题讨论】:

  • 对我来说看起来不错。你确定value 包含1.0 吗?
  • 为避免 java.util.Date 和 Excel 之间发生一些转换,您可以使用 c.setCellFormula("TIME("+hours+","+minutes+",00)"); 而不是 c.setCellValue(...) 看看是否更好。

标签: java excel apache-poi xls


【解决方案1】:

Excel 中的日期和时间以浮点数形式存储,整数部分为自 1900 年 / 1904 年以来的天数,其余部分为时间的一小部分。

因此,您可以通过以下方式使您的代码更简单:

Workbook workbook = WorkbookFactory.create(template);
DateFormat df = workbook.createDataFormat();
CellStyle timeStyle = workbook.createCellStyle();
timeStyle.setDataFormat(df.getFormat("h:mm"));

private void createTimeCell(Row r, int pos, double hoursAndMinutes) {
    Cell c = r.getCell(pos, Row.CREATE_NUL_AS_BLANK);
    c.setCellValue(hoursAndMinutes / 24);
    c.setCellStyle(timeStyle);
}

【讨论】:

  • 感谢您的回答。我会检查生产服务器。
猜你喜欢
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多