zoukankan      html  css  js  c++  java
  • Excel利用poi导入导出(上)

    一,pom.xml文件

    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>net.sf.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.6.RELEASE</version> </dependency>

    二、Controller 层调用解析

        @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
        public Result importExcel(@RequestParam(value = "testFile") MultipartFile testFile,
                                  @RequestParam(value = "fileType") Integer fileType, @RequestParam(value = "tableName") String tableName) throws Exception {
            //表内外台账导入
            LOGGER.info("=========进入导入方法表标识==========" + fileType);
            if (testFile == null) {
                return Result.error("请传输文件");
            }
            
            String fileName = dpOriTableInfo.getFileName();
            String tName = tableName.substring(0, tableName.indexOf("."));if (!tName.equals(fileName) && !tName.equals(fileName)) {
                return new Result(-1, "导入文件失败,请选择对应的模板类型或上传正确文件", null);
            }
            InputStream inputStream = null;
            try {
                inputStream = testFile.getInputStream();
                //读取excel
                dataProcessService.uploadExcel(fileType, inputStream);
                return new Result(0, "上传成功", null);
            } catch (Exception e) {
                LOGGER.error("上传出现异常", e);
            }finally {
                if(inputStream != null){
                    inputStream.close();
                }
            }
            return new Result(-1, "上传失败", null);
        }

    三、service

    void uploadExcel(Integer fileType, InputStream inputStream) throws Exception;

    四、业务实现serviceImpl

      @Override
        public void uploadExcel(Integer flieType, InputStream inputStream) throws Exception {
            List<Map<String, Object>> dataList = readExcel(flieType, inputStream);
            if ((TableFalgEnum.TabFlag.ori_bad.getIndex().equals(flieType)) && dataList.size() > 0) {
               
                List<BadLoan> dpLoanList = new ArrayList<>();
                for (int j = 3; j < dataList.size(); j++) {
                    int g = j + 2;
                    Map<Object, Object> map = new HashMap();
                    map = (HashMap) dataList.get(j);
                    try {
                       BadLoan record = new BadLoan();
                        if (map.get("B" + g) != null && map.get("B" + g) != "") {
                            logger.info("=====解析机构代码:{},第几行:{} ", JSONObject.toJSONString(map.get("B" + g)), "B" + g);
                            record.setOrgCode(map.get("B" + g).toString());
                        } else {
                            logger.info("=====解析机构代码:{} ,第几行:{} ", JSONObject.toJSONString(map.get("B" + g)), "B" + g);
                            record.setOrgCode(null);
                        }
                           dpLoanList.add(record);
                        if (dpLoanList.size() >= appConfig.getDpBatchSize()) {
                            //当集合中满500个元素的时候,执行批量新增
                            dpLoanMapper.batchInsertBad(dpLoanList);
                            //新增完成将集合清空,用于下一次批量新增
                            dpLoanList.clear();
                        }
                    } catch (Exception e) {
                        logger.error("解析出现异常", e);
                        updateStatus(flieType, TableFalgEnum.Status.FAIL_STATUS.getIndex());
                    }
                }
                dpLoanMapper.batchInsertBad(dpLoanList);
                //更新原始表是状态与上传时间
                updateStatus(flieType, TableFalgEnum.Status.SUCCESSS_STATUS.getIndex());
    }
    /**
         * 读取excel文件
         *
         * @param type        文件类型
         * @param inputStream 字节liu
         */
        private List<Map<String, Object>> readExcel(Integer type, InputStream inputStream) throws Exception {
            List<Map<String, Object>> dataList = null;
            AssetUploadCheekVo vo = null;
            dataList = AssetExcelReadUtils.parseExcel(inputStream, false, type);
            return dataList;
        }
     public static List<Map<String, Object>> parseExcel(InputStream inputStream, boolean readHeadFlag,int type) throws IOException, InvalidFormatException {
    
            Workbook workbook = WorkbookFactory.create(inputStream);
            return readExcel(workbook,readHeadFlag,type);
        }
    
    /**
         * 解析Excel数据
         * @param workbook Excel工作簿对象
         * @return 解析结果
         */
        private static  List<Map<String,Object>> readExcel(Workbook workbook, boolean readHeadFlag,int type) {
            List<Map<String,Object>> resultDataList = new ArrayList<>();
            // 解析sheet
            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
                Sheet sheet = workbook.getSheetAt(sheetNum);
    
                // 校验sheet是否合法
                if (sheet == null) {
                    continue;
                }
    
                // 获取第一行数据
                int firstRowNum = sheet.getFirstRowNum();
    
                Row firstRow = sheet.getRow(firstRowNum);
    //            if (null == firstRow) {
    //                throw new BusinessException(ResponseCode.PARAMS_ERROR.getCode(),"解析Excel失败,在第一行没有读取到任何数据!");
    //            }
    
                // 解析每一行的数据,构造数据对象
                int rowStart = readHeadFlag ? firstRowNum : firstRowNum + 1 ;
                int rowEnd = sheet.getPhysicalNumberOfRows();
                logger.info("第一行:"+rowStart);
                logger.info("末行:"+rowEnd);
                for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                    Row row = sheet.getRow(rowNum);
                    if (null == row) {
                        continue;
                    }
                    Map<String, Object> map = convertRowToData(row,rowNum,type);
                    resultDataList.add(map);
                }
            }
            return resultDataList;
        }
    
    private static Map<String,Object> convertRowToData(Row row,int rowNum,int type) {
            Map<String,Object> map=new HashMap<>();
            Iterator<Cell> iterator = row.iterator();
            Cell cell = null;
            while (iterator.hasNext()) {
                cell = iterator.next();
                String cellValue = getCellValue(cell).trim();
                cell.getSheet();
               String name=cell.getAddress().toString();
               // logger.info("excel读取列名:{}", name);
                //此处不会读取空值,故不在此进行数据类型校验
               /* switch (name) {
                    case "B":
                        logger.info("excel读取B行:{}", JSONObject.toJSONString(cellValue));
                        if (null==cellValue || cellValue.equals("")){
                            throw new BusinessException(ResponseCode.PARAMS_ERROR.getCode(),""+rowNum+"行"+"B列,"+"姓名不能为空");
                        }
                        map.put(name,cellValue);
                        break;
    **/ map.put(name,cellValue); } } return map; }
    人这辈子没法做太多事情,所以每做一件事都要做到精彩绝伦。 因为,这就是我的宿命。人生苦短,你明白吗? 所以这是我为人生做出的选择
  • 相关阅读:
    makefile实验二 对目标的深入理解 以及rebuild build clean的实现
    makefile实验一 make的基本原则、伪目标、以及不使用.PHONY确实现和伪目标一样功能的一种方法
    IP基础知识
    玩转Libmodbus(二) 写代码体验
    故意使用free掉的内存的一个实验( 常量区/栈)
    使用free掉的内存的危害
    数字签名 数字证书
    哈希
    初识Makefile
    约瑟夫问题及扩展问题的代码实现
  • 原文地址:https://www.cnblogs.com/junjun1578/p/15719158.html
Copyright © 2011-2022 走看看