SpringBoot集成EasyExcel实现模板写入多个sheet导出

EasyExcel使用模板导出多个sheet

开发环境

SpringBoot2.6+EasyExcel3.2.1

//第一种输出到指定目录
public static void main(String[] args) throws FileNotFoundException {
    InputStream inputStream = new FileInputStream(new File("模板位置"));
    InputStream inputStream1 = cloneSheet(inputStream, 0, "sheet11", "sheet12", "sheet13");
    //TODO 省略写入业务数据
    StreamUtil.inputStreamToFile(inputStream1, new File("导出数据指定输出位置"));
}

//第二种返回文件流,可用于上传文件资源服务器
public ByteArrayOutputStream export(){
	@Cleanup ByteArrayOutputStream os = new ByteArrayOutputStream();
		 List<String> stringList = Lists.newArrayList();
		 stringList.add("1");
		 stringList.add("2");
		//读取resource文件目录下的模板,打成jar包也能读取到
     	 InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("模板名称.xlsx");
        InputStream inputStream = cloneSheet(resourceAsStream, 0, stringList);
        ExcelWriter excelWriter = null;
        try{
         excelWriter = EasyExcel.write(os).withTemplate(inputStream).build();
         //遍历已经封装好要写入的模板的数据集合,一般一个对象写一个sheet
         for(int i =0;i<10;i++){
        	 excelWriter.fill(dtoList.get(i),writeSheet);
       	  }
        }finally{
         if(null != excelWriter){
                excelWriter.finish();
            }
        }
        return os;
}

/**
 * 克隆sheet
 * 注意传入的文件流在执行本方法后将关闭
 *
 * @param excelIns      excel文件流
 * @param tplSheetIndex 需要克隆的模板索引
 * @param newSheetNames 所需要生成的excel最终的sheet名
 * @return 新的InputStream
 */
@SneakyThrows
public static InputStream cloneSheet(InputStream excelIns, int tplSheetIndex, String... newSheetNames) {
//        Workbook workbook = isXlsx(excelIns) ? new XSSFWorkbook(excelIns) : new HSSFWorkbook(excelIns);
    Workbook workbook = new XSSFWorkbook(excelIns);
    Sheet tplSheet = workbook.getSheetAt(tplSheetIndex);//模板sheet
    for (int i = 0; i < newSheetNames.length; i++) {
        String sheetName = newSheetNames[i];
        if (0 == i) {//第一个,直接改名即可
            workbook.setSheetName(0, sheetName);
        } else {
            Sheet newSheet = workbook.cloneSheet(0);
            //同时复制打印设置
            PrintSetup tplPrintSetup = tplSheet.getPrintSetup();
            PrintSetup newPrintSetup = newSheet.getPrintSetup();
            newPrintSetup.setLandscape(tplPrintSetup.getLandscape());//打印方向,true:横向,false:纵向(默认)
            newPrintSetup.setPaperSize(tplPrintSetup.getPaperSize());//纸张类型

            int sheetIndex = workbook.getSheetIndex(newSheet);
            workbook.setSheetName(sheetIndex, sheetName);
        }
    }
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
        workbook.write(bos);
        byte[] bytes = bos.toByteArray();
        InputStream ins = new ByteArrayInputStream(bytes);
        return ins;
    } finally {
        if (null != excelIns) excelIns.close();
    }
}

相关推荐

  1. SpringBoot集成EasyExcel实现模板写入sheet导出

    2024-07-19 08:12:03       21 阅读
  2. EasyExcel list<Map>批量导出sheet

    2024-07-19 08:12:03       56 阅读
  3. EasyExcel模板填充以及填充sheet

    2024-07-19 08:12:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 08:12:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 08:12:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 08:12:03       57 阅读
  4. Python语言-面向对象

    2024-07-19 08:12:03       68 阅读

热门阅读

  1. python中excel的读取和写入

    2024-07-19 08:12:03       19 阅读
  2. Python 3 CGI编程

    2024-07-19 08:12:03       18 阅读
  3. 为什么 HashMap 的容量是 2 的整次幂?

    2024-07-19 08:12:03       15 阅读
  4. C++编程逻辑讲解step by step:利用文档类处理数据

    2024-07-19 08:12:03       20 阅读
  5. 【Oracle】Oracle中的LISTAGG函数

    2024-07-19 08:12:03       18 阅读
  6. new和malloc

    2024-07-19 08:12:03       21 阅读
  7. Redis 地理位置 GEO 模块

    2024-07-19 08:12:03       21 阅读
  8. 一文理解ThreadPoolExecutor线程池以及运行时间

    2024-07-19 08:12:03       20 阅读
  9. AccessibilityEvent常用事件

    2024-07-19 08:12:03       19 阅读
  10. vue3封装el-table及实现表头自定义筛选

    2024-07-19 08:12:03       19 阅读