首页 > 其他分享 >easyexcl使用心得

easyexcl使用心得

时间:2024-11-13 16:40:26浏览次数:1  
标签:count easyexcl AsyncReq org 使用 sheet import 心得 response

java代码:

package org.example.easyExc.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.example.easyExc.entity.AsyncReq;
import org.example.easyExc.service.IAsyncReqService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @Author lzg
 * @Create 2024/11/13 13:41
 * Description:
 * @Version 1.0
 */
@Slf4j
@ResponseBody
@Controller
public class EasyExcelController {

    @Autowired
    IAsyncReqService iAsyncReqService;


    @GetMapping("down/{count}")
    public void downExcel(HttpServletResponse response, @PathVariable("count") Integer count) throws InterruptedException, IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试211", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        List<AsyncReq> itemData = data(count);
        int skipIdx = 10000;
        long startTime = System.currentTimeMillis();
        // 这里 指定文件
        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), AsyncReq.class).build()) {
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i = 0; i < 10; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
                WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                excelWriter.write(itemData, writeSheet);
            }
        }

        System.out.println(System.currentTimeMillis() - startTime);

        /**
         *
         * 10000
         * 50000
         * 100000 2.578
         * 500000 13.148
         * 1000000 28.511 10万条数据一个sheet,打开13秒
         */
    }

    /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link AsyncReq}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("/download/{count}")
    public void download(HttpServletResponse response, @PathVariable("count") Integer count) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        List<AsyncReq> itemData = data(count);
        long startTime = System.currentTimeMillis();
        EasyExcel.write(response.getOutputStream(), AsyncReq.class).sheet("模板985").doWrite(itemData);
        System.out.println(System.currentTimeMillis() - startTime);


        /**
         * 10000 1.571
         * 50000 2.954
         * 100000 2.803
         * 500000 12.924
         * 1000000 26.340 100万条数据一个sheet,打开14秒
         *
         */
    }

    private Collection<AsyncReq> data(int start, int end) {
//        QueryChainWrapper<AsyncReq> query = iAsyncReqService.query();
        QueryWrapper<AsyncReq> query = new QueryWrapper<>();
        query.last("limit " + start + "," + end);
        List<AsyncReq> list = iAsyncReqService.list(query);
        log.info("db数量:{}", list.size());
        return list;
    }

    private List<AsyncReq> data(int count) {
        LocalDateTime now = LocalDateTime.now();
        //('234324324', 'mcpdng', 'async_type', 'routing_key', 'exchange', 'org.example.easyExc.entity.AsyncReq', '{}', 'init', '1', '1', '1', '{}', '2024-11-13 13:56:01','2024-11-13 13:56:01', '0');
        AsyncReq asyncReq = new AsyncReq().setAsyncId("121233").setAsyncType("async_type").setRoutingKey("routing_key")
                .setExchange("exchange")
                .setRoutingKey("routing_key")
                .setParamClassName("org.example.easyExc.entity.AsyncReq")
                .setParamJsonDetail("{}")
                .setExecStatus("1")
                .setUpdateTime(now)
                .setCreateTime(now)
                .setExecCount(1)
                .setSendCount(1)
                .setExtInfo("{}");
        List<AsyncReq> list = new ArrayList<>(count);
        for (int i = 0; i < count; i++) {
            list.add(asyncReq);
        }
        log.info("db数量:{}", list.size());
        return list;
    }

//    /**
//     * 文件上传
//     * <p>1. 创建excel对应的实体对象 参照{@link UploadData}
//     * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
//     * <p>3. 直接读即可
//     */
//    @PostMapping("upload")
//    @ResponseBody
//    public String upload(MultipartFile file) throws IOException {
//        EasyExcel.read(file.getInputStream(), AsyncReq.class, new UploadDataListener(uploadDAO)).sheet().doRead();
//        return "success";
//    }
}

小结:

使用了easyexcl 在排除了db的耗时之后, 多sheet页(10个sheet页)和单sheet页, 插入1百万(26s)/50万(12s)/10万(2s)/10万以下(2s)条数据的时间很相似; 几乎无差别, 影响速度的往往是db或是网络
百万条数据下(14s), 多sheet页(10页)和单sheet页, 在打开速度上很相似; 几乎无差别

easyexcl不允许多线程操作多个sheet页;他本身在插入数据表时已经用了多线程,如果多个sheet页再同时开可能会出问题;
可能也是这个原因导致多sheet页下速度没差别

标签:count,easyexcl,AsyncReq,org,使用,sheet,import,心得,response
From: https://www.cnblogs.com/lzghyh/p/18544312

相关文章

  • .net动态类ExpandoObject及使用场景
    它位于System.Dynamic命名空间中。与普通的C#类型不同,ExpandoObject允许在运行时动态地添加、删除或修改其成员(属性或方法)。这使得它在一些需要高度灵活性和动态性的数据结构场景中非常有用。ExpandoObject的基本特性动态成员访问:可以在运行时添加或移除属性和方法。弱类型......
  • 电影票api调用接口如何使用?
    使用电影票API调用接口一般需要以下步骤:1.选择API服务提供商:市场上有许多提供电影票API的服务商,包括电影院线、票务平台或第三方服务公司。要综合考虑其数据准确性、接口稳定性、响应速度、覆盖影院范围以及价格等因素,选择可靠的API服务提供商。2.注册并获取API......
  • 使用 WinNTSetup 来安装 Windows 11 24H2 或 Windows Server 2025 可以帮助你快速创建
    使用WinNTSetup来安装Windows1124H2或WindowsServer2025可以帮助你快速创建和部署操作系统。以下是详细的步骤:1.准备工作在开始之前,确保你已经具备以下条件:WinNTSetup 工具。可以从官方网站或者其他可信的来源下载WinNTSetup。Windows1124H2或WindowsServe......
  • 【Java】自定义注解的使用
    什么是注解java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired、@Override等都是自定义注解。在JAVA中如何实现自定义注解?@interface关键字我们想定义一个自己的注解需要使用@interface来定义。//元注解@Target(ElementType.ME......
  • Fastapi使用redis
    异步版本rediss.pyfromfastapiimportFastAPI,Depends,APIRouterimportredis.asyncioasaioredisimportuvicornfromcontextlibimportasynccontextmanagerapp=FastAPI()#Redis连接池配置REDIS_URL="redis://192.168.252.128:6379/0"@asyncconte......
  • 【Git】最详细的git使用(适用于新手小白)
    一、Git介绍与安装Git(读音为/gɪt/)是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到超大型项目的所有项目。先将本地的文件添加到缓存区,然后提交到本地库,然后上传推送到远程仓库1)下载:https://git-scm.com/downloadswin系统Redirecting…mac系统https://......
  • vue3使用tsParticles实现爆开五彩碎纸屑动效,简单高效免费(撒花特效、粒子效果)
    实现效果:tsParticles|ConfettiPreset|JavaScriptParticles,ConfettiandFireworksanimationsforyourwebsitetsParticles-Easilycreatehighlycustomizableparticles,confettiandfireworksanimationsandusethemasanimatedbackgroundsforyourweb......
  • Python 桌面应用开发:使用 Tkinter 创建 GUI 应用程序
    Python桌面应用开发:使用Tkinter创建GUI应用程序引言随着计算机技术的飞速发展,桌面应用程序依然在许多领域中发挥着重要作用。Python作为一种强大的编程语言,提供了多种工具和库来创建桌面应用程序。其中,Tkinter是Python的标准GUI(图形用户界面)库,易于使用且功能强......
  • 使用Websocket构建小型的IM通讯程序
    目录目录使用PWA构建小型的IM通讯程序简介项目地址界面预览技术栈服务端支持的协议前端总结使用PWA构建小型的IM通讯程序简介使用Websocket、MQTT协议构建小型的IM通信程序,可用于物联网或及时通信等,通过PWA技术,安装到用户手机桌面,提高用户整体交互感。项目地......
  • 室内PPR水管与室外PPR水管的区别主要体现在材料选择、耐候性、安装方式以及使用环境等
    室内PPR水管与室外PPR水管的区别主要体现在材料选择、耐候性、安装方式以及使用环境等方面。PPR(聚丙烯随机共聚物)水管作为一种广泛应用于家装和建筑工程中的管材,具有耐腐蚀、耐高温、无毒环保等优点。然而,由于室内和室外的环境和使用要求不同,PPR水管在设计和生产时会有所区别。1.......