首页 > 其他分享 >easypoi大批量导出excel数据

easypoi大批量导出excel数据

时间:2023-12-04 15:11:53浏览次数:22  
标签:name 大批量 excel 导出 param workbook easypoi response

easypoi导出excel数据

最近,面临了一个新的需求,需要将表中的几百万数据导出到Excel文件中。为了满足这一需求,我决定采用EasyPoi库来实现该功能,并生成压缩包。

<dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-spring-boot-starter</artifactId>
      <version>4.3.0</version>
</dependency>

下面是我封装的工具类

因为easypoi可以使用@Excel注解来生成excel列所以我就不使用模板了。

使用IExcelExportServer将数据分批查询出来,里面的mapper查询这块需要优化,推荐从非关系型数据库中查询。

/**
     * 大批量导出
     * @param name
     * @param bo
     * @param entityClass
     * @param response
     * @param <T>
     */
    public <T> void matterExport(String name, QueryBo bo, Class entityClass, HttpServletResponse response) {
        IExcelExportServer exportServer = new IExcelExportServer() {
            @Override
            public List<Object> selectListForExcelExport(Object queryParams, int page) {
                LambdaQueryWrapper<User> wrapper = iUserService.buildQueryWrapper(bo);
                String lastsql = "LIMIT " + (page - 1) * limit + ", " + limit;
                wrapper.last(lastsql);

                List<User> reslist = userMapper.selectList(wrapper);
                if (null == reslist || reslist.isEmpty()) {
                    return null;
                }
                List<T> list = JSONObject.parseArray(JSON.toJSONString(reslist), entityClass);
                List<Object> objects = new ArrayList<Object>(list);

                if (list.size() == 0) {
                    return null;
                }
                return objects;
            }
        };

        exportBufferExcel(name, entityClass, exportServer, response);
    }

生产workbook后通过文件流的方式导出

 /**
     * 增强导出
     * @param name
     * @param entityClass
     * @param response
     * @param <T>
     */
    public <T> void exportBufferExcel(String name, Class entityClass, IExcelExportServer exportServer, HttpServletResponse response) {
        ExportParams params = new ExportParams(null, name, ExcelType.XSSF);
        params.setCreateHeadRows(true);
        // 生产workbook
        try {
            Workbook  workbook = ExcelExportUtil.exportBigExcel(params, entityClass, exportServer, null);
            downLoadExcel(name, response, workbook);
        } catch (IOException e) {
            e.printStackTrace();
            log.error("导出失败! ===>{}", e.getMessage());
        }

    }

/**
     * 下载
     *
     * @param fileName 文件名称
     * @param response
     * @param workbook excel数据
     */
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

这样是不是就够了?

本人在用自己的电脑通过本地数据库和jar包测试表数据量达到100w+的时候就有很明显的卡顿了,电脑配置为i7CPU 32G内存。

 

众所周知在Excel中打开超过100万行的数据,可能会导致性能下降和卡顿,部分数据也可能没有及时加载。Excel的最大行数和列数取决于硬件和软件的限制,一般情况下,Excel的行数最大为1048576,列数最大为16384。因此,如果超过了这些限制,Excel可能会出现加载错误。

这个时候单纯的一个excel导出已经不能满足我们的使用需求了。

easypoi多表格大批量导出excel数据

1、对数据进行分片,可以用hutool工具类中ListUtil.partition方法对在数据中查询的数据进行分片

LambdaQueryWrapper<User> wrapper = iUserService.buildQueryWrapper(bo);
List<User> userList = userMapper.selectList(wrapper);
List<List<Map<String, Object>>> partition = ListUtil.partition(userList, partSize);

 

 

 

我们创建一个ThreadPoolExecutor线程池用来提交线程,使用CountDownLatch程序计数器计数,传入线程数,这里也就是我们将要生成的文件个数,然后调用await()方法等待所有线程执行结束。最后关闭线程。

 

标签:name,大批量,excel,导出,param,workbook,easypoi,response
From: https://www.cnblogs.com/yiMro/p/17874992.html

相关文章

  • python处理Excel文件
    一.读取Excel文件在Python中,你可以使用pandas库来读取Excel文件。首先,确保你已经安装了pandas和openpyxl库。如果没有安装,可以使用以下命令进行安装:pipinstallpandasopenpyxl安装完成后,你可以使用以下代码来读取Excel文件:importpandasaspd#读取Excel文件fil......
  • python实现Excel指定区域截图
    方法一:xlwingsimportos.pathimporttimeimportuuidfromioimportBytesIOfromtypingimportUnionimportxlwingsasxwfromPILimportImageGrabdefexcel_grab(excel_path,sheet_name:Union[str,int]=0,cell_area=None,pic_path=None,visible=False,......
  • SpringBoot自定义注解导出Excel
    先定义一个注解importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)public@interfaceExcelHander{Stringvalue()default"";StringlinkFiled()default"";Cel......
  • poi 导出Excel Date日期为数字解决方案
    原本直接输入,怎么都是CST格式乱七八糟的。row.createCell(2).setCellValue("盘点日期:");SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");StringbatchDate=sdf.format(batchInfo.getDate());row.createCell(3).setCellVa......
  • Python中使用OpenpyXL操作Excel
    一、安装openpyxl库可以使用命令pipinstallopenpyxl指定版本与切换国内源请查看pyMySQL库那那一文章的详细解答Python中使用PyMySQL库连接MySQL数据库-AiniIT琦玉-博客园(cnblogs.com)二、读取Excel1、读取全部读取excel写法逻辑如下:读取#调用函数,传递文件名#......
  • PIO----创建Excel表格复杂使用
    导出@RequestMapping(name="下载模板附件实现Model",value={"/uploadFileModel"},method={RequestMethod.GET,RequestMethod.POST})@ResponseBodypublicvoiduploadFileModel(HttpServletRequest......
  • ACCESS 用EXCEL打印报表
    ACCESS报表真是一言难尽啊.看预览还挺正经的. 结果,放大之后,它裂开了,我也裂开了....打印出来,谁看谁尴尬... 调整了很久,还是解决不了,于是愤而改EXCEL.效果如下: PrivateSubCommand647_Click()'打印.点击后禁用此按钮,待操作完成后再恢复,如果你的代码可能出问......
  • Excel 选择性粘贴
    选择......
  • excel有两列数据,第一列条码,第二列数量为1,如何把相同条码的行,数量汇总
    要将相同条码的行的数量汇总,可以使用Excel的"数据透视表"功能。按照以下步骤进行操作:确保你的数据包含两列:第一列是条码,第二列是数量。选中你的数据范围,包括条码和数量列。在Excel菜单栏中选择"插入"选项卡。在"插入"选项卡中,找到并点击"数据透视表"按钮。这将打开"创......
  • WPS Excel如何设置下拉框
    Excel作为一款强大的电子表格软件,提供了各种功能来帮助用户更便捷地管理和分析数据。其中,设置下拉框是一种常用的技巧,可以简化数据输入过程,减少错误。下面我们将介绍如何在Excel中设置下拉框。第一步:打开一个需要设置下拉选项的wps表格。第二步:选中单元格,在菜单栏“数据”中,单......