6

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
4

3 に答える 3

5

POIを使用してExcelで次のコードを使用して時間セルを生成しました。そして、私はセルを使用することができます

        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);
于 2012-11-20T03:52:55.743 に答える
3

Excelの日付と時刻は通常、浮動小数点数として、1900年または1904年以降の完全な日と小数日として保存されます。これは、Excelセルに0.5と入力し、時間としてフォーマットすることで確認できます。12:00:00と表示されます。 、または値を1.5に設定すると、1900/1904年の日付として日付として、12:00:00が時刻として、または36:00:00(24時間を超える場合は36:00:00)として表示されます(これは異なります)。フォーマットコード)

実行したいのは、Excelのコピーを起動し、表示したい時間の値を入力して、希望どおりに表示されるようにするフォーマット文字列を作成することです。次に、そのフォーマットコードをメモし、セルのデータフォーマットとしてPOIに渡します。次に、POIでDateUtilのようなものを使用して、Dateオブジェクトを作成し、それを値としてセルに設定します。正しいフォーマット文字列を入力すると、Excelは日付ではなく時間部分のみを表示します

于 2012-11-19T15:30:23.527 に答える