2012-03-08 13 views
10

Sto lavorando con Spring/Hibernet utilizzando NetBeans 6.9.1. Sto cercando di leggere un file Excel (.xlsx-Office 2007). Il codice per leggere un file Excel è il seguente utilizzando Vactor per memorizzare i dati dal foglio Excel.Errore durante la lettura del foglio Excel utilizzando Java

import java.io.FileInputStream; 
import java.util.Iterator; 
import java.util.Vector; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import model.NewHibernateUtil; 
import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 
import org.hibernate.Session; 
import org.springframework.validation.BindException; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.SimpleFormController; 

private Vector importExcelSheet(ModelAndView mv) 
{ 
    Vector cellVectorHolder = new Vector(); 
    try 
    {   
     HSSFWorkbook myWorkBook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream("E:/Project/SpringHibernet/MultiplexTicketBookingNew/web/excelSheets/Country.xlsx"))); 
     HSSFSheet mySheet = myWorkBook.getSheetAt(0); 
     Iterator rowIter = mySheet.rowIterator(); 
     System.out.println(mySheet.getRow(1).getCell(0)); 
     while(rowIter.hasNext()) 
     { 
      HSSFRow myRow = (HSSFRow) rowIter.next(); 
      Iterator cellIter = myRow.cellIterator(); 
      Vector cellStoreVector=new Vector(); 
      while(cellIter.hasNext()) 
      { 
       HSSFCell myCell = (HSSFCell) cellIter.next(); 
       cellStoreVector.addElement(myCell); 
      } 
      cellVectorHolder.addElement(cellStoreVector); 
     } 
    } 
    catch (Exception e) 
    { 
     mv.addObject("msg", e.getMessage()); 
    } 
    return cellVectorHolder; 
} 

Il seguente è un metodo nel mio Controller che chiama il metodo di cui sopra per leggere il file Excel specificato


@Override 
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception 
{ 
    ModelAndView mv=new ModelAndView(); 

    try 
    { 
     if(request.getParameter("import")!=null) 
     { 
      session=NewHibernateUtil.getSessionFactory().getCurrentSession(); 
      session.beginTransaction(); 

      Vector dataHolder=importExcelSheet(mv); 
      for (int i=0;i<dataHolder.size(); i++) 
      { 
       Vector cellStoreVector=(Vector)dataHolder.elementAt(i); 
       for (int j=0; j < cellStoreVector.size();j++) 
       { 
        HSSFCell myCell = (HSSFCell)cellStoreVector.elementAt(j); 
        String st = myCell.toString(); 
        System.out.println(st.substring(0,1)+"\t"); 
       } 
       System.out.println(); 
      } 

      session.flush(); 
      session.getTransaction().commit(); 
     } 
    } 
    catch (Exception e) 
    { 
     mv.addObject("msg", e.getMessage()); 
    } 
    return mv; 
} 

In esecuzione di tale codice, il seguente viene generata un'eccezione.

I dati forniti sembrano essere nell'XML di Office 2007+. Sei chiamando la parte del PDI che gestisce i documenti di Office OLE2. Si bisogno di chiamare una parte diversa del POI a trattare tali dati (ad es XSSF invece di HSSF)

Sto usando una fonte sbagliata o qualcosa è sbagliato con il codice di cui sopra? Qual'è la soluzione?

Il codice è preso da here.

+0

Ho scaricato un altro apache.poi' api e ho usato il pacchetto 'org.apache.poi.xssf.usermodel. *' Invece di usare il pacchetto 'org.apache.poi.hssf.usermodel. *' E ha funzionato per entrambi 'xls' e' xlsx'. – Bhavesh

+0

per favore posta questo come risposta e accettalo, al più presto possibile. – oers

risposta

37

Il tuo codice così com'è richiede esplicitamente HSSF, quindi funzionerà solo con i vecchi file .xls (binari).

Se lo si desidera, è possibile chiedere al POI di rilevare automaticamente il tipo di file in uso e scegliere quello appropriato di HSSF o XSSF per il proprio caso. Tuttavia, per fare ciò è necessario modificare leggermente il codice e utilizzare le interfacce anziché le classi concrete (in modo che il codice funzioni se si ottiene un oggetto HSSF o XSSF)

Il sito Web PDI ha uno guide to making these changes che dovrebbe guidarvi.

Per fare un esempio, quando si segue questo, le prime linee che sono state:

HSSFWorkbook myWorkBook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream("E:/Project/SpringHibernet/MultiplexTicketBookingNew/web/excelSheets/Country.xlsx"))); 
    HSSFSheet mySheet = myWorkBook.getSheetAt(0); 
    Iterator rowIter = mySheet.rowIterator(); 
    System.out.println(mySheet.getRow(1).getCell(0)); 

diventerà nel nuovo sistema:

Workbook wb = WorkbookFactory.create(new File("/path/to/your/excel/file")); 
    Sheet mySheet = wb.getSheetAt(0); 
    Iterator<Row> rowIter = mySheet.rowIterator(); 
    System.out.println(mySheet.getRow(1).getCell(0)); 

Questo sarà quindi funzionare sia per .xls e File .xlsx

+1

Ho usato lo stesso approccio che hai menzionato e ha funzionato come previsto. Grazie. – Bhavesh

+10

Per la completezza della risposta WorbookFactory è una parte poi-ooxml.jar – Vishnu

6

Si può anche solo sostituire HSSF con XSSF.

Assicurarsi di aggiungere il POI-OXML .jar oltre al PDV. poi-ooxml fornisce supporto per XSSF. Assicurati di aver aggiunto le dipendenze specificate come elencato su Apache POI components page.

+0

Questo è quello che ho fatto da quando sono venuto a sapere. Grazie per il relè però. Post scriptum Non posso visitare questo sito abbastanza spesso a causa del programma frenetico. – Bhavesh

Problemi correlati