【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 HH:mm:ss利用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()(不建议使用,版本问题太坑)
反思
        这个时间格式的校验问题,真的是花费了我比较多的时间,因为不熟悉,再加上严格的产品要求,最终还是想办法解决了这个问题。所以只要要求合理,只要我们愿意,啥有能干。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mandy_i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值