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
  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/icanner/p/9483524.html
Copyright © 2011-2022 走看看