问题:EasyExcel 填充了 List 数据且加上了二维码图片,但是发现生成的 Excel 文件模板中后面部分数据消失,PDF文档是正常的。
模板文件:
生成的Excel文件:
Excel文件转成的PDF文件:
发现Excel文件中的【代客裝貨】等内容消失。
解决问题:将模板 xxx.xlsx 另存为 xxx.xls
附上代码:
//主方法中
//templatePath 文件路径
//map 模板标题、模板表格标题
//fileName 最后生成的Excel(包含具体路径和文件名称)
//pngContent 生成二维码中的内容
//list
ListUtil.export(templatePath, map,fileName, pngContent,list);
//最后生成的PDF(包含具体路径+文件名称)
String desFilePath = templatePath + File.separator + nowStr +".pdf";
//Excel 转 PDF
ExcelToPDF.excel2pdf(fileName, desFilePath);
//清除map数据
map.clear();
public class ListUtil {
public static String export(String templatePath, Map<String, Object> map, String fileName, String pngContent, List<String> list) throws IOException {
//模板文件,必须是 xxx.xls
String filePath = templatePath + "template11.xls";
//生成Excel
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(filePath).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
//forceNewRow设置为true,按照list的长度自动添加Excel行数;默认false
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
//填充list数据
excelWriter.fill(list, fillConfig, writeSheet);
//填充map数据
excelWriter.fill(map, writeSheet);
excelWriter.finish();
//修改行高,除了标题和表头,list行数的行高设置相同
Workbook workbook = new HSSFWorkbook(new FileInputStream(fileName));
//设置sheet的名称
Sheet sheet = workbook.getSheet("document");
for (int i = 3; i < 3 + list.size(); i++) {
Row row = sheet.getRow(i);
row.setHeight((short) 540);
}
FileOutputStream outputStream = new FileOutputStream(fileName);
workbook.write(outputStream);
workbook.close();
//添加二维码图片到Excel中
addBarCode(pngContent,fileName,list.size());
return fileName;
}
//data 二维码内容
//fileName 最后生成Excel
//objSize list长度
public static void addBarCode(String data, String fileName,int objSize) {
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
try {
//生成二维码
QRCodeUtils.encode(data, byteArrayOut);
} catch (Exception e) {
e.printStackTrace();
}
FileOutputStream fileOut = null;
//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
try {
Workbook workbook = new HSSFWorkbook(new FileInputStream(fileName));
//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
Sheet sheet1 = workbook.getSheetAt(0);
Drawing drawing = sheet1.createDrawingPatriarch();
//调整图片定位
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 5, objSize + 7, (short) 6,objSize + 10);
drawing.createPicture(anchor,workbook.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
fileOut = new FileOutputStream(fileName);
// 写入excel文件
workbook.write(fileOut);
System.out.println("----Excel文件已生成------");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (byteArrayOut != null) {
try {
byteArrayOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
这样最后的数据就是正常的。