2022-03-16 java通过poi读取excel中的日期类型数据或自定义类型日期

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-----14yyyy年m月d日---31yyyy年m月-------57m月d日  ----------58HH:mm-----------20h时mm分  -------32

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

//获取单元格各类型值,返回字符串类型publicstatic String getCellValueByCell(Cell cell) {

        //判断是否为null或空串if(cell==null|| cell.toString().trim().equals("")) {

            return"";

        }

        String cellValue ="";

        intcellType=cell.getCellType();

        switch (cellType) {

        caseCell.CELL_TYPE_NUMERIC:// 数字shortformat = 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 =newSimpleDateFormat("HH:mm"); 

                } elseif(format ==14|| format ==31|| format ==57|| format ==58) { 

                    // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)  sdf =newSimpleDateFormat("yyyy-MM-dd"); 

                    doublevalue = cell.getNumericCellValue(); 

                    Date date = org.apache.poi.ss.usermodel.DateUtil 

                            .getJavaDate(value); 

                    cellValue = sdf.format(date); 

                }else{// 日期  sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

                } 

                try {

                    cellValue = sdf.format(cell.getDateCellValue());// 日期}catch (Exception e) {

                    try {

                        thrownewException("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;

        caseCell.CELL_TYPE_STRING:// 字符串cellValue = cell.getStringCellValue();

            break;

        caseCell.CELL_TYPE_BOOLEAN:// BooleancellValue = cell.getBooleanCellValue()+"";;

            break;

        caseCell.CELL_TYPE_FORMULA:// 公式cellValue = cell.getCellFormula();

            break;

        caseCell.CELL_TYPE_BLANK:// 空值cellValue ="";

            break;

        caseCell.CELL_TYPE_ERROR:// 故障cellValue ="ERROR VALUE";

            break;

        default:

            cellValue ="UNKNOW VALUE";

            break;

        }

        return cellValue;

    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容