根据模板中第一个Sheet的样式生成多个Sheet,每个sheet中的样式与模板第一个sheet中的样式一样
目前easyexcel不能根据模板动态生成sheet,模板固定的几个sheet就只能填充那几个sheet,当代码里指定了模板中不存在的sheet就会报空指针.。
遇到这种情况一般只能通过代码动态生成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();
}
}
效果
模板如下:
导出如下: