使用 POI HSSF API 从 Excel 单元格读取日期值

发布于 2024-07-21 16:46:52 字数 572 浏览 9 评论 0原文

我正在使用 POI HSSF API 在 Java 中进行 excel 操作。 我的 Excel 单元格中有一个日期值“8/1/2009”,当我尝试使用 HSSF API 读取该值时,它会将单元格类型检测为数字并返回日期的“双精度”值。 请参阅下面的示例代码:

cell = row.getCell(); // date in the cell '8/1/2009'
switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:
    cellValue = cell.getRichStringCellValue().getString();
    break;
case HSSFCell.CELL_TYPE_NUMERIC:
    cellValue = new Double(cell.getNumericCellValue()).toString();
    break;
default:
}

Cell.getCellType() 返回 NUMERIC_TYPE,因此此代码将日期转换为双精度! :(

有没有办法读取 HSSF POI 中的日期!?

I'm using POI HSSF API for my excel manipulations in Java. I've a date value "8/1/2009" in one of my excel cell and while I try to read this value using HSSF API, it detects the cell type as Numeric and returns the 'Double' value of my date. See the sample code below:

cell = row.getCell(); // date in the cell '8/1/2009'
switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:
    cellValue = cell.getRichStringCellValue().getString();
    break;
case HSSFCell.CELL_TYPE_NUMERIC:
    cellValue = new Double(cell.getNumericCellValue()).toString();
    break;
default:
}

Cell.getCellType() returns NUMERIC_TYPE and thus this code converts the date to double! :(

Is there any way to read the date as it is in HSSF POI !?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

っ〆星空下的拥抱 2024-07-28 16:46:52

您可以看一下:

HSSFDateUtil.isCellDateFormatted()

有关 HSSFDateUtil 的更多详细信息,请参阅 POI Horrible Spreadsheet Format API:

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDateUtil.html

它还提供了一些返回 Excel 的辅助方法 getExcelDate( ) 和 Java 日期 getJavaDate()。 不过,您需要对不同的日期格式保持警惕......

You could take a look at:

HSSFDateUtil.isCellDateFormatted()

See the POI Horrible Spreadsheet Format API for more details on HSSFDateUtil:

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDateUtil.html

That also provides some helper methods for returning Excel getExcelDate() and Java dates getJavaDate(). You need to be somewhat wary of different date formats though...

找回味觉 2024-07-28 16:46:52

如果您想以与 Excel 文件中相同的格式引用日期,则应使用 CellDateFormatter。 示例代码:

CellValue cValue = formulaEv.evaluate(cell);
double dv = cValue.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
    Date date = HSSFDateUtil.getJavaDate(dv);

    String dateFmt = cell.getCellStyle().getDataFormatString();
    /* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as 
    Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java 
    will always be 00 for date since "m" is minutes of the hour.*/

    strValue = new CellDateFormatter(dateFmt).format(date); 
    // takes care of idiosyncrasies of Excel
}

If you want to reference the date in the same format in as in the Excel file, you should use the CellDateFormatter. Sample code:

CellValue cValue = formulaEv.evaluate(cell);
double dv = cValue.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
    Date date = HSSFDateUtil.getJavaDate(dv);

    String dateFmt = cell.getCellStyle().getDataFormatString();
    /* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as 
    Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java 
    will always be 00 for date since "m" is minutes of the hour.*/

    strValue = new CellDateFormatter(dateFmt).format(date); 
    // takes care of idiosyncrasies of Excel
}
安静被遗忘 2024-07-28 16:46:52

Excel 将日期和时间视为数字...乔恩说得更好,所以我不会在这里回应他...

但是,您在问题中输入的示例代码位于 http://poi.apache.org/spreadsheet/quick-guide.html#CellContents

Excel treats dates and times as numbers... Jon said it better, so I won't echo him here...

However, sample code for what you've put in the question is at http://poi.apache.org/spreadsheet/quick-guide.html#CellContents

年少掌心 2024-07-28 16:46:52

如果您使用 POI 3.5,您可以使用以下

cell.getDateCellValue() 方法。 这也适用于 Excel 2007。

If you using the POI 3.5 you can use the following

cell.getDateCellValue() method. This will work for excel 2007 as well.

永言不败 2024-07-28 16:46:52

自 POI 3.15 beta3 起,一些功能已被弃用
您可以检查数据格式并以 Java Date 形式检索。

SimpleDateFormat format = new SimpleDateFormat("");
String cellValue;
if(cell != null && cell.getCellTypeEnum() != CellType.STRING &&
    cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){

    cellValue = format.format(cell.getDateCellValue());
}

Since POI 3.15 beta3 some functions are deprecated.
You can check data format and retrieve as Java Date.

SimpleDateFormat format = new SimpleDateFormat("");
String cellValue;
if(cell != null && cell.getCellTypeEnum() != CellType.STRING &&
    cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){

    cellValue = format.format(cell.getDateCellValue());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文