zoukankan      html  css  js  c++  java
  • EasyPoi导入Excel

    EasyPoi的导出Excel功能和导入功能同样简单。
    我之前强调过,EasyPoi的原理本质就是Poi,正如MyBatis Plus的本质原理就是MyBatis。

    POI导入功能可以参考如下地址:https://blog.csdn.net/justinqin/article/details/78769789
    POI导出功能可以参考如下地址:关于EasyPoi导出Excel

    首先说下,我为什么要用到导入Excel功能?

    因为业务需要有一个Excel表格里面装有数据,然后通过文件上传的形式,直接动态批量录入数据。

    示例流程:

    1.导入Maven依赖

            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-base</artifactId>
                <version>3.0.3</version>
            </dependency>
            
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-web</artifactId>
                <version>3.0.3</version>
            </dependency>
            
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-annotation</artifactId>
                <version>3.0.3</version>
            </dependency>

    2.建立模型(创建实体)

    import java.util.Date;
    
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Pattern;
    
    import org.hibernate.validator.constraints.NotBlank;
    
    import cn.afterturn.easypoi.excel.annotation.Excel;
    
    public class User {
        @Excel(name = "id")
        private String id;
    
        @Excel(name = "姓名")
        private String name;
    
        @Excel(name = "年龄")
        private Integer age;
    
        @Excel(name = "生日", importFormat = "yyyy-MM-dd")
        private Date birthday;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
    }

    3.编写Handle

    import com.eluzhu.lms.entity.User;
    
    import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl;
    
    public class UserExcelHandler extends ExcelDataHandlerDefaultImpl<User> {
        
    
        
        
    
        @Override
        public Object importHandler(User obj, String name, Object value) {
            System.out.println("进来了");
            return super.importHandler(obj, name, value);
        }
    }

    4.编写Controller

    @PostMapping(value="/excelImport",produces="application/json;charset=utf-8")
        public JSONObject excelImport(@RequestParam("file") MultipartFile file) {
            
            JSONObject json = new JSONObject();
            ImportParams importParams = new ImportParams();
            // 数据处理
            IExcelDataHandler<User> handler = new UserExcelHandler();
            handler.setNeedHandlerFields(new String[] { "姓名" });// 注意这里对应的是excel的列名。也就是对象上指定的列名。
            importParams.setDataHanlder(handler);
    
            // 需要验证
            importParams.setNeedVerfiy(true);
    
            try {
                ExcelImportResult<User> result = ExcelImportUtil.importExcelMore(file.getInputStream(), User.class,
                        importParams);
    
                List<User> successList = result.getList();
                List<User> failList = result.getFailList();
                
                log.info("是否存在验证未通过的数据:" + result.isVerfiyFail());
                log.info("验证通过的数量:" + successList.size());
                log.info("验证未通过的数量:" + failList.size());
    
                for (User user : successList) {
                    log.info("成功列表信息:ID=" + user.getId() + user.getName() + "-"
                            + new SimpleDateFormat("yyyy-MM-dd").format(user.getBirthday()));
                }
                for (User user : failList) {
                    log.info("失败列表信息:" + user.getName());
                }
                json.put("returnMsg", "导入数据成功");
                json.put("returnCode", "000000");
            } catch (IOException e) {
                log.error(e.getMessage(), e);
                
                json.put("returnMsg", "I/O异常");
                json.put("returnCode", "111111");
                
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                json.put("returnMsg", "特殊异常");
                json.put("returnCode", "222222");
            
            }
            
            return json;
        }

    5.编写html页面和异步函数

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript" src="../js/jquery-1.11.3.min.js"></script>
    <script type="text/javascript">
    function importExp() {
        var formData = new FormData();
        var name = $("#upfile").val();
        formData.append("file",$("#upfile")[0].files[0]);
        formData.append("name",name);
        $.ajax({
            url : '/lms/excelImportLock',
            type : 'POST',
            async : false,
            data : formData,
            // 告诉jQuery不要去处理发送的数据
            processData : false,
            // 告诉jQuery不要去设置Content-Type请求头
            contentType : false,
            beforeSend:function(){
                console.log("正在进行,请稍候");
            },
            success : function(data) {
              alert(data.returnMsg);
            }
        });
    }
    
    </script>
    </head>
    <body>
    <ul>
        <li>
             <span>上&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;传:</span>
             <span class="input">
                   <input type="file" id="upfile" name="upfile" placeholder=""/>
             </span>
             <button onclick="importExp();">导入</button>
             <span>格式:.xls</span>
         </li>
    </ul>
    
    </body>
    </html>

    六、存在材料

    创建一个Excel表格,如图:

    七、测试

    进入到html页面,上传对应的Excel模板,当弹出导入数据成功时,控制台无报错信息,表示已经测试成功。

    另外从中我思考了,今天是我初次测试导入Excel批量录入数据功能,发现如果要想在页面上多有应用并确保无异常,特别是有的时候无法应用单元测试来达到目的时,可通过简单得html+js函数进行测试,这样也有利于开发效率的提高和避免一定的风险,要知道,页面越复杂,越不利于问题排查和解决。因为有的时候就是引用js类库的冲突,从而影响部分js函数,之前我的这篇文章

    说说Vue.js的v-for就是 

    就是出现这样的问题。

    希望该篇文章能够给大家带来帮助。

  • 相关阅读:
    [导入]如何在SQL Server2000中处理半个汉字的问题(转)
    [导入]ASP访问Access数据表的一些属性
    [导入]下面为转载的对于招行安全控件的分析
    [导入]JavaScript在ASP里的应用!
    [导入]禁用 FSO
    [导入]JScript到底算什么?
    [导入]远程ACCESS数据库的打开方法(转)
    [导入]Flash播放器
    [导入].NET常见问题集锦(1转)
    关于IDbConnectionFactory
  • 原文地址:https://www.cnblogs.com/youcong/p/9483713.html
Copyright © 2011-2022 走看看