使用POI在Excel中设置时间

use*_*844 6 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并且单元格格式string是'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");
Run Code Online (Sandbox Code Playgroud)

以下是该程序的输出.

    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
Run Code Online (Sandbox Code Playgroud)

use*_*844 5

我使用以下代码在 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);
Run Code Online (Sandbox Code Playgroud)


Gag*_*arr 3

Excel 中的日期和时间通常存储为浮点数,即自 1900 年或 1904 年以来的完整天数和小数天数。您可以通过在 Excel 单元格中键入 0.5 并格式化为时间来查看这一点 - 它将显示为 12:00:00 ,或者设置值 1.5,它将显示为 1900/1904 中的日期、12:00:00 作为时间,或者 36:00:00(如果允许 >24 小时的时间)(这是不同的)格式代码)

您需要做的是启动 Excel 副本,输入您想要显示的时间值,然后计算出使其按您希望的方式显示的格式字符串。然后,记下该格式代码,并将其提供给 POI 作为单元格的数据格式。现在,使用 POI 中的 DateUtil 之类的东西来构建 Date 对象,并将其设置为单元格的值。输入正确的格式字符串后,Excel 将仅显示时间部分而不显示日期