EasyPoi使用模板导出大量数据自动拆分Sheet

用途:当导出数据超过6.5w是excel显示异常,所以想到了写这个工具类

实现逻辑:先用原生poi复制原有工作簿,并将原来list,拆分为list、list1、list2,在使用easypoi导入到新的模板中

原模板:

生成的临时模板(实际看不到): 

代码如下:

maven引包:

 <!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-base -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.4.0</version>
        </dependency>

代码:

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.jupiter.api.Test;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * EasyPoi使用模板导出大量数据自动拆分Sheet
 *
 * @author LaoNa
 * @since 2020-12-25
 */
public class T1 {

    @Test
    public void t3() throws Exception {
        List<Map<String, String>> list = new ArrayList<>();
        Map<String, Object> map = new HashMap<>();
        for (int i = 0; i < 100; i++) {
            Map<String, String> m = new HashMap<>();
            m.put("xh", "" + i);
            m.put("propertyName", "a" + i);
            list.add(m);
        }
        map.put("list", list);
        create(map, "G:\\1.poi\\wjsdjrk.xls", 0, 1);
    }

    /**
     * @param data         传入的数据
     * @param templatePath 传入的模板路径
     * @param cell         list 所在列
     * @param row          list 所在行
     * @return
     */
    public static ByteArrayOutputStream create(Map data, String templatePath, int cell, int row) {
        try {

            //拆分数据
            int len = 19;
            Map<String, Object> result = new HashMap<>();
            List<Object> list = (List<Object>) data.get("list");
            int size = list.size();
            int count = (size + len - 1) / len;
            for (int i = 0; i < count; i++) {
                List<Object> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
                if (i == 0) {
                    result.put("list", subList);   //list
                } else {
                    result.put("list" + i, subList);  //list1  list2
                }
            }
            //创建新模板
            //Sprongboot用
            ClassPathResource cpr = new ClassPathResource(templatePath);
            InputStream fis = cpr.getInputStream();
            //直接写路径用,测试用
//            File file = new File(templatePath);
//            FileInputStream fis = new FileInputStream(file);
            HSSFWorkbook wb = new HSSFWorkbook(fis);
            String listName = wb.getSheetAt(0).getRow(row).getCell(cell).getStringCellValue();
            for (int i = 0; i < count - 1; i++) {
                HSSFSheet sheet = wb.cloneSheet(0);
                sheet.getRow(row).getCell(cell).setCellValue(listName.replaceAll("list", "list" + (i + 1)));
            }
            //把新模板导出为文件,测试用
//            FileOutputStream fos = new FileOutputStream("G:\\1.poi\\wjsdjrk22.xls");
//            wb.write(fos);
//            fis.close();
//            fos.close();
//            wb.close();

            //导出文件
            TemplateExportParams params = new TemplateExportParams();
            params.setTemplateWb(wb);       //设置模板
            params.setScanAllsheet(true);       //所有工作簿都操作
            String[] sheetNameArray = new String[count];  //给工作簿起名
            for (int i = 0; i < count; i++) {
                sheetNameArray[i] = "Sheet" + (i + 1);
            }
            params.setSheetName(sheetNameArray);
            Workbook book = ExcelExportUtil.exportExcel(params, result);  //导出
            //把数据导出为文件,测试用
//            FileOutputStream fos1 = new FileOutputStream("G:\\1.poi\\zhcx11.xls");
//            book.write(fos1);
//            fis.close();
//            fos1.close();
//            book.close();
//            return null;
            //返回用,实际用
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
            book.write(outputStream);
            writer.close();
            return outputStream;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
easypoi通过模板导出excel的步骤如下: 1. 准备数据:首先,需要准备好要填充到模板中的数据。可以用一个list中的map来表示每一页的数据。每个map对应着一页文档的数据,而list中的每个元素对应着一页文档。例如,可以创建一个List<Map<String, Object>>来存储数据。 2. 设置模板和参数:然后,需要设置模板路径和参数。可以使用TemplateExportParams类来读取模板,设置sheet名,并且将数据map传入。 3. 导出excel:接下来,使用ExcelExportUtil.exportExcel方法导出excel。该方法接受模板参数和数据参数,并返回一个Workbook对象。 4. 写出excel:最后,将Workbook对象写出到输出流中即可下载。可以通过调用Workbook的write方法将数据写入到response的输出流中。 需要注意的是,导出过程中可能会出现样式问题,比如模板中的单元格合并了,但导出的excel并没有合并。这时可以通过手动处理来解决合并单元格的问题。 以上是通过easypoi通过模板导出excel的基本步骤。你可以参考提供的代码示例和使用easypoi的相关文档来具体实现。 [2 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Easypoi使用模板导出文档或excel表格详解](https://blog.csdn.net/qq_44845339/article/details/110537034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [使用easyPoi根据模板导出excel](https://blog.csdn.net/weixin_44854514/article/details/120311371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老衲丶有点浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值