1.单层map设置值是{属性},那使用两层map进行设置值,是不是可以使用{属性.属性},以为取出map里字段只用{属性}就可以设置值,那再加个.就可以从里边map取出对应属性,没有两层map写法
填充得到的文件打开报错 was empty (zero bytes long)
Map<String, Map<String, String>> map = new HashMap<>();
Map<String, String> map1 = new HashMap<>();
map1.put("name", "张三");
map1.put("age", "18");
HashMap<String, String> map2 = new HashMap<>();
map2.put("name", "李四");
map2.put("age", "19");
map.put("obj1", map1);
map.put("obj2", map2);
ExcelWriter excelWriter = EasyExcel.write(EXCEL_OUPUT_FILE_PATH)
.withTemplate(TEMPLATE_FILE_PATH).build(); // 构建ExcelWriter对象 整个文件对象
WriteSheet sheet1 = EasyExcel.writerSheet("Sheet1").build(); // 构建sheet对象
excelWriter.fill(map, sheet1); //将操作的sheet和数据填充到ExcelWriter对象中
2.尝试使用map包对象写法,想着反正是.,那里面是对象就可以使用了吧,填充后文件还是报文件 was empty (zero bytes long)
public static final String EXCEL_OUPUT_FILE_PATH = "templateOutput/template1Output.xlsx";
public static final String TEMPLATE_FILE_PATH = "excelTemplate/template1.xlsx";
static class Person {
public String name;
public String age;
}
public static void main(String[] args) {
Map<String, Person> map = new HashMap<>();
Map<String, String> map1 = new HashMap<>();
Person person = new Person();
person.name = "张三";
person.age = "18";
map1.put("name", "张三");
map1.put("age", "18");
HashMap<String, String> map2 = new HashMap<>();
Person person1 = new Person();
person1.name = "李四";
person1.age = "19";
map2.put("name", "李四");
map2.put("age", "19");
map.put("obj1", person);
map.put("obj2", person1);
ExcelWriter excelWriter = EasyExcel.write(EXCEL_OUPUT_FILE_PATH)
.withTemplate(TEMPLATE_FILE_PATH).build(); // 构建ExcelWriter对象 整个文件对象
WriteSheet sheet1 = EasyExcel.writerSheet("Sheet1").build(); // 构建sheet对象
excelWriter.fill(map, sheet1); //将操作的sheet和数据填充到ExcelWriter对象中
}
3.使用创建EasyWriter和WriteSheet对象,直接使用
EasyExcel.write(filePath).withTemplate(excelTemplate).sheet(0).doFill(excelDataMap);
EasyExcel.write(filePath).withTemplate(excelTemplate).sheet(1).doFill(excelDataMap);
对两个sheet进行填充,只有最后一个sheet设置了值。
应该创建EasyWriter和WriterSheet对象进行设置值
正确写法:
Map<String, String> excelDataMap = new HashMap();
ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(asInputStream).build();
WriteSheet sheet1 = EasyExcel.writerSheet(0).build();
WriteSheet sheet2 = EasyExcel.writerSheet(0).build();
excelWriter.fill(sheet1, excelDataMap);
excelWriter.fill(sheet2, excelDataMap);
excelWriter.finish();
4.使用,没有告诉excelwriter对象,结束导入,导致生成的excel文件打不开,报was empty (zero bytes long)。应该在写入完成后调用
excelWriter.finish();
完整用法:
Map<String, String> excelDataMap = new HashMap();
ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(asInputStream).build();
WriteSheet sheet1 = EasyExcel.writerSheet(0).build();
WriteSheet sheet2 = EasyExcel.writerSheet(0).build();
excelWriter.fill(sheet1, excelDataMap);
excelWriter.fill(sheet2, excelDataMap);
excelWriter.finish();
5.由于我需要将模版文件的某些sheet复制多个形成新的模版,但又不想多产生一个模版文件,我将输出文件和文件和模版文件都设置成一个
ExcelWriter excelWriter = EasyExcel.write(TEMPLATE_FILE_PATH).withTemplate(TEMPLATE_FILE_PATH)
.build();
报错Exception in thread "main" com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure
at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:98)
at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36)
at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:36)
at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:114)
at org.example.demotask.util.EasyexcelUtils.main(EasyexcelUtils.java:60)
Caused by: org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)
复制模版里的sheet形成新的模版赋值导出写法:
Map<String, String> map = new HashMap();
Map<String, Map<String, String>> lotMap = new HashMap();
//获取的模板文件位置
String excelTemplate = "path";
FileInputStream fileInputStream = new FileInputStream(excelTemplate);
InputStream templateStream = fileInputStream;
Workbook workbook = WorkbookFactory.create(templateStream);
List<String> fatherSheet = Lists.newArrayList("Sheet1");
ArrayList<String> lotNames = new ArrayList<>(lotMap.keySet());
//复制sheet
for (String cloneSheet : fatherSheet) {
for (String lotName : lotNames) {
//根据要复制的sheet名拿到要复制的sheet
Sheet templateSheet = workbook.getSheet(cloneSheet);
Sheet newSheet = workbook.cloneSheet(workbook.getSheetIndex(templateSheet));
int newSheetIndex = workbook.getSheetIndex(newSheet); // 获取新克隆的 sheet 索引
//设置复制的sheet名
workbook.setSheetName(newSheetIndex, cloneSheet + "(" + lotName + ")");
}
}
//新建内存输出流,作为新的模版文件输出
ByteArrayOutputStream ops = new ByteArrayOutputStream();
workbook.write(ops);
ops.flush();
byte[] byteArray = ops.toByteArray();
ops.close();
workbook.close();
//使用新的文件的字节流作为模板文件输入
InputStream asInputStream = new ByteArrayInputStream(byteArray);
// 原文件流后续已不使用,此处关闭
templateStream.close();
ops.close();
ExcelWriter excelWriter = EasyExcel.write("D:\\newnewnewFormat111.xlsx").withTemplate(asInputStream).build();
WriteSheet mainSheet = EasyExcel.writerSheet("Sheet1").build();
excelWriter.fill(map, mainSheet);
for (String lotName : lotNames) {
WriteSheet sheet = EasyExcel.writerSheet("Sheet1(" + lotName + ")").build();
excelWriter.fill(lotMap.get(lotName), sheet);
}
//重要 使用excelWriter写入完一定要调用finish方法,不然文件打不开
excelWriter.finish();
总结:
1.使用Map类型进行填充只有能普通类型
2.模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
3. {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list
WriteSheet writeSheet = EasyExcel.writerSheet().build();
List<String> list1 = new ArrayList<>();
list1.add("张三");
list1.add("李四");
ArrayList<String> list2 = new ArrayList<>();
list2.add("11");
list2.add("22");
//设置列表展开方向,默认垂直
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
excelWriter.fill(new FillWrapper("data1", list1), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data2", list1), writeSheet);
4.使用ExcelWriter进行sheet写入时完成时,最好调用ExcelWriter对象的finish()方法,不然可能出现文件损坏的情况
5.模版文件路径不要跟输出文件路径,如果不想输出临时的模版文件,可以将产生新的写入内存流,然后将内存流的字节数据写入字节输入流作为模板输入
String excelTemplate = "path";
FileInputStream fileInputStream = new FileInputStream(excelTemplate);
InputStream templateStream = fileInputStream;
Workbook workbook = WorkbookFactory.create(templateStream);
List<String> fatherSheet = Lists.newArrayList("Sheet1");
ArrayList<String> lotNames = new ArrayList<>(lotMap.keySet());
//复制sheet
for (String cloneSheet : fatherSheet) {
for (String lotName : lotNames) {
//根据要复制的sheet名拿到要复制的sheet
Sheet templateSheet = workbook.getSheet(cloneSheet);
Sheet newSheet = workbook.cloneSheet(workbook.getSheetIndex(templateSheet));
int newSheetIndex = workbook.getSheetIndex(newSheet); // 获取新克隆的 sheet 索引
//设置复制的sheet名
workbook.setSheetName(newSheetIndex, cloneSheet + "(" + lotName + ")");
}
}
//新建内存输出流,作为新的模版文件输出
ByteArrayOutputStream ops = new ByteArrayOutputStream();
workbook.write(ops);
ops.flush();
byte[] byteArray = ops.toByteArray();
ops.close();
workbook.close();
//使用新的文件的字节流作为模板文件输入
InputStream asInputStream = new ByteArrayInputStream(byteArray);
// 原文件流后续已不使用,此处关闭
templateStream.close();
ops.close();
ExcelWriter excelWriter = EasyExcel.write("D:\\newnewnewFormat111.xlsx").withTemplate(asInputStream).build();
6.使用EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);进行填充会出现只有最后一个sheet填充成功,如果想对多个sheet进行填充,要使用ExcelWriter对象操作数据和sheet对象。