【BusinessSystem】——POI导入Excel校验时间格式
最近小编做了一个导入的功能,在这个导入的excel表格中存在36列,对于excel中的每一个单元格都有独立的验证方式,一般的验证都在接受范围内容,其中在excel表单中对12列关于时间的内容,导入时间的格式分为两种,也就是为了校验这两种时间格式,真是好烦人!!!
在excel做导入功能的时候,如果时间格式的内容,在程序中都是数字类型的字符串,如果需要校验excel中的时间格式,首先解决的问题,是时间类型的数据程序中以原始数据展示。
在excel导入时间的时候,如果时间格式不进行特殊选择,则会被处理为字符串,变成数字,所以一般excel导入时间内容的时候都会根据自己的需要选择合适的时间格式。这次的需要开发中对时间格式有两种要求,1:xxxx-xx-xx;2:xxxx-xx-xx HH:mm:ss,而且相应的单元格只能满足其中的一种。
功能开发流程:
1、解析excel,将时间格式的字段先解析出来。
2、利用poi获取到输入内容的时间格式
3、拿到输入的时间格式和目标时间格式对比,如果一样则进行后续处理,否则直接提示即可
4、要求xxxx-xx-xx格式导入系统之后的时分秒只能为00:00:00
(这一个部分是因为在做导入excel的时候可能时间格式从xxxx-xx-xx HHss利用excel直接转成了xxxx-xx-xx 但是当系统解析的时候会把excel直接隐藏的那一部分也携带出来,所以要把那一部分的时分秒都修改为00)
废话不在说,直接上代码吧。
private String getCellValue(Cell cell, int row, int column) {
if (cell != null) {
int cellType = cell.getCellType();
//判断是否为数字类型
if (cellType == Cell.CELL_TYPE_NUMERIC) {
//如果是判断是否为日期类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
//获取日期的时间
Date d = cell.getDateCellValue();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//判断excel中日期格式的字符串样式
String dataFormat = cell.getCellStyle().getDataFormatString();
if ((!shortDate.contains(column) || !("yyyy\\-mm\\-dd".equals(dataFormat))) && (!longDate.contains(column) || !("yyyy\\-mm\\-dd\\ hh:mm:ss".equals(dataFormat)))) {
errorProductLine(row, column, "内容错误");
}
//抹去时间后面的时分秒的数据,补充00
return shortDate.contains(column)?format.format(d).substring(0,11)+"00:00:00":format.format(d);
}
//数值类型的值
else {
cell.setCellType(Cell.CELL_TYPE_STRING);
return String.valueOf(cell.getStringCellValue());
}
} else if (cellType == Cell.CELL_TYPE_STRING) {
//返回字符类型的值
return String.valueOf(cell.getStringCellValue());
} else if (cellType == Cell.CELL_TYPE_BLANK) {
//返回null值
return null;
} else if (cellType == Cell.CELL_TYPE_BOOLEAN) {
return String.valueOf(cell.getBooleanCellValue());
}
}
return null;
}
注意:
获取时间格式的方式有两种,一种是获取时间格式的编码,另一种是获取时间格式的字符串样式。我用的是获取字符串的样式。因为时间格式在excel属于自定义格式,即便是相同的样式,excel的版本不同,它们的样式编码是不一样的,所以在软件开发的过程不能确定业务方到底使用哪种版本的excel,所以还是建议使用字符串的样式来获取。
String dataFormat = cell.getCellStyle().getDataFormatString();
还有另一种获取字符编码
cell.getCellStyle().getDataFormat()(不建议使用,版本问题太坑)
反思
这个时间格式的校验问题,真的是花费了我比较多的时间,因为不熟悉,再加上严格的产品要求,最终还是想办法解决了这个问题。所以只要要求合理,只要我们愿意,啥有能干。
还没有评论,来说两句吧...