我正在尝试从电子表格中读取日期列和时间列。我可以从工作表中退出日期列,但不能退出时间列。
例如,我的工作表将包含以下形式的行:
2012年11月2日12:15:01
我有以下代码来获取日期列:
while(cellIterator.hasNext()) {
HSSFCell cell = (HSSFCell)cellIterator.next();
switch(cell.getCellType()){
case HSSFCell.CELL_TYPE_NUMERIC:
HSSFCellStyle style = cell.getCellStyle();
if (HSSFDateUtil.isCellDateFormatted(cell))
{
d = (Date)getDateValue(cell);
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateFormat.format(d));
}
}
}
protected static Object getDateValue(HSSFCell cellDate)
{
double numericDateValue = cellDate.getNumericCellValue();
Date date = HSSFDateUtil.getJavaDate(numericDateValue);
return date;
}
如你所见,我用
HSSFDateUtil.isCellDateFormatted(小区)
检查单元格中是否包含日期值。我想知道我是否可以使用任何函数检查单元格是否具有时间值。
excel表来自外部来源。所以,我将无法对其格式进行任何修改。
现在,我获得了日期列的正确日期值。但是,对于时间列,我正在
1899年12月31日
作为所有行的结果
答案 0 :(得分:9)
Excel中日期和时间的快速入门。由于在创建文件格式时有很多意义的原因,但现在看起来很混乱,Excel没有Date或Time或DateTime类型。相反,它具有数字和特殊格式规则。
怎么看?在Excel中键入10.5,然后将其格式化为日期+时间。你将在1900年1月的某个中午到中午。
因此,当您询问POI单元格是否为日期格式时,没有要检查的简单标志/类型。相反,所有POI都可以读取应用于单元格的格式化字符串,并查看它是否看起来像是一个日期。
奖励标记 - 尝试存储1900年2月28日,然后添加一个 - Excel忠实再现1900年闰年的Lotus 123错误...
作为一般规则,对于日期单元格,时间单元格和日期时间单元格,DateUtil.isCellDateFormatted(cell)
将返回true。但是,有时你可以得到一个奇怪的格式,Excel知道这是一个日期或时间,但POI不能作为一个。对于那些,您仍然可以要求将单元格值作为日期,POI将转换它。
因此,在您的情况下,如果POI表示日期格式化,请将值作为日期获取。现在,看一下格式字符串。如果是日期,请格式化为日期。看日期和时间?格式化为您的首选日期+时间。只有时间?格式化为时间?时区?你一定是笑了......
哦,只要你不使用1900年左右的实际日期,你就可以大致说DateUtil.isCellDateFormatted(cell)
+值< 100 - >可能只是一个时间(如果是经过的时间,则> 1)。如果你的数字是一个int,它可能只是一个日期(但它可能是午夜)。如果它是非int(ish - 记得excel使用浮点数),它可能有一个时间组件。
答案 1 :(得分:8)
这是我获取POI单元格的“仅限日期”,“仅限时间”或“日期时间”值的粗略尝试
...
private String getCellValueAsString(Cell poiCell){
if (poiCell.getCellType()==Cell.CELL_TYPE_NUMERIC && DateUtil.isCellDateFormatted(poiCell)) {
//get date
Date date = poiCell.getDateCellValue();
//set up formatters that will be used below
SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss");
SimpleDateFormat formatYearOnly = new SimpleDateFormat("yyyy");
/*get date year.
*"Time-only" values have date set to 31-Dec-1899 so if year is "1899"
* you can assume it is a "time-only" value
*/
String dateStamp = formatYearOnly.format(date);
if (dateStamp.equals("1899")){
//Return "Time-only" value as String HH:mm:ss
return formatTime.format(date);
} else {
//here you may have a date-only or date-time value
//get time as String HH:mm:ss
String timeStamp =formatTime.format(date);
if (timeStamp.equals("00:00:00")){
//if time is 00:00:00 you can assume it is a date only value (but it could be midnight)
//In this case I'm fine with the default Cell.toString method (returning dd-MMM-yyyy in case of a date value)
return poiCell.toString();
} else {
//return date-time value as "dd-MMM-yyyy HH:mm:ss"
return poiCell.toString()+" "+timeStamp;
}
}
}
//use the default Cell.toString method (returning "dd-MMM-yyyy" in case of a date value)
return poiCell.toString();
}