EasyExcel 填充List数据并且添加二维码图片

问题: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();
                }
            }
        }
    }
}

这样最后的数据就是正常的。

 

好的,你可以使用EasyExcel的write方法进行填充数据。如果数据量很大,可以考虑分批次填充数据,这样可以减少内存占用和提高程序性能。具体的实现方式可以参考以下步骤: 1. 定义一个ExcelWriter对象,用于创建Excel文件并写入数据。 2. 定义一个List集合,将需要填充数据分批次添加到该集合中。 3. 定义一个for循环,遍历List集合,每次遍历时将集合中的数据写入Excel中。 4. 在每次写入数据之后,清空List集合,释放内存。 下面是一个示例代码,以写入10000条数据为例: ```java // 定义ExcelWriter对象 ExcelWriter writer = EasyExcel.write(filePath).build(); // 定义List集合 List<DataDTO> dataList = new ArrayList<>(); // 模拟生成10000条数据 for (int i = 0; i < 10000; i++) { DataDTO data = new DataDTO(); data.setName("name" + i); data.setAge(i); dataList.add(data); } // 定义分批次写入数据的数量 int batchSize = 1000; // 定义写入数据的次数 int writeTimes = dataList.size() % batchSize == 0 ? dataList.size() / batchSize : dataList.size() / batchSize + 1; // 分批次写入数据 for (int i = 0; i < writeTimes; i++) { int startIndex = i * batchSize; int endIndex = (i + 1) * batchSize; endIndex = endIndex > dataList.size() ? dataList.size() : endIndex; List<DataDTO> subList = dataList.subList(startIndex, endIndex); // 写入数据Excel writer.write(subList, EasyExcel.writerSheet(0, "Sheet1").head(DataDTO.class).build()); // 清空List集合 subList.clear(); } // 关闭ExcelWriter对象 writer.finish(); ``` 在上述代码中,我们将需要填充数据存储在一个List集合中,然后使用for循环进行分批次写入数据。每次写入数据之后,使用subList.clear()方法清空List集合,释放内存。这样就可以实现分批次填充数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值