ajax调接口处理表格(easyExcel)

Kent_Sun 等级 452 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

收藏
评论区

相关推荐

项目实战之---AES 加密
ajax/index.js import axiosApi from '../js/fetch'; import { baseUrl, headerParams } from '../js/baseUrl'; // import引用AES源码js import CryptoJS from 'cryptojs/cryptojs'; console.lo
Java多态实现原理
Java多态概述 多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。 类引用调用的大致过程为:Java编译器将Java源代码编译成c
ajax调接口处理表格(easyExcel)
ajax调接口处理表格 show you my codes. 页面新增按钮 html <DOCTYPE html <html lang"en" <head <meta httpequiv"ContentType" content"text/html; charsetGB2312"/ <title中登网信息导入</title <
Java基础与提高干货系列 -- Java反射机制
前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。 正文 Java反射机制定义 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
Chrome 中 Set-Cookie SameSite 问题
关于 “Chrome 修改对未设置 SameSite 的 cookie,视作 SameSite:Lax 处理的变更” 的问题,目前看,最妥善的解决方案还是按照规矩办事儿,目前 Chrome 是行动最快的,而 FireFox 和 Edge 也在积极跟进,持支持态度。 影响范围: 如果你的项目中有如下跨域场景: 1. 跨域的 ajax
js异步的5种样式
js异步的5种样式 1.定时器 2.AJAX 3.Promise 4.Generator 5.asyns和awite  1.定时器     setTimeout() : 延时器        可以传入三个分别是            1)code:必
vue最新面试题
最近在面试,总结几个重点的面试题:一、vue父子组件之间的传值:简单来说,子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。(具体案例可以看我之前写的博客)。二、vue生命周期函数:beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestr
用python爬取4332条粽子数据进行分析,再送15盒粽子给大家
↑ 点击上方 “凹凸数据” 关注 + 星标  文章干货!有福利 !  端午节快要到了,甜咸粽子之争也快要拉开帷幕。 小五准备用Python爬取淘宝上的粽子数据并进行分析,看看有什么发现。(顺便送大家一波福利)爬虫爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览器自动化操作\[1\]。其实我们还可以利用Ajax接口来构造链接,但是非常
工厂模式实例(顺便回忆反射机制的应用)
一、原理 反射机制的原理JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 工厂模式自述所谓工厂模式,是说由某个产品类接口、产品实现类、工厂类、客户端(单元测试主类)构成的一个模式,大程度的降低了代码的
Java学习路线
阶段一 (夯实基础)Java基础语法学习目标:1.熟悉Java等基本概念2.掌握Eclipse/IDEA集成开发工具的安装、配置和应用3.熟悉Java基本语法、基本类型、运算符和表达式4.掌握分支、循环逻辑语句、数组等知识的应用知识点列表:JDK、JRE、JVM基本概念Java环境搭建和配置安装和使用Eclipse/IDEA开发环境Java基本数据类型变量,
《Python3网络爬虫开发实战》
提取码:1028内容简介 · · · · · ·本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、S
ajax
ajax定义 :异步的JavaScript 和 XML 是一种综合技术:运用了XMLHTTPRequest (xhr) 和服务器交换数据,通过JavaScript 局部渲染页面,从而实现异步的局部更新 同步与异步同步 代码按顺序执行,会阻塞代码执行(alert) 异步 不会阻塞代码 XMLHTTPRequest xhrjs var xhr new
一次搞懂-JavaScript之异步编程
前言异步,就是非同步....这节内容可能会有点枯燥,但是却是 JavaScript 中非常重要的概念,非常有必要去学习。 目的 提升开发效率,编写易维护的代码 引子问题 请求时候为什么页面卡死??js$.ajax( url: "www.xx.com/api", async: false, // true success: function(result
JAVA回调机制(CallBack)之小红是怎样买到房子的??
JAVA回调机制CallBack 序言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按
Python爬虫 | 批量爬取今日头条街拍美图
专栏作者:霖hero,在职爬虫工程师,熟悉JS逆向与分布式爬虫。喜欢钻研,热爱学习,乐于分享。公众号后台回复入群,拉你进技术群与大佬们近距离交流。 01前言 大家好,我是J哥🚀在以前的文章中我们学了Ajax数据爬取,这篇文章我们以今日头条为例,通过分析Ajax请求来抓取今日头条的街拍美图,并将图片下载到本地保存下来。准备好没,我们现在开始! 0