2012-03-08 8 views
10

Estoy trabajando con Spring/Hibernet usando NetBeans 6.9.1. Estoy tratando de leer un archivo de Excel (.xlsx- Office 2007). El código para leer un archivo de Excel es el siguiente usando Vactor para almacenar datos de la hoja de Excel.Error al leer la hoja de Excel usando 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; 
} 

El siguiente es un método en mi Controller que llama al método de arriba para leer el archivo de Excel especificada


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

Al ejecutar este código, se produce la siguiente excepción.

Los datos suministrados parecen estar en Office 2007+ XML. Usted es llamando a la parte de POI que trata con los documentos de Office OLE2. Usted necesidad de llamar a una parte diferente del PDI a procesar estos datos (por ejemplo, en lugar de XSSF HSSF)

Estoy usando una fuente equivocada o algo está mal en el código anterior? ¿Cuál es la solución?

El código está tomado de here.

+0

He descargado otra aplicación 'apache.poi' y he usado el paquete' org.apache.poi.xssf.usermodel. * 'En lugar de usar el paquete' org.apache.poi.hssf.usermodel. * 'Y funcionó para ambos 'xls' y' xlsx'. – Bhavesh

+0

publique esto como la respuesta y acéptelo lo antes posible. – oers

Respuesta

37

Su código tal como está explícitamente solicita HSSF, por lo que solo funcionará con los archivos .xls (binarios) anteriores.

Si lo desea, puede solicitar al PDI que detecte automáticamente qué tipo de archivo tiene, y elija el adecuado de HSSF o XSSF para su caso. Sin embargo, para hacer eso necesita cambiar su código ligeramente, y usar interfaces en lugar de clases concretas (para que su código funcione si obtiene un objeto HSSF o XSSF)

El sitio web de POI tiene un guide to making these changes que debe guiarlo.

A modo de ejemplo, cuando se sigue de esto, sus primeras líneas que fueron:

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

se convertirá en el nuevo 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)); 

Esto luego trabajar tanto para .xls y Archivos .xlsx

+1

Utilicé el mismo enfoque que usted mencionó y funcionó como se esperaba. Gracias. – Bhavesh

+10

Para la completness de la respuesta, WorbookFactory es una parte poi-ooxml.jar – Vishnu

6

También puede reemplazar HSSF por XSSF.

Asegúrese de agregar el poi-ooxml .jar además del poi .jar. poi-ooxml proporciona soporte para XSSF. Asegúrese de que también haya agregado las dependencias dadas tal como figuran en el Apache POI components page.

+0

Eso es lo que he estado haciendo desde que llegué a saber. Gracias por el relevo sin embargo. PD No puedo visitar este sitio con bastante frecuencia debido al horario agitado. – Bhavesh

Cuestiones relacionadas