2012-12-13 23 views
0

我有一些Java代码读取Excel数据。在运行Java代码时,它显示以下错误。帮助我解决这个问题。另外,我需要知道其他读取.xlsx文件的方法。问题而阅读Excel文件(Java代码)

(小编辑)我怎么能打印出他们各自的列行。例如:

Age 
19 
20 
21 

Salary 
35k 
20k 
40k 
. 
. 
. 

Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) at org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:131) at org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:104) at org.apache.poi.poifs.filesystem.POIFSFileSystem.(POIFSFileSystem.java:138) at org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:322) at org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:303) at ExcelRead.main(ExcelRead.java:18)

的Java代码如下:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Iterator; 

import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 


public class ExcelRead { 
    public static void main(String[] args) { 

    try { 
     FileInputStream file = new FileInputStream(new File("C:/Users/vinayakp/Desktop/Book.xlsx")); 
     HSSFWorkbook workbook = new HSSFWorkbook(file); 
     HSSFSheet sheet = workbook.getSheetAt(0); 
     Iterator<Row> rowIterator = sheet.iterator(); 
     while(rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 
      Iterator<Cell> cellIterator = row.cellIterator(); 
      while(cellIterator.hasNext()) { 
       Cell cell = cellIterator.next(); 
       switch(cell.getCellType()) { 
        case Cell.CELL_TYPE_BOOLEAN: 
         System.out.print(cell.getBooleanCellValue() + "\t\t"); 
         break; 
        case Cell.CELL_TYPE_NUMERIC: 
         System.out.print(cell.getNumericCellValue() + "\t\t"); 
         break; 
        case Cell.CELL_TYPE_STRING: 
         System.out.print(cell.getStringCellValue() + "\t\t"); 
         break; 
       } 
      } 
      System.out.println(""); 
     } 
     file.close();  
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException ae) { 
     ae.printStackTrace(); 
    } 
} 
} 

回答

1

您使用了错误的类文件进行读取HSSFWorkbook是老Excel格式。使用XSSFWorkbook代替

编辑:从http://www.coderanch.com/t/463779/java/java/read-xlsx-sheet-Client-Side复制 。 你做同样的事情吗?

try { 
System.out.println("destDir==> "+destDir); 
XSSFWorkbook workBook = new XSSFWorkbook(destDir); 
XSSFSheet sheet = workBook.getSheetAt(0); 
totalRows = sheet.getPhysicalNumberOfRows(); 
System.out.println("total no of rows >>>>"+totalRows); 

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

编辑2: 了解从这个link

+0

我试图与然而它给我同样的错误。 –

+0

删除导入HSSFWorkbook,然后导入XSSFWorkbook –

+0

@MohammodHossain后,我得到了下面的错误_Exception在线程“主”java.lang.NoClassDefFoundError:org/apache/xmlbeans/XmlObject \t在ExcelRead.main(ExcelRead.java:20) _ –

3

的Apache POI删除previus导入类后,再加入

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 


private static void read(String path){ 
    Workbook workbook = null; 
    FileInputStream fis = null;   
    try { 
     File source = new File(path); 
     if(source.exists()){ 
     fis = new FileInputStream(source); 
     workbook = WorkbookFactory.create(source); 

     }else{ 
       JOptionPane.showMessageDialog(null, "File path is not exist.", "Error", JOptionPane.ERROR_MESSAGE); 
     }  

     Sheet sheet = null;   
     int lastRowNum = 0; 
     int numSheets = workbook.getNumberOfSheets();   
     for(int i = 0; i < numSheets; i++) {    
      sheet = workbook.getSheetAt(i); 
      if(sheet.getPhysicalNumberOfRows() > 0) {      
       lastRowNum = sheet.getLastRowNum();     
       int lastCellNum = 0;    
       for(Row row : sheet) {     
        Employee emp = new Employee();   

        int numOfCell = row.getPhysicalNumberOfCells(); 
        System.out.println("numOfCell:: "+numOfCell); 
        String stringValues [] = new String[numOfCell]; 
        for(Cell cell : row) { 
         // cell = row.getCell(cellIndex);       
         int cellIndex = cell.getColumnIndex();      
         logger.info("cellIndex:: "+ cellIndex); 
         switch (cell.getCellType()) { 

         case Cell.CELL_TYPE_FORMULA: 
          // printValue = "FORMULA value=" + cell.getCellFormula(); 
          stringValues[cellIndex] = cell.getCellFormula(); 
          break; 

         case Cell.CELL_TYPE_NUMERIC: 
          //printValue = "NUMERIC value=" + cell.getNumericCellValue(); 
          System.out.println("Value is numeric:: "+ cell.getNumericCellValue()); 
          stringValues[cellIndex] = String.valueOf(cell.getNumericCellValue()); 
          break; 

         case Cell.CELL_TYPE_STRING: 
          // printValue = "STRING value=" + cell.getStringCellValue(); 
          stringValues[cellIndex] = cell.getStringCellValue(); 
          break; 

         case Cell.CELL_TYPE_BLANK: 
          // printValue = "STRING value=" + cell.getStringCellValue(); 
          stringValues[cellIndex] = cell.getStringCellValue(); 
          break; 

         default: 
         } 


        }   

        } 


       } 
      }    
     }  

     } catch (InvalidFormatException e) { 
      logger.error(e.getMessage()); 
      e.printStackTrace(); 
     } catch (FileNotFoundException e) {   
      e.printStackTrace(); 
      logger.error(e.getMessage()); 
     } catch (IOException e) { 
      logger.error(e.getMessage()); 
      e.printStackTrace(); 
     } 
     catch (Exception e) { 
      logger.error(e.getMessage()); 
      e.printStackTrace(); 
     } 
     finally { 
      if (fis != null) { 
       try { 
        fis.close(); 
        fis = null; 
        } catch (IOException ioEx) { 
         logger.error(ioEx.getMessage()); 
       } 
      } 
     }  
    } 
+0

得到这个:_Exception在线程“主”java .lang.NoClassDefFoundError:组织/阿帕奇/ XMLBeans的你加入该库在ExcelRead.main(ExcelRead.java:17)_ –

+0

/XmlObject中 \t? –

+2

在你的类路径中添加xmlbeans-2.3.0.jar –

2

如果你想读一个.xls文件时,必须使用HSSF (只支持.xls格式),但.xlsx文件,你必须使用XSSF或ANOT她的更高版本的API。

+1

耶知道这一事实。无论如何谢谢:)我得到了答案,代码工作正常。 xml lib丢失 –

+0

哪个xml lib是这个Vinayak? – Reena