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)
我使用以下代码在 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)
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 将仅显示时间部分而不显示日期
| 归档时间: |
|
| 查看次数: |
7421 次 |
| 最近记录: |