2016-06-21 17 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

お待ちください。お待ちください。お待ちください。お待ちください。 –

+0

私は30分以上待ってプログラムは何もしなかった。 – syy

+2

スレッドダンプを生成してください(たとえば、https://confluence.atlassian.com/adminjiraserver071/generating-a-thread-dump-802593021.htmlを参照)、出力をポストしてください。また、この問題は、ファイル「ロック」のある他のプログラム –

答えて

0

私はなぜプログラムが停止しているのか分からず、バージョン3.9にダウングレードしてコードを稼働させました。 Gagravarrのおかげで、getWorkbook()メソッドとFileInputStreamクラス全体を取り除くことで、メモリの使用量を減らすことができました。これに

変更workbook = getWorkbook()

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

それは適切なXSSFWorkbookまたはHSSFWorkbookを作成します。

出典:私も停止に気づいWorkbookFactory.create(...)

+0

Apache POI 3.14はJava 6でうまく動作するはずです。それを確認するユニットテストとゲンキンマシンがたくさんあります!あなたはそれがそうではないと思いますか? – Gagravarr

+0

私は上記のコードが3.9で正常に機能していたため、3.14とJava 1.6で何か問題があったと思います。私はジーンズが何であるか分かりませんが、私がそれをどのように動作させたかについて私の答えを編集します。私は多くのテストケースとログ出力を試みましたが、3.14で動作させることはできませんでした。 – syy

+0

ほとんどの場合、POIの新しいバージョンがより敏感な、クラスパスに壊れているか古い依存関係があります。 JenkinsはContinuous Integrationサーバーであり、すべての単体テストが実行されています – Gagravarr

1

、私はプログラムがちょうどXSSFWorkbookが初期化されたばかりの行に一時停止を意味します。私は、いくつかのjarファイルがクラスパスにないことを知りました。私の場合は、以下のjarファイルをクラスパスにありませんでした: curvesapi-1.03.jar のXMLBeans-2.6.0.jar

Javaランタイムが例外を見つけていないクラスをスローしなかったこと奇妙です。代わりにJavaランタイムがXSSFWorkbookコンストラクタにぶら下がっていました。

POI分布におけるすべてのjarは、クラスパス POI-3.14-20160307.jar POI-excelant-3.14-20160307.jar POI-OOXML-3.14-20160307.jar POI-OOXML-スキーマに追加されなければなりません POI-スクラッチパッド-3.14-20160307.jar コモンズ・コーデック1.10.jar コモンズ・ログ-1.2.jar -3.14-20160307.jar のjunit-4.12.jar のlog4j-1.2.17.jar curvesapi-1.03 .jar xmlbeans-2.6.0.jar

関連する問題