apache-poi - 使用 POI 在 Excel 中设置时间

标签 apache-poi date-formatting

我正在尝试使用 Java 中的 POI api 创建 Excel 工作表。在那个 Excel 工作表中,我想要一个只有 TIME 的单元格。通过设置它,我们可以像在数字列中那样将单元格包含在该特定列的总和中。为此,我们需要将单元格格式化为 Time >> 13:30:55。 (内部格式为 'h:mm:ss;@' )。我们需要从单元格中删除日期部分。

当我使用 POI 读取单元格的单元格值时,它返回为“Sun Dec 31 01:00:00 IST 1899”(当我将值设置为 1:00 时),单元格格式索引为 166,单元格格式字符串是'h:mm:ss;@'。

设置从excel读取的格式和样式以及单元格值为1800-December-31和时间值后,新的excel将单元格显示为'######'(错误)并设置单元格值作为“-1”。下面是我使用过的代码。我错过了什么吗?是否可以根据需要设置该值。

    InputStream is = new BufferedInputStream(new FileInputStream("<FileName>"));
    XSSFWorkbook wb = new XSSFWorkbook(is);
    is.close();

    XSSFSheet sheet = wb.getSheetAt(0);
    XSSFRow row = sheet.getRow(2);

    XSSFCell cell = row.getCell(18);
    System.out.println("ExcelFileReader main cell.getDateCellValue() : '" + cell.getDateCellValue() + "'");
    System.out.println("ExcelFileReader main cell.getCellStyle().getDataFormat() : '" + cell.getCellStyle().getDataFormat() + "'");
    System.out.println("ExcelFileReader main cell.getCellStyle().getDataFormat() : '" + cell.getCellStyle().getDataFormatString() + "'");

    XSSFRow row1 = sheet.createRow(21);
    XSSFCell cell1 = row1.createCell(2);

    cell1.setCellStyle(cell.getCellStyle());
    cell1.setCellValue(cell.getDateCellValue());

    Calendar dummy = Calendar.getInstance();
    dummy.setLenient(false);
    dummy.set(Calendar.YEAR, 1899);
    dummy.set(Calendar.MONTH, Calendar.DECEMBER);
    dummy.set(Calendar.DATE, 31);

    dummy.set(Calendar.HOUR, 00);
    dummy.set(Calendar.MINUTE, 00);
    dummy.set(Calendar.SECOND, 00);
    dummy.set(Calendar.MILLISECOND, 00);

    Calendar cc = Calendar.getInstance();
    XSSFRow row2 = sheet.createRow(25);
    XSSFCell cell2 = row2.createCell(2);

    dummy.set(Calendar.HOUR, cc.get(Calendar.HOUR));
    dummy.set(Calendar.MINUTE, cc.get(Calendar.MINUTE));
    dummy.set(Calendar.SECOND, cc.get(Calendar.SECOND));
    dummy.set(Calendar.MILLISECOND, cc.get(Calendar.MILLISECOND));

    System.out.println("ExcelFileReader main dummy : '" + dummy.getTime() + "'");
    cell2.setCellValue(dummy.getTime());

    CellStyle style = wb.createCellStyle();
    DataFormat df = wb.createDataFormat();
    style.setDataFormat(df.getFormat("[h]:mm:ss;@"));
    cell2.setCellStyle(style);

    FileOutputStream fos = new FileOutputStream(new File("<New Excel file>"));
    wb.write(fos);
    fos.close();
    System.out.println("ExcelFileReader DONE");

以下是程序的输出。
    ExcelFileReader main cell.getDateCellValue() : 'Sun Dec 31 00:15:00 IST 1899'
    ExcelFileReader main cell.getCellStyle().getDataFormat() : '166'
    ExcelFileReader main cell.getCellStyle().getDataFormat() : 'h:mm:ss;@'
    ExcelFileReader main dummy : 'Sun Dec 31 11:32:24 IST 1899'
    ExcelFileReader DONE

最佳答案

我使用以下代码在 Excel 中使用 POI 生成时间单元格。我可以在

        XSSFRow row2 = sheet.createRow(25);
        XSSFCell cell1 = row2.createCell(4);
        XSSFCell cell2 = row2.createCell(5);

        CellStyle style = wb.createCellStyle();
        DataFormat df = wb.createDataFormat();
        style.setDataFormat(df.getFormat("[h]:mm:ss;@"));

        cell1.setCellFormula("TIME(0,15,00)"); // 00:15:00
        cell1.setCellType(Cell.CELL_TYPE_FORMULA);
        cell1.setCellStyle(style);
        evaluator.evaluateFormulaCell(cell1);

        cell2.setCellFormula("TIME(0,30,00)"); //00:30:00
        cell2.setCellType(Cell.CELL_TYPE_FORMULA);
        evaluator.evaluateFormulaCell(cell2);
        cell2.setCellStyle(style);

关于apache-poi - 使用 POI 在 Excel 中设置时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13448617/

相关文章:

java - 即使在执行 fileoutputstream.close() 之后,Apache-POI 也不保存 Excel 工作簿

java - 如果以下代码中发生错误,如何关闭 Excel 文件而不崩溃

java - 从 Excel 文件 (xlsx) 创建模板文件 (xltx)

javascript - 根据 dd/mm/yyyy 日期格式的出生日期计算年龄

java - Jackson Deserializer 如何在考虑 @JsonFormat 注释的情况下递归地反序列化字段?

android - 如何将日期格式响应传递给 SimpleDateFormat?

java - 如何使用 Java 获取 Excel 电子表格中单元格的内容? Apache 兴趣点

java - 如何更改 XSSFCellStyle 中的字体大小?

ios - Swift:将开始和结束日期格式化为单个字符串

sql - ORA-01810 : format code appears twice