ajax调接口处理表格(easyExcel)

Kent_Sun 等级 164 0 0

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

预览图
收藏
评论区