有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JVM在写入XLSX文件(POI)时崩溃

JVM在尝试写入时崩溃。xlsx文件。我正在使用POI(XSSF)进行同样的操作。 代码中的错误位置点是writemethod--> workBook.write(fileOutputStream);

在控制台上我得到

A fatal error has been detected by the Java Runtime Environment:
  SIGBUS (0x7) at pc=0xb68d77f3, pid=14653, tid=1849355120
  JRE version: 7.0_04-b20
 Java VM: Java HotSpot(TM) Server VM (23.0-b21 mixed mode linux-x86 )
 Problematic frame:
 C  [libzip.so+0x47f3]  newEntry+0x73
 Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
 If you would like to submit a bug report, please visit:
   http://bugreport.sun.com/bugreport/crash.jsp
 The crash happened outside the Java Virtual Machine in native code.
 See problematic frame for where to report the bug.

共 (3) 个答案

  1. # 1 楼答案

    我已经找到了解决这个问题的方法,并且我已经寻找了一段时间,就是确保你不会用File打开你的Workbook,你用它来打开FileOutputStream来保存Workbook。相反,使用FileInputStream打开Workbook

    像这样的东西可以完美地工作

            File inputFile = new File("Your-Path");
            this.inputStream = new FileInputStream(inputFile);
            this.opc = OPCPackage.open(this.inputStream);
            this.workbook = WorkbookFactory.create(opc);
    
    ...
    
            this.outputStream = new FileOutputStream(inputFile);
            this.workbook.write(this.outputStream);
    

    不要忘记关闭每个打开的流和OPCPackage

  2. # 2 楼答案

    其他的解决方案都不适合我。我只需要对Excel文件进行只读访问,设置只读标志对我很有效:

    Workbook wb = new XSSFWorkbook(OPCPackage.open(file, PackageAccess.READ));
    Workbook wb = new HSSFWorkbook(new POIFSFileSystem(file, true));
    
  3. # 3 楼答案

    使用OPCPackage并没有为我修复JVM崩溃,但使用WorkbookFactory修复了。如果您查看POI Busy Developers Guide,它们提供了读取和写入同一Excel文件的示例

    File excelFile = new File("workbook.xlsx");
    
    InputStream inp = new FileInputStream(excelFile);
    Workbook wb = WorkbookFactory.create(inp);
    
    FileOutputStream fileOut = new FileOutputStream(excelFile);
    wb.write(fileOut);
    fileOut.close();
    

    使用ApachePOI版本3.13、Java1.8