0

I have some Java code which reads the Excel data. On running the Java code, it's showing the following error. Help me resolve the same. Also, I need to know other method of reading .xlsx file.

(A small edit) how I can print rows with their respective columns. For example:

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)

The Java code is as follows:

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

3 Answers 3

3

If you want to read a .xls file you must use HSSF (it supports only .xls format) but for .xlsx files you must use XSSF or another higher version API.

Sign up to request clarification or add additional context in comments.

2 Comments

yeah know that fact. anyway thanks :) i got the ans, code is working fine. xml lib was missing
Which xml lib is this Vinayak?
3

After deleting previous imports class then try to add

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

3 Comments

getting this : Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject at ExcelRead.main(ExcelRead.java:17)
which libraries have you added?
add xmlbeans-2.3.0.jar in your class path
1

you are using the wrong class for reading the file HSSFWorkbook is for old excel format. use XSSFWorkbook instead

Edited: copied from http://www.coderanch.com/t/463779/java/java/read-xlsx-sheet-Client-Side. did u do the same thing?

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

Edit 2: Learn about apache POI from this link

5 Comments

remove import HSSFWorkbook then import XSSFWorkbook
@MohammodHossain after doing it i get the follwing error Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject at ExcelRead.main(ExcelRead.java:20)
@Vinayak check both links provided in edit to learn apache poi
Yeah you can say, my aim is to do the same
missed ooxml jar...code is working now..thank you @NaveenBabu

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.