zoukankan      html  css  js  c++  java
  • 00021-layui 上传excel,java 解析excel 数据

    按钮:

    <button class="layui-btn layui-btn-sm" id="upload_importCustomer">导入</button>
    

    upload 控件渲染:

    upload.render({
        elem: '#upload_importCustomer'
        ,url: ctx+'/customer/customer/importData/'
        ,accept: 'file' //普通文件
        ,data:{importType:1}
        ,done: function(response){
            layer.msg('导入完成,若无数据,请到【导入记录】页面查看,或5秒后刷新');
            setTimeout(function () {
                active.reload();
            },3000);
        }
        ,error: function(){
            layer.msg('导入失败,请到【导入记录】页面查看!');
            active.reload();
        }
    });
    

    java:

    /**
         * 导入客户
         */
        @RequestMapping(value = "importData")
        @ResponseBody
        public Object importData(@RequestParam("importType") Integer importType,HttpServletRequest request, HttpServletResponse response){
            BaseResp resp = new BaseResp();
    
            try {
                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                MultiValueMap<String, MultipartFile> map = multipartRequest.getMultiFileMap();
                StringBuffer sb = new StringBuffer();
                ExcelReadUtil excel = null;
                if (map != null) {
                    Iterator iter = map.keySet().iterator();
                    while (iter.hasNext()) {
                        String str = (String) iter.next();
                        List<MultipartFile> fileList = map.get(str);
                        for (MultipartFile mpf : fileList) {
                            excel = new ExcelReadUtil();
                            excel.importExcel(mpf.getInputStream());
                            String errMsg = "";
                            Map<String,Object> checkMap = CustomerImportUtils.checkCustomerImport(excel,errMsg);
                            if ("false".equals(checkMap.get("check"))) {
                                sb.append(mpf.getOriginalFilename()+ "文件,"+checkMap.get("msg")+"未填写");
                            } else {
    //                            List<AccountCustomerImportPo> records = CustomerImportUtils.getAccountCustomerFormExcel(excel);
                                List<CustomerImportRecordPo> records = (List<CustomerImportRecordPo>)checkMap.get("list");
                                System.out.println("records.size="+records.size());
                                ImportRecordThread thread = new ImportRecordThread(records, mpf.getOriginalFilename(),importType,getUser());
                                thread.start();
                            }
                        }
                    }
                }
                if (sb.length() > 0) {
                    resp.setCode(BaseResp.RC_NOT);
                    resp.setSuccess(false);
                    resp.setMsg(sb.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
                logger.warn("controller Exception: ", e);
                resp.setCode(BaseResp.RC_NOT);
                resp.setSuccess(false);
                resp.setMsg("导入客户失败!请检查文件格式和必填栏目");
            }
    
            return resp;
        }
    

    重点代码是:
    List fileList = map.get(str);
    获取文件。

    处理文件:

            excel = new ExcelReadUtil();
            excel.importExcel(mpf.getInputStream());
    

    ExcelReadUtil.java:

    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.xssf.usermodel.*;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;
    
    public class ExcelReadUtil {
    
        private XSSFWorkbook workbook;// 工作簿
    
        /**
         * 读取文件路径字符串。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param strfile
         */
        public void importExcel(String strfile) {
            try {
                // 获取工作薄workbook
                workbook = new XSSFWorkbook(new FileInputStream(strfile));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 读取文件。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param file
         */
        public void importExcel(File file) {
            try {
                workbook = new XSSFWorkbook(new FileInputStream(file));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 读取文件流。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param filestream
         */
        public void importExcel(InputStream filestream) {
            try {
                workbook = new XSSFWorkbook(filestream);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取想要第几张工作表第几行的数据importExcel导入。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param sheetNumber
         * @return
         */
        @SuppressWarnings("deprecation")
        public List<Vector<Object>> readSet(int sheetNumber, int rowIndex) {
            List<Vector<Object>> result = new ArrayList<Vector<Object>>();
            try {
                // 获得指定的sheet
                XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
                // 获得sheet总行数
                int rowCount = sheet.getLastRowNum();
                if (rowCount < 1) {
                    return result;
                }
                // HashMap<Integer, Object> map=new HashMap<Integer, Object>();
                // 遍历行row
                for (; rowIndex <= rowCount; rowIndex++) {
                    // 获得行对象
                    XSSFRow row = sheet.getRow(rowIndex);
                    if (null != row) {
                        // List<Object> rowData = new ArrayList<Object>();
                        Vector<Object> vector = new Vector<Object>();
                        // 获得本行中单元格的个数
                        int cellCount = row.getLastCellNum();
                        // 遍历列cell
                        for (short cellIndex = 0; cellIndex < cellCount; cellIndex++) {
                            XSSFCell cell = row.getCell(cellIndex);
                            // 获得指定单元格中的数据
                            Object cellStr = this.getCellString(cell);
    
                            // map.put(arg0, arg1)
                            vector.add(cellStr);
                        }
                        result.add(vector);
                    }
                }
            } catch (Exception e) {
                System.out.println("readSet error:"+e.getMessage());
                result = null;
            }
            return result;
        }
    
        /**
         * 获取想要第几张工作表的数据importExcel导入。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param sheetNumber
         * @return
         */
        @SuppressWarnings({"unchecked", "deprecation"})
        public List readSet(int sheetNumber) {
            List<List> result = new ArrayList<List>();
            // 获得指定的sheet
            XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
            // 获得sheet总行数
            int rowCount = sheet.getLastRowNum();
            if (rowCount < 1) {
                return result;
            }
            // HashMap<Integer, Object> map=new HashMap<Integer, Object>();
            // 遍历行row
            for (int rowIndex = 0; rowIndex <= rowCount; rowIndex++) {
                // 获得行对象
                XSSFRow row = sheet.getRow(rowIndex);
                if (null != row) {
                    // List<Object> rowData = new ArrayList<Object>();
                    Vector<Object> vector = new Vector<Object>();
                    // 获得本行中单元格的个数
                    int cellCount = row.getLastCellNum();
                    // 遍历列cell
                    for (short cellIndex = 0; cellIndex < cellCount; cellIndex++) {
                        XSSFCell cell = row.getCell(cellIndex);
                        // 获得指定单元格中的数据
                        Object cellStr = this.getCellString(cell);
    
                        // map.put(arg0, arg1)
                        vector.add(cellStr);
                    }
                    result.add(vector);
                }
            }
    
            return result;
        }
    
        /**
         * 从第几张工作表第几行的数据importExcel导入。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param sheetNumber
         * @param rowIndex
         * @return
         */
        @SuppressWarnings({"unchecked", "deprecation"})
        public List readRow(int sheetNumber, int rowIndex) {
            List result = new ArrayList();
            // 获得指定的sheet
            XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
            // 获得sheet总行数
            int rowCount = sheet.getLastRowNum();
            if (rowCount < 1) {
                return result;
            }
            // 遍历行row
            // for (int rowIndex = rows+2; rowIndex <= rowCount; rowIndex++) {
            // 获得行对象
            XSSFRow row = sheet.getRow(rowIndex);
            if (null != row) {
                // Vector<Object> vector=new Vector<Object>();
                // 获得本行中单元格的个数
                int cellCount = row.getLastCellNum();
                // 遍历列cell
                for (short cellIndex = 0; cellIndex < cellCount; cellIndex++) {
                    XSSFCell cell = row.getCell(cellIndex);
                    // 获得指定单元格中的数据
                    Object cellStr = this.getCellString(cell);
                    // vector.add(cellStr);
                    result.add(cellStr);
                }
            }
            // }
    
            return result;
        }
    
        /**
         * 获取指定工作表的总。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param sheetNumber
         * @return
         */
        public int getRowIndex(int sheetNumber) {
            XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
            // 获得sheet总行数
            int rowCount = sheet.getLastRowNum();
            if (rowCount < 1) {
                return 0;
            }
            return rowCount;
        }
    
        /**
         * 从第几张工作表第几行读到第几行。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param sheetNumber
         * @param rows
         * @param getrows
         * @return
         */
        @SuppressWarnings({"unchecked", "deprecation"})
        public List readCell(int sheetNumber, int rows, int getrows) {
            List<List> result = new ArrayList<List>();
    
            // 获得指定的sheet
            XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
            // 获得sheet总行数
            int rowCount = getrows;
            if (rowCount < 1) {
                return result;
            }
            // HashMap<Integer, Object> map=new HashMap<Integer, Object>();
            // 遍历行row
            for (int rowIndex = rows + 2; rowIndex <= rowCount; rowIndex++) {
                // 获得行对象
                XSSFRow row = sheet.getRow(rowIndex);
                if (null != row) {
                    // List<Object> rowData = new ArrayList<Object>();
                    Vector<Object> vector = new Vector<Object>();
                    // 获得本行中单元格的个数
                    int cellCount = row.getLastCellNum();
                    // 遍历列cell
                    for (short cellIndex = 0; cellIndex < cellCount; cellIndex++) {
                        XSSFCell cell = row.getCell(cellIndex);
                        // 获得指定单元格中的数据
                        Object cellStr = this.getCellString(cell);
                        // map.put(arg0, arg1)
                        vector.add(cellStr);
                    }
                    result.add(vector);
                }
            }
    
            return result;
        }
    
        /**
         * 读取第几张工作表的第几列。
         * <p>
         * 详细描述。
         * </p>
         *
         * @param sheetNumber
         * @param cells
         * @return
         */
        @SuppressWarnings("unchecked")
        public List readColum(int sheetNumber, int cells) {
            List<List> result = new ArrayList<List>();
    
            // 获得指定的sheet
            XSSFSheet sheet = workbook.getSheetAt(sheetNumber);
            // 获得sheet总行数
            int rowCount = sheet.getLastRowNum();
            if (rowCount < 1) {
                return result;
            }
            // HashMap<Integer, Object> map=new HashMap<Integer, Object>();
            // 遍历行row
            for (int rowIndex = 2; rowIndex <= rowCount; rowIndex++) {
                // 获得行对象
                XSSFRow row = sheet.getRow(rowIndex);
                if (null != row) {
                    // List<Object> rowData = new ArrayList<Object>();
                    Vector<Object> vector = new Vector<Object>();
                    // 获得本行中单元格的个数
                    XSSFCell cell = row.getCell(cells);
                    Object cellStr = this.getCellString(cell);
                    vector.add(cellStr);
                    result.add(vector);
                }
            }
            return result;
        }
    
        /**
         * 获取一个cell的数据类型
         *
         * @param cell
         * @return
         */
        private Object getCellString(XSSFCell cell) {
            Object result = null;
            if (cell != null) {
                // 单元格类型:Numeric:0,String:1,Formula:2,Blank:3,Boolean:4,Error:5
                int cellType = cell.getCellType();
                switch (cellType) {
                    case HSSFCell.CELL_TYPE_STRING:
                        result = cell.getRichStringCellValue().getString();
                        break;
                    case HSSFCell.CELL_TYPE_NUMERIC:
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {
                            result = cell.getDateCellValue();
                        } else
                            result = cell.getNumericCellValue();
                        break;
                    case HSSFCell.CELL_TYPE_FORMULA:
                        result = cell.getNumericCellValue();
                        break;
                    case HSSFCell.CELL_TYPE_BOOLEAN:
                        result = cell.getBooleanCellValue();
                        break;
                    case HSSFCell.CELL_TYPE_BLANK:
                        result = null;
                        break;
                    case HSSFCell.CELL_TYPE_ERROR:
                        result = null;
                        break;
                    default:
                        break;
                }
            }
            return result;
        }
    
        /**
         * 删除整行
         *
         * @param sheetNum
         * @param rowNum
         */
        public void deleteRow(int sheetNum, int rowNum) {
            XSSFSheet sheet = workbook.getSheetAt(sheetNum);
            int lastRowNum = sheet.getLastRowNum();
            if (rowNum >= 0 && rowNum < lastRowNum)
                sheet.shiftRows(rowNum + 1, lastRowNum, -1);//将行号为rowIndex+1一直到行号为lastRowNum的单元格全部上移一行,以便删除rowIndex行
            if (rowNum == lastRowNum) {
                XSSFRow removingRow = sheet.getRow(rowNum);
                if (removingRow != null)
                    sheet.removeRow(removingRow);
            }
        }
    
        /**
         * 在行最后添加一个单元格
         *
         * @param sheetNum
         * @param rowNum
         */
        public void addCell(int sheetNum, int rowNum, String content) {
            XSSFSheet sheet = workbook.getSheetAt(sheetNum);
            XSSFRow row = sheet.getRow(rowNum);
            XSSFCell cell = row.createCell(row.getLastCellNum());
            XSSFCellStyle style = row.getCell(0).getCellStyle();
            cell.setCellStyle(style);
            cell.setCellValue(content);
        }
    
        /**
         * 新增或者修改特定单元格
         *
         * @param sheetNum
         * @param rowNum
         * @param content
         */
        public void addModifyCell(int sheetNum, int rowNum, int columnNum, String content) {
            XSSFSheet sheet = workbook.getSheetAt(sheetNum);
            XSSFRow row = sheet.getRow(rowNum);
            XSSFCell cell = row.getCell(columnNum);
            if (row.getCell(columnNum) == null) {
                cell = row.createCell(columnNum);
                XSSFCellStyle style = row.getCell(0).getCellStyle();
                cell.setCellStyle(style);
            }
            cell.setCellValue(content);
        }
    
        public XSSFWorkbook getWorkbook() {
            return workbook;
        }
    
        public void setWorkbook(XSSFWorkbook workbook) {
            this.workbook = workbook;
        }
    }
    

    接下来是解析excel数据,转成list:

    Map<String,Object> checkMap = CustomerImportUtils.checkCustomerImport(excel,errMsg);
    

    CustomerImportUtils.java:

    public class CustomerImportUtils {
    
       private static ImportException setCheckMap(Map<String,Object> checkMap,int rowIndex,int colIndex){
          checkMap.put("check","false");
          char c = 'A';
          c = (char)(c+colIndex);
          checkMap.put("msg","【"+(rowIndex+2)+"行"+c+"列】");
          return new ImportException();
       }
    
    
       public static Map<String,Object> checkCustomerImport(ExcelReadUtil excel,String errMsg){
          Map<String,Object> checkMap = new HashMap<String,Object>();
          int dataStartRow = 1;
          int colIndex = 0; // 列序号
          List<Vector<Object>> list = excel.readSet(0, dataStartRow);
          if(list==null){
             checkMap.put("check","false");
             checkMap.put("msg","表格中存在表达式,请检查!");
          }
          boolean result = true;
          List<CustomerImportRecordPo> customerImportRecordPoList = new ArrayList<CustomerImportRecordPo>();
          if (list != null && list.size() > 0) {
             for (int i = 0, index = dataStartRow; i < list.size(); i++) {
                CustomerImportRecordPo customerImportRecordPo = new CustomerImportRecordPo();
                try{
                   Vector<Object> vector = list.get(i);
                   //cjianquan 2019/11/18 这里是页签
                   if(vector!=null && vector.size()==1 && "客户信息".equals(vector.get(0))){
                      continue;
                   }
                   try{
                      if (checkVectorNotNull(vector)) { // 校验行数据不为null
                         int size = 1;
                         if (vector.size() >= size) { // 至少包含两列(至少包含两列必填项)
    
                            colIndex = 0;
                            String region = cellDataDeal(vector.get(colIndex), ""); // 区域
                            if (StringUtils.isBlank(region)) {
                               result = false;
                               throw setCheckMap(checkMap,i,colIndex);
                            }
                            customerImportRecordPo.setRegion(region);
                            ++colIndex;
    
                            String name = cellDataDeal(vector.get(colIndex), ""); // 公司名称
                            if (StringUtils.isBlank(name)) {
                               result = false;
                               throw setCheckMap(checkMap,i,colIndex);
                            }
                            name = name.replaceAll(" ","").replaceAll("\(","(").replaceAll("\)",")");
                            customerImportRecordPo.setName(name);
                            ++colIndex;
    
                            String contacts = cellDataDeal(vector.get(colIndex), ""); // 联系人
                            if (StringUtils.isBlank(contacts)) {
                               result = false;
                               throw setCheckMap(checkMap,i,colIndex);
                            }
                            customerImportRecordPo.setContacts(contacts);
                            ++colIndex;
    
                            String mobile = cellDataDeal(vector.get(colIndex), ""); // 手机号
                            if (StringUtils.isBlank(mobile)) {
                               result = false;
                               throw setCheckMap(checkMap,i,colIndex);
                            }
                            customerImportRecordPo.setMobile(mobile);
                            ++colIndex;
    
                            String issueTime = cellDataDeal(vector.get(colIndex), ""); // 企业注册日期*
                            customerImportRecordPo.setIssueTime(issueTime);
                            ++colIndex;
    
                            String taxpayerType = cellDataDeal(vector.get(colIndex), ""); // 纳税人类型
                            customerImportRecordPo.setTaxpayerType(taxpayerType);
                            ++colIndex;
    
                            String telephone = cellDataDeal(vector.get(colIndex), ""); // 固话号码
                            customerImportRecordPo.setTelephone(telephone);
                            ++colIndex;
    
                            String address = cellDataDeal(vector.get(colIndex), ""); // 详细地址
                            customerImportRecordPo.setAddress(address);
                            ++colIndex;
    
                            String industry = cellDataDeal(vector.get(colIndex), ""); // 所属行业
                            customerImportRecordPo.setIndustry(industry);
                            ++colIndex;
    
                            String email = cellDataDeal(vector.get(colIndex), ""); // 电子邮箱
                            customerImportRecordPo.setEmail(email);
                            ++colIndex;
    
                            String website = cellDataDeal(vector.get(colIndex), ""); // 客户网址
                            customerImportRecordPo.setWebsite(website);
                            ++colIndex;
    
                            String remark = cellDataDeal(vector.get(colIndex), ""); // 备注描述
                            customerImportRecordPo.setRemark(remark);
                            ++colIndex;
    
    
                            customerImportRecordPoList.add(customerImportRecordPo);
                         } else {
                            result = false;
                         }
                      }
                   }catch (ArrayIndexOutOfBoundsException e){
                      //cjianquan 2019/11/18 因为很多为空,不算入列长
                      e.printStackTrace();
                      customerImportRecordPoList.add(customerImportRecordPo);
                      continue;
                   }
                }catch (ImportException e){
                   customerImportRecordPoList.add(customerImportRecordPo);
                }
                if(!result){
                   break;
                }
             }
          }
          checkMap.put("list",customerImportRecordPoList);
          return checkMap;
       }
    
    
       /**
        * 处理单元格数据,最终转换成字符串类型
        * 
        * @param cellData
        * @return
        */
       private static String cellDataDeal(Object cellData, String type) {
          String str = "";
          if (cellData == null) {
          } else if (cellData instanceof String) {
             str = (String) cellData;
          } else if (cellData instanceof Double) {
             double tmp = (Double) cellData;
             if (type.equals("integer")) {
                long tmp2 = (long) tmp;
                str = String.valueOf(tmp2);
             } else if (type.equals("double")) {
                str = String.valueOf(tmp);
             } else {
                long tmp2 = (long) tmp;
                str = String.valueOf(tmp2);
             }
             // long tmp2 = (long) tmp;
          } else if (cellData instanceof Integer) {
             int tmp = (Integer) cellData;
             str = String.valueOf(tmp);
          } else if (cellData instanceof Float) {
             float tmp = (Float) cellData;
             str = String.valueOf(tmp);
          } else if (cellData instanceof Long) {
             long tmp = (Long) cellData;
             str = String.valueOf(tmp);
          } else if (cellData instanceof Date) {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             str = sdf.format(cellData);
          } else {
             str = (String) cellData;
          }
          return str;
       }
    
       /**
        * 校验行数据不为null
        * 
        * @param vector
        * @return
        */
       private static boolean checkVectorNotNull(Vector<Object> vector) {
          int j = 0;
          int size = vector.size();
          for (int i = 0; i < size; i++) {
             if (vector.get(i) != null) {
                return true;
             } else {
                j++;
             }
          }
          if (j == size) {
             return false;
          } else {
             return true;
          }
       }
    

    ImportException 是自定义异常类:

    public class ImportException extends Exception {
        private static final long serialVersionUID = -6357149550353160810L;
    
        private int code;
        private String msg;
    
        public ImportException(){
            super();
        }
    
        public ImportException(int code){
            super("ImportException code="+code);
        }
    
        public ImportException(int code, String msg){
            super("ImportException code="+code+",msg="+msg);
        }
    
    }
    
  • 相关阅读:
    副业收入是我做程序员的2倍!副业这么有 “钱”景,我要考虑转行吗?
    C语言丨const关键字的用法详解
    C/C++学习笔记:C/C++函数调用的方式,你应该要学会这五种
    软件崩溃了,该如何解决? 解决问题的关键要会对症下药!
    C语言丨深入理解volatile关键字
    C语言丨getch(),getche()和getchar()的区别
    学编程的误区——眼高手低,不重视练习!
    通过编写“猜测数字”游戏来探索Linux中的Bash
    零基础想要更快入门Linux?找对方法,让你少奋斗10年!
    VS/VC 出现闪退怎么办?这4个技巧要知道!
  • 原文地址:https://www.cnblogs.com/jianquan100/p/13040587.html
Copyright © 2011-2022 走看看