zoukankan      html  css  js  c++  java
  • java通过poi读取excel中的日期类型数据或自定义类型日期

    Java 读取Excel表格日期类型数据的时候,读出来的是这样的  12-十月-2019,而Excel中输入的是 2019/10/12 或 2019-10-12

    poi处理excel时,当excel没有明确指明是哪个类型的数据时,poi很可能处理单元格的日期数据时就有可能是一串数字,而使用java程序基本无法转换。

    为了解决以上的问题,本人收集了各种资料,目前来总结一下,供碰到此类问题的你作参考。

    Excel数据处理:

    Excel存储日期、时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化

    1、数值格式(CELL_TYPE_NUMERIC):

    1.纯数值格式:getNumericCellValue() 直接获取数据

    2.日期格式处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式

    1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)

    所有日期格式都可以通过getDataFormat()值来判断

    yyyy-MM-dd----- 14
    yyyy年m月d日--- 31
    yyyy年m月------- 57
    m月d日  ---------- 58
    HH:mm----------- 20
    h时mm分  ------- 32

    接下来是针对excel各种数据类型来进入转换,基本涵盖所需要的,如果没有你需要的,可以在此基础上添加

    //获取单元格各类型值,返回字符串类型
        public static String getCellValueByCell(Cell cell) {
            //判断是否为null或空串
            if (cell==null || cell.toString().trim().equals("")) {
                return "";
            }
            String cellValue = "";
            int cellType=cell.getCellType();
            switch (cellType) {
            case Cell.CELL_TYPE_NUMERIC: // 数字
                short format = cell.getCellStyle().getDataFormat();
                if (DateUtil.isCellDateFormatted(cell)) {
                    SimpleDateFormat sdf = null;  
                    //System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat());
                    if (format == 20 || format == 32) {  
                        sdf = new SimpleDateFormat("HH:mm");  
                    } else if (format == 14 || format == 31 || format == 57 || format == 58) {  
                        // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)  
                        sdf = new SimpleDateFormat("yyyy-MM-dd");  
                        double value = cell.getNumericCellValue();  
                        Date date = org.apache.poi.ss.usermodel.DateUtil  
                                .getJavaDate(value);  
                        cellValue = sdf.format(date);  
                    }else {// 日期  
                        sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                    }  
                    try {
                        cellValue = sdf.format(cell.getDateCellValue());// 日期
                    } catch (Exception e) {
                        try {
                            throw new Exception("exception on get date data !".concat(e.toString()));
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
                    }finally{
                        sdf = null;
                    }
                }  else {
                    BigDecimal bd = new BigDecimal(cell.getNumericCellValue()); 
                    cellValue = bd.toPlainString();// 数值 这种用BigDecimal包装再获取plainString,可以防止获取到科学计数值
                }
                break;
            case Cell.CELL_TYPE_STRING: // 字符串
                cellValue = cell.getStringCellValue();
                break;
            case Cell.CELL_TYPE_BOOLEAN: // Boolean
                cellValue = cell.getBooleanCellValue()+"";;
                break;
            case Cell.CELL_TYPE_FORMULA: // 公式
                cellValue = cell.getCellFormula();
                break;
            case Cell.CELL_TYPE_BLANK: // 空值
                cellValue = "";
                break;
            case Cell.CELL_TYPE_ERROR: // 故障
                cellValue = "ERROR VALUE";
                break;
            default:
                cellValue = "UNKNOW VALUE";
                break;
            }
            return cellValue;
        }
  • 相关阅读:
    python 取整的两种方法
    django class-based view 考古
    django缓存基于类的视图
    MySQL参数优化案例
    django后台使用MySQL情况下的事务控制详解
    讲讲python“=”运算符上的优雅语法
    p标签不折行的问题
    django-TDD
    session 和 flask_session 实现原理(源码解析)
    网关地址和网关IP是什么,他们有什么关系?
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/11759611.html
Copyright © 2011-2022 走看看