zoukankan      html  css  js  c++  java
  • jxls实现导入Excel数据

    SSM项目导入Excel,话不多说,直接干货

    1:添加maven相关依赖 

    <dependency>
                    <groupId>org.jxls</groupId>
                    <artifactId>jxls-reader</artifactId>
                    <version>2.0.2</version>
    </dependency>
    <dependency>
                    <groupId>org.jxls</groupId>
                    <artifactId>jxls</artifactId>
                    <version>2.4.6</version>
    </dependency>

    2:ExcelHead类:存放Excel表的表头信息,导入时要完全匹配表头信息才可导入

     1 public class ExcelHead {
     2     //读取表头
     3     private String head;
     4     //节点 这里要导入的Excel的表头必须和这儿完全匹配
     5     private String point = "节点编号*,节点名称*,节点描述,节点类别,仓库编号*,仓库名称*,是否自动接收*,备注";
     6     public String getHead() {
     7         return head;
     8     }
     9 
    10     public void setHead(String head) {
    11         if (StringUtil.isEmpty(this.head)) {
    12             this.head = head.trim();
    13         } else {
    14             this.head = String.format("%s,%s", this.head, head.trim());
    15         }
    16     }
    17 
    18     public String getPoint() {
    19         return point;
    20     }
    21 
    22     public void setPoint(String point) {
    23         this.point = point;
    24     }
    25 
    26 }

    point-body.xml文件.这里存放的是表体信息

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <workbook>
     3     <worksheet idx="0">
     4         <!-- 表头开始至结束行 -->
     5         <section startRow="0" endRow="0"/>
     6         <!-- 开始循环读取文件数据,配置开始行,items映射的list var映射的bean varType 类路径
     7             startRow:开始循环的行数
     8             endRow-startRow:循环体的大小,0代表一行,依次论推
     9             每循环一次,判断是否结束,不结束继续循环,直至结束
    10         -->
    11         <loop startRow="1" endRow="1" items="pointList" var="sku"
    12               varType="com.eglsc.ams.domain.vo.PointVo">
    13             <!-- 循环开始行 -->
    14             <section startRow="1" endRow="1">
    15                 <!-- 节点编号 -->
    16                 <mapping row="1" col="0" nullAllowed="true">
    17                     sku.pointNo
    18                 </mapping>
    19                 <!-- 节点名称 -->
    20                 <mapping row="1" col="1" nullAllowed="true">
    21                     sku.pointName
    22                 </mapping>
    23                 <!-- 节点描述 -->
    24                 <mapping row="1" col="2" nullAllowed="true">
    25                     sku.pointDescription
    26                 </mapping>
    27                 <!-- 节点类别 -->
    28                 <mapping row="1" col="3" nullAllowed="true">
    29                     sku.pointCategory
    30                 </mapping>
    31                 <!-- 仓库编号 -->
    32                 <mapping row="1" col="4" nullAllowed="true">
    33                     sku.siteNo
    34                 </mapping>
    35                 <!-- 仓库名称 -->
    36                 <mapping row="1" col="5" nullAllowed="true">
    37                     sku.siteName
    38                 </mapping>
    39                 <!-- 是否自动接收 -->
    40                 <mapping row="1" col="6" nullAllowed="true">
    41                     sku.automaticFlag
    42                 </mapping>
    43                 <!-- 备注 -->
    44                 <mapping row="1" col="7" nullAllowed="true">
    45                     sku.remark
    46                 </mapping>
    47             </section>
    48             <!-- 结束条件配置 -->
    49             <loopbreakcondition>
    50                 <rowcheck offset="0">
    51                     <!-- 空白结束不填 -->
    52                     <cellcheck offset="0"></cellcheck>
    53                 </rowcheck>
    54             </loopbreakcondition>
    55         </loop>
    56     </worksheet>
    57 </workbook>

    point-head.xml文件.这里配置的是表头信息

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <workbook>
     3     <worksheet idx="0">
     4         <!-- 表头开始至结束行 -->
     5         <section startRow="0" endRow="0">
     6             <!-- 节点编号 -->
     7             <mapping row="0" col="0" nullAllowed="true">
     8                 excelHead.head
     9             </mapping>
    10             <!-- 节点名称 -->
    11             <mapping row="0" col="1" nullAllowed="true">
    12                 excelHead.head
    13             </mapping>
    14             <!-- 节点描述 -->
    15             <mapping row="0" col="2" nullAllowed="true">
    16                 excelHead.head
    17             </mapping>
    18             <!-- 节点类别 -->
    19             <mapping row="0" col="3" nullAllowed="true">
    20                 excelHead.head
    21             </mapping>
    22             <!-- 仓库编号 -->
    23             <mapping row="0" col="4" nullAllowed="true">
    24                 excelHead.head
    25             </mapping>
    26             <!-- 仓库名称 -->
    27             <mapping row="0" col="5" nullAllowed="true">
    28                 excelHead.head
    29             </mapping>
    30             <!-- 是否自动接收 -->
    31             <mapping row="0" col="6" nullAllowed="true">
    32                 excelHead.head
    33             </mapping>
    34             <!--备注-->
    35             <mapping row="0" col="7" nullAllowed="true">
    36                 excelHead.head
    37             </mapping>
    38         </section>
    39     </worksheet>
    40 </workbook>

    导入代码:

     2     @RequestMapping(value = "/import", method = RequestMethod.POST)
        @Response
    3 @Transactional 4 public Response importExcel(@RequestParam(required = true) MultipartFile file, HttpServletRequest request) { 5 String fileName = file.getOriginalFilename().toLowerCase(); 6 if(!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")){ 7 throw new ApplicationException("请上传Excel文件"); 8 } 9 //获取文件 10 CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile)file; 11 //获取xml文件头配置(我的xml文件是放在/template/import/point目录下的) 12 String xmlConfigPath = String.format("%s%s", request.getServletContext().getRealPath("/"), "/template/import/point/"); 13 String xmlConfigName = String.format("%s%s", xmlConfigPath, "point-head.xml"); 14 Map<String,Object> beans = new HashMap<>(); 15 ExcelHead excelHead = new ExcelHead(); 16 beans.put("excelHead",excelHead); 17 //解析文件头 18 this.parseExcelService.parseExcel(xmlConfigName,commonsMultipartFile,beans); 19 if(!excelHead.getPoint().equals(excelHead.getHead())){ 20 throw new RuntimeException("模板错误"); 21 } 22  //获取文件体信息 23 xmlConfigName = String.format("%s%s", xmlConfigPath, "point-body.xml"); 24 List<PointVo> pointVoList = new ArrayList<>(); 25 beans.clear(); 26 beans.put("pointList",pointVoList); 27 //解析文件体 28 parseExcelService.parseExcel(xmlConfigName,commonsMultipartFile,beans); 29 this.pointService.importExcel(pointVoList); 30 return Response.success("导入成功"); 31 }

    Response类携带着操作结束后的信息,供前端人员调用

    执行到this.pointService.importExcel(pointVoList)这段代码意味着要导入的Excel中的数据已经放到pointList中了,执行pointService中的方法把数据批量导入进数据库中就完成了.

    解析Excel工具类:ParseExcelService

    public class ParseExcelService {
    
        /**
         * 解析Excel
         *
         * @param xmlConfigName        xml配置(字段和Excel单元格的映射)
         * @param commonsMultipartFile 上传的文件
         * @param beans                解析后的数据
         */
        public void parseExcel(String xmlConfigName, CommonsMultipartFile commonsMultipartFile, Map<String, Object> beans) {
            InputStream inputStream = null;
            FileInputStream xmlConfig = null;
            InputStream inputXML = null;
            InputStream inputXLS = null;
            try {
                //上传的文件流
                inputStream = commonsMultipartFile.getInputStream();
                //xml配置的文件流
                xmlConfig = new FileInputStream(xmlConfigName);
                //执行解析
                inputXML = new BufferedInputStream(xmlConfig);
                XLSReader mainReader = ReaderBuilder.buildFromXML(inputXML);
                inputXLS = new BufferedInputStream(inputStream);
                mainReader.read(inputXLS, beans);
            } catch (XLSDataReadException e) {
                logger.error("数据转换异常:", e);
                throw new ApplicationException("数据转换异常");
            } catch (InvalidFormatException e) {
                logger.error("无效格式异常:", e);
                throw new ApplicationException("无效格式异常");
            } catch (FileNotFoundException e) {
                logger.error("文件未找到:", e);
                throw new ApplicationException("文件未找到");
            } catch (SAXException e) {
                logger.error("SAX解析异常:", e);
                throw new ApplicationException("SAX解析异常");
            } catch (IOException e) {
                logger.error("IO流异常:", e);
                throw new ApplicationException("IO流异常");
            } finally {
                try {
                    if (inputXLS != null)
                        inputXLS.close();
                    if (inputXML != null)
                        inputXML.close();
                    if (xmlConfig != null)
                        xmlConfig.close();
                    if (inputStream != null)
                        inputStream.close();
                } catch (IOException e) {
                    logger.error("parse excel error", e);
                }
            }
        }
    
    }
    Code change world
  • 相关阅读:
    Redis安装与配置
    Mysql主从复制
    MySQL的基本使用
    如何理解 python 里面的 for 循环
    我在创业公司的 “云原生” 之旅
    linux 安装 kafka
    数据库性能优化
    Shell 中各种括号的作用
    DNS 配置实例-正反解析-主从同步-分离解析
    DHCP 中继转发配置(ensp 实现)
  • 原文地址:https://www.cnblogs.com/icanner/p/9483524.html
Copyright © 2011-2022 走看看