ajax调接口处理表格(easyExcel)

Kent_Sun
• 阅读 1268

ajax调接口处理表格

show you my codes.

页面新增按钮

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB2312"/>
    <title>中登网信息导入</title>
</head>
<body>
<div style="width:90%;margin-top:5px;margin-left: 40px">
    <table style="width:100%;">
        <tr>
            <td>
                <div style="margin-top:5px;margin-left:10px;">
                    <font style="font-size:16px;color:#6FB3E0;">
                        上传中登网信息文件,点击【导入】进行上传,仅支持.xlsx或.xls格式。
                    </font>
                </div>
            </td>
        </tr>
    </table>
</div>
<div style="width:90%;margin-top:5px;margin-left: 60px">
    <table style="width:100%;">
        <tr>
            <td>
                <form id="uploadForm" enctype="multipart/form-data" method="post">
                    <input id="file" type="file" name="file" accept=".xls,.xlsx">
                </form>
            </td>
            <td>
                <input type="button" id="upload" value="导入">
            </td>
            <td></td>
            <td></td>
        </tr>
    </table>
</div>
<br>

<script type="text/javascript" language="JavaScript">

    $('#upload').click(function () {
        let formData = new FormData($('#uploadForm')[0]);
        if(document.getElementById('file').files[0] == null){
            alert("请选择一个要上传的文件!");
            return;
        }
        $.ajax({
            type: 'POST',
            url: '/mogo/api/netRegister/netRegisterExcelDetail',
            data: formData,
            cache: false,
            processData: false,
            contentType: false,
        }).success(function (data) {
            if (data.code === '0000') {
                alert("导入成功!");
                document.getElementById('uploadForm')&&document.getElementById('uploadForm').reset();
            } else {
                alert("导入失败!");
            }
        }).error(function () {
            alert("导入失败");
        });
    });
</script>
</body>
</html>

接口编写

controller

@Controller
@Slf4j
@RequestMapping("/netRegister")
public class NetRegisterController {

    @Autowired
    NetRegisterInformationService netRegisterInfoService;

    @RequestMapping("/netRegisterExcelDetail")
    @ResponseBody
    public GeneralResponse zdwExcelDetail(@RequestParam("file") MultipartFile file) throws IOException {
        return netRegisterInfoService.zdwExcelDetail(file);
    }
}

serviceImpl

/**
     * 中登网excel文件操作
     *
     * @param file excel表格文件
     */
    @Override
    public GeneralResponse zdwExcelDetail(MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            return GeneralResponse.fail("文件为空!");
        }
        int begin = file.getOriginalFilename().indexOf(".");
        int last = file.getOriginalFilename().length();
        String extension = file.getOriginalFilename().substring(begin, last);
        if (".xlsx".equals(extension) || ".xls".equals(extension)) {
            // excel数据读取并存到数据库中
            EasyExcel.read(file.getInputStream(), NetRegisterEntity.class, new NetRegisterInfoListener(this)).sheet().doRead();
        }
        return GeneralResponse.success();
    }

service


public interface NetRegisterInformationService {
 /**
     * 中登网excel文件操作
     *
     * @param file excel表格文件
     */
    GeneralResponse zdwExcelDetail(MultipartFile file) throws IOException;
}

实体类


@Data
public class NetRegisterEntity {
    /**
     * 申请编号
     */
    private String asqbh;

    /**
     * 中登网修改码
     */
    @ExcelProperty(index = 1)
    private String contractNo;
    /**
     * 中登网修改码
     */
    @ExcelProperty(index = 13)
    private String modificationCode;
    /**
     * 中登网编号
     */
    @ExcelProperty(index = 14)
    private String netNumber;
    /**
     * 登记日期
     */
    @ExcelProperty(index = 15)
    @DateTimeFormat("yyyy/MM/dd")
    private String registerDate;
}

监听器


@Slf4j
public class NetRegisterInfoListener extends AnalysisEventListener<NetRegisterEntity> {
    private static final Logger LOGGER = LoggerFactory.getLogger(NetRegisterInfoListener.class);

    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 520;
    List<NetRegisterEntity> list = new ArrayList<NetRegisterEntity>();
    private int failSum = 0;
    private int successSum = 0;

    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private NetRegisterInformationService service;

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param service
     */
    public NetRegisterInfoListener(NetRegisterInformationService service) {
        this.service = service;
    }

    /**
     * 会一行行得返回头
     *
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
//        log.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     * @param analysisContext
     */
    @Override
    public void invoke(NetRegisterEntity data, AnalysisContext analysisContext) {
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 数据解析完了开始调用
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成!成功条数:{}, 失败条数:{}", successSum, failSum);
    }

    /**
     * 存储数据库
     */
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", list.size());
        Map<String, List<String>> map = service.saveOrUpdate(list);
        failSum += map.get("fail").size();
        successSum += map.get("success").size();
        log.info("存储数据库成功!");
    }
}

示例文档

https://www.yuque.com/sunchenpeng/hvrfpu/10490230

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
2年前
JS获取表单元素的值
<html<head<metahttpequiv"contenttype"content"text/html;charsetutf8"<title测试</title</head<body<formid"form1"name"form1"文本框
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这