• 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; }
    人这辈子没法做太多事情,所以每做一件事都要做到精彩绝伦。 因为,这就是我的宿命。人生苦短,你明白吗? 所以这是我为人生做出的选择
  • 相关阅读:
    The formatter threw an exception while trying to deserialize the message in WCF
    通过Web Deploy方式部署WCF
    The Managed Metadata Service or Connection is currently not available
    How to create Managed Metadata Column
    冒泡算法
    asp.net core 实战项目(一)——ef core的使用
    Vue学习笔记入门篇——安装及常用指令介绍
    Vue学习笔记入门篇——数据及DOM
    Vue学习笔记目录
    Chart.js在Laravel项目中的应用
  • 原文地址:https://www.cnblogs.com/junjun1578/p/15719158.html
Copyright © 2020-2023  润新知