2016-06-21 49 views
1

我正在尝试读取Excel工作簿(.xlsx),但程序刚刚在初始化Workbook时停止。我不确定发生了什么,因为它不会给出任何错误。程序暂停尝试读取Excel工作簿(Apache POI)

当我说暂停时,我的意思是程序只是暂停。它仍在运行,但我觉得它卡住了,不确定。

import java.io.File; 
import java.io.FileInputStream; 

import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class ExcelReader 
{ 
    private String excelFilePath; 
    private FileInputStream inputStream; 
    private Workbook workbook; 
    private Sheet sheet; 

    // Constructors 
    public ExcelReader() { 
     try {   
      // Get path to excel workbook and put in stream 
      excelFilePath = "/home/flow/project/mydata.xlsx"; 
      inputStream = new FileInputStream(new File(excelFilePath)); 

      // Get type of workbook (Excel 2003 or Excel 2007+) 
      workbook = getWorkbook(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // Get type of workbook (Excel 2003 or Excel 2007+) 
    private Workbook getWorkbook() {  
     Workbook work = null; 

     try { 
      if(excelFilePath.endsWith("xlsx")) { 
       System.out.println("In firstIf");    // Prints this 
       work = new XSSFWorkbook(inputStream);   // Gets stuck here 
       System.out.println("After XSSF");    // Never prints this 
      } 
      else if(excelFilePath.endsWith("xls")) { 
       work = new HSSFWorkbook(inputStream); 
      } 
      else 
       throw new IllegalArgumentException("The specified file is not an Excel file"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return work; 
    } 
} 

我在做什么错了?为什么程序不能移动到下一行?

+0

你是否试图等待,如果是的话,你等了多少时间? – 2016-06-21 16:41:04

+0

我等了30多分钟,程序没有做任何事情。 – syy

+2

尝试生成线程转储(例如,请参阅https://confluence.atlassian.com/adminjiraserver071/generating-a-thread-dump-802593021.html)并发布输出。另外请注意,这个问题可能是其他程序“锁定”文件 – 2016-06-21 16:43:44

回答

0

我想不通为什么该程序保持停止,所以我降级到3.9版,并获得代码工作。 感谢Gagravarr,我能够通过摆脱整个getWorkbook()方法和FileInputStream类来减少内存的使用。

变化workbook = getWorkbook()这样:

workbook = WorkbookFactory.create(new File(excelFilePath)); 

它将创建适当的XSSFWorkbookHSSFWorkbook

来源:WorkbookFactory.create(...)

+0

Apache POI 3.14应该可以在Java 6上正常工作,并且有很多单元测试和jenkins机器可以验证这一点!是什么让你觉得它不? – Gagravarr

+0

由于上述代码与3.9一起运行良好,我假设这是错误的,3.14和Java 1.6有问题。我不知道詹金斯是什么,但我会编辑我的答案,以更多地了解我如何使它工作。我尝试了很多测试用例和日志输出,但是无法使用3.14。 – syy

+0

很可能你的类路径中存在破坏或旧的依赖关系,POI的更新版本更加敏感。 Jenkins是一个连续集成服务器,运行所有的单元测试 – Gagravarr

1

我也注意到停顿,我指的是节目只是暂停在哪里XSSFWorkbook是越来越初始化行。我发现在类路径中缺少一些jar文件。在我的情况下,以下罐子不在课程路径中: curvesapi-1.03.jar xmlbeans-2.6.0.jar

奇怪的是,Java运行时并未抛出类未发现的异常。相反,Java运行时挂在XSSFWorkbook构造函数上。

所有兴趣点分布的罐子应该被添加到类路径 POI-3.14-20160307.jar POI-excelant-3.14-20160307.jar POI-OOXML-3.14-20160307.jar POI-OOXML-模式-3.14-20160307.jar POI暂存器-3.14-20160307.jar 公地编解码器1.10.jar 共享记录-1.2.jar 的JUnit 4.12.jar 的log4j-1.2.17.jar curvesapi-1.03 .jar xmlbeans-2.6.0.jar

相关问题