2016-06-21 6 views
1

Ich versuche, eine Excel-Arbeitsmappe (.xlsx) zu lesen, aber das Programm hält nur an, wenn ein Workbook initialisiert wird. Ich bin mir nicht sicher, was passiert, da es keine Fehler gibt.Programm hält an, Excel-Arbeitsmappe (Apache POI) zu lesen

Wenn ich halt sage, ich meine das Programm pausiert nur. Es läuft immer noch, aber ich habe das Gefühl, dass es festsitzt, nicht sicher.

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; 
    } 
} 

Was mache ich falsch? Warum geht das Programm nicht immer zur nächsten Zeile?

+0

Dis Sie versuchen zu warten, wenn ja, wie viel Zeit haben Sie gewartet? –

+0

Ich wartete über 30 Minuten und Programm tat nichts anderes. – syy

+2

Versuchen Sie, einen Thread-Dump zu generieren (siehe https://confluence.atlassian.com/adminjiraserver071/generating-a-thread-dump-802593021.html zum Beispiel) und veröffentlichen Sie die Ausgabe. Beachten Sie auch, dass das Problem möglicherweise ein anderes Programm ist, das die Datei –

Antwort

0

Ich konnte nicht herausfinden, warum das Programm gestoppt wurde, also habe ich auf Version 3.9 heruntergestuft und bekam den Code zu arbeiten. Dank Gagravarr konnte ich die Speicherauslastung reduzieren, indem ich die gesamte getWorkbook() Methode und die FileInputStream Klasse löschte.

ändern workbook = getWorkbook() dazu:

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

Es wird die entsprechende XSSFWorkbook oder HSSFWorkbook erstellen.

Quelle: WorkbookFactory.create(...)

+0

Apache POI 3.14 sollte auf Java 6 gut funktionieren, und es gibt viele Unit-Tests und Jenkins-Maschinen, die das bestätigen! Was lässt dich denken, dass es nicht so ist? – Gagravarr

+0

Ich nahm an, da der obige Code mit 3.9 gut funktionierte, war etwas falsch mit 3.14 und Java 1.6. Ich habe keine Ahnung, was Jenkins ist, aber ich werde meine Antwort bearbeiten, um mehr darüber zu machen, wie ich es geschafft habe. Ich habe viele Testfälle ausprobiert und Ausgaben protokolliert, konnte aber nicht mit 3.14 arbeiten. – syy

+0

Höchstwahrscheinlich haben Sie eine unterbrochene oder alte Abhängigkeit von Ihrem Klassenpfad, auf den neuere POI-Versionen empfindlicher reagieren. Jenkins ist ein Continuous Integration Server, der alle Komponententests ausführt – Gagravarr

1

ich auch halt gemerkt, ich meine das Programm pausiert nur auf der Linie, wo XSSFWorkbook initialisiert zu werden. Ich habe herausgefunden, dass ein paar JAR-Dateien im Klassenpfad fehlen. In meinem Fall waren die folgenden Gläser nicht im Klassenpfad: curvesapi-1.03.jar XMLBeans-2.6.0.jar

Es ist seltsam, dass Java Zeit laufen nicht werfen Klasse nicht Ausnahme gefunden. Stattdessen hing die Java-Laufzeit im XSSFWorkbook-Konstruktor.

alle Gläser in POI Verteilung sollten poi-3.14-20160307.jar poi-excelant-3.14-20160307.jar poi-OOXML-3.14-20160307.jar poi-OOXML-Schema Klassenpfad hinzugefügt werden -3.14-20160307.jar poi-Scratchpad-3.14-20160307.jar commons-codec-1.10.jar commons-logging-1.2.jar junit-4.12.jar log4j-1.2.17.jar curvesapi-1.03 .jar xmlbeans-2.6.0.jar