版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengchang_1981/article/details/8268358
采用jxl解析含有时间单元格的xls时,发现入库的小时数总是同excel中的小时不相符,其它年月日,分秒都没问题。
通过搜索网上的一些总结和自己的试验,归纳如下:
- 首先需要把xls中的时间单元格设置好单元格格式,选中需要设置单元格格式的单元格,点击右键菜单选择“设置单元格格式...”,如下图所示
如图,选中日期并选择‘2001-3-7 0:00’,如果需要设置带有秒的格式,可以选择分类中“自定义”选项,自行添加格式。
2,jxl解析代码:
public static List parseExcel(int colNum, int begin, int blank,
InputStream is) {
List res = new ArrayList();
Workbook rwb = null;
try {
rwb = Workbook.getWorkbook(is);
int sheetNum = rwb.getNumberOfSheets();
for (int s = 0; s < sheetNum; s++) {
// 获取一张Sheet表
Sheet st = rwb.getSheet(s);
if (st.getColumns() != colNum) {
throw new Exception("列数不正确!");
}
int i; // 行号
int j;
// 精确到分钟即可
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// 这句很重要,必须采用标准的GMT时区,不然解析的时间会不正确
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
// 针对导入的包含日期的情况进行重构
for (i = begin; i <= st.getRows() - blank; i++) {
List rowList = new ArrayList();
for (j = 0; j < colNum; j++) {
Cell cji = st.getCell(j, i);
// 判断如果是时间类型的单元格则进行时间转化特殊处理,相应的excel必须为日期类型的单元格
if (cji.getType() == CellType.DATE) {
DateCell dc = (DateCell) cji;
Date date = dc.getDate();
String sDate = sdf.format(date);
rowList.add(sDate);
} else {
String content = cji.getContents();
rowList.add(content);
}
}
res.add(rowList);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rwb != null) {
rwb.close();
}
try {
is.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return res;
}
代码解释,对于时间单元格处理,必须加上
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
采用标准的GMT时区来解析,不然小时不会以24小时制正常解析。得到的小时就完全不对。
参考文献: