[alibaba/easyexcel]多线程写不同sheet 报错

2024-05-24 612 views
3

异常代码


String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 指定文件
        ExcelWriter excelWriter = EasyExcel.write(fileName).build();
        CountDownLatch countDownLatch = new CountDownLatch(5);
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
            WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板"+i).head(head()).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            taskExecutor.execute(()->write(countDownLatch,excelWriter, writeSheet));
        }
        /// 千万别忘记finish 会帮忙关闭流
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        excelWriter.finish();

 private void write(CountDownLatch countDownLatch,ExcelWriter excelWriter, WriteSheet writeSheet) {

        List<DemoData> data = data();
        excelWriter.write(data, writeSheet);
        countDownLatch.countDown();
    }
   这里写你的代码

异常提示 请提供完整的异常提示,记住是全部异常! Exception in thread "Async-Service-1" org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11] at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:533) at org.apache.poi.xssf.usermodel.XSSFWorkbook.createSheet(XSSFWorkbook.java:876) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:679) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:90) at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:66) at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:154) at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:131) at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:56) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146) at com.bingkun.weixin.controller.GreetingController.write(GreetingController.java:77) at com.bingkun.weixin.controller.GreetingController.lambda$download$0(GreetingController.java:62) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11] at org.apache.poi.openxml4j.opc.PackagePartCollection.put(PackagePartCollection.java:63) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:896) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:833) at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:513) ... 14 more Exception in thread "Async-Service-2" org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11] at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:533) at org.apache.poi.xssf.usermodel.XSSFWorkbook.createSheet(XSSFWorkbook.java:876) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:679) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:90) at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:66) at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:154) at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:131) at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:56) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146) at com.bingkun.weixin.controller.GreetingController.write(GreetingController.java:77) at com.bingkun.weixin.controller.GreetingController.lambda$download$0(GreetingController.java:62) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11] at org.apache.poi.openxml4j.opc.PackagePartCollection.put(PackagePartCollection.java:63) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:896) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:833) at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:513) ... 14 more Exception in thread "Async-Service-5" org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11] at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:533) at org.apache.poi.xssf.usermodel.XSSFWorkbook.createSheet(XSSFWorkbook.java:876) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:679) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:90) at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:66) at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:154) at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:131) at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:56) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146) at com.bingkun.weixin.controller.GreetingController.write(GreetingController.java:77) at com.bingkun.weixin.controller.GreetingController.lambda$download$0(GreetingController.java:62) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11] at org.apache.poi.openxml4j.opc.PackagePartCollection.put(PackagePartCollection.java:63) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:896) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:833) at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:513) ... 14 more Exception in thread "Async-Service-3" org.apache.poi.openxml4j.exceptions.PartAlreadyExistsException: A part with the name '/xl/worksheets/sheet1.xml' already exists : Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names. [M1.12] at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:869) at org.apache.poi.openxml4j.opc.OPCPackage.createPart(OPCPackage.java:833) at org.apache.poi.POIXMLDocumentPart.createRelationship(POIXMLDocumentPart.java:513) at org.apache.poi.xssf.usermodel.XSSFWorkbook.createSheet(XSSFWorkbook.java:876) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:679) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:90) at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:66) at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:154) at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:131) at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:56) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146) at com.bingkun.weixin.controller.GreetingController.write(GreetingController.java:77) at com.bingkun.weixin.controller.GreetingController.lambda$download$0(GreetingController.java:62) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 建议描述

回答

0

貌似不支持多线程

8

同出现过这个问题。。 代码:

private static void writerSheets(int sheetNo, String sheetName, List data, ExcelWriter excelWriter, CountDownLatch countDownLatch){ try { synchronized (excelWriter){ if (CollectionUtil.isNotEmpty(data)){ String name = sheetName + "-" + sheetNo; // 分页写入 WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, name).build(); excelWriter.write(data, writeSheet); } } } catch (Exception e) { e.printStackTrace(); }finally { countDownLatch.countDown(); } }

在多线程的时候写入的时候会报错:

java.lang.IllegalArgumentException: Attempting to write a row[0] in the range [0,9500] that is already written to disk. at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:131) at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:65) at com.alibaba.excel.util.WorkBookUtil.createRow(WorkBookUtil.java:70) at com.alibaba.excel.context.WriteContextImpl.initHead(WriteContextImpl.java:178) at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:161) at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:131) at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:56) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146) at com.jsq.demo.common.utils.ExcelUtils.writerSheets(ExcelUtils.java:108) at com.jsq.demo.common.utils.ExcelUtils.lambda$writeMultiSheet$0(ExcelUtils.java:76) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

用SXSSFWorkbook进行多线程写入测试的时候是可以的 不用线程的话用起来挺方便的~ 好气哦 ε=(´ο`*)))

6

不支持多线程。