easyexcel一个模板动态多个sheet填充

根据模板中第一个Sheet的样式生成多个Sheet,每个sheet中的样式与模板第一个sheet中的样式一样

目前easyexcel不能根据模板动态生成sheet,模板固定的几个sheet就只能填充那几个sheet,当代码里指定了模板中不存在的sheet就会报空指针.。easyexcel一个模板动态多个sheet填充_第1张图片
遇到这种情况一般只能通过代码动态生成excel文件,而且样式什么的都需要通过代码来设定,这也是比较麻烦的,所以想要通过模板动态导出多个sheet,可以先利用poi克隆出多个sheet的模板写到流里然后再进行填充。

引入jar包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.10</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

代码实例:


    public void fillTemplate() {
        //excel模板
        String templateFileName = "D:\\home\\list.xlsx";
        File file = new File(templateFileName);
        try (FileInputStream fileInputStream = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            //填充到sheet的数据
            List list1 = new ArrayList<Object>();
            for (int i = 0; i < 10; i++) {
                Map map = new HashMap<Object, Object>();
                map.put("name", "小明" + i);
                map.put("score", 90 + i);
                list1.add(map);
            }
            int sheetNum = 2;
            //原模板只有一个sheet,通过poi复制出需要的sheet个数的模板
            XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
            //设置模板的第一个sheet的名称
            workbook.setSheetName(0, "sheet1");
            for (int i = 1; i < sheetNum; i++) {
                //复制模板,得到第i个sheet
                int num = i + 1;
                workbook.cloneSheet(0, "sheet" + num);
            }
            //写到流里
            workbook.write(bos);
            byte[] bArray = bos.toByteArray();
            InputStream is = new ByteArrayInputStream(bArray);
            //输出文件路径
            String fileName = "D:\\home\\" + System.currentTimeMillis() + ".xlsx";
            ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(is).build();
            for (int i = 0; i < sheetNum; i++) {
                int num = i + 1;
                WriteSheet writeSheet = EasyExcel.writerSheet("sheet" + num).build();
                excelWriter.fill(list1, writeSheet);
            }
            // 关闭流
            excelWriter.finish();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果
模板如下:
easyexcel一个模板动态多个sheet填充_第2张图片
导出如下:
easyexcel一个模板动态多个sheet填充_第3张图片
easyexcel一个模板动态多个sheet填充_第4张图片

你可能感兴趣的:(poi,excel,java)