com.venky.poi.BeanReader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of core Show documentation
Show all versions of core Show documentation
Commonly used programming tasks in java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.venky.poi;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
/**
*
* @author venky
*/
public class BeanReader extends BeanIntrospector{
private Sheet sheet;
private Iterator rowIterator;
private String[] heading;
public BeanReader(Workbook book, String sheetName, Class beanClass) throws InstantiationException, IllegalAccessException{
this(book.getSheet(sheetName),beanClass);
}
public BeanReader(Workbook book, int sheetIndex,Class beanClass) throws InstantiationException, IllegalAccessException{
this(book.getSheetAt(sheetIndex),beanClass);
}
public BeanReader(Sheet beanSheet,Class beanClass) throws InstantiationException, IllegalAccessException{
super(beanClass);
this.sheet = beanSheet;
this.rowIterator = sheet.iterator();
Row header = getNextRow();
if (header != null){
heading = new String[header.getLastCellNum()]; // as cell indexes start at zero,LastCellNum can be seen as Size of row
for (int i = 0 ; i < heading.length ; i ++ ){
heading[i] = header.getCell(i).getStringCellValue();
}
}
}
public B getNextRecord(){
B b = null;
Row row = getNextRow();
if (row != null){
b = createInstance();
fillBeanValues(b, row);
}
return b;
}
public CellStyle getHeaderStyle(){
return sheet.getRow(0).getCell(0).getCellStyle();
}
public List getAllUnreadRecords(){
return getNextRecords(-1);
}
public List getNextRecords(int iNumRecs){
List records = (iNumRecs > 0) ? new ArrayList(iNumRecs) : new ArrayList();
int numRecordsAdded = 0;
while ((iNumRecs < 0 || numRecordsAdded < iNumRecs) && hasMoreRecords()){
records.add(getNextRecord());
numRecordsAdded ++;
}
return records;
}
private boolean hasMoreRecords(){
return rowIterator.hasNext();
}
private Row getNextRow(){
return (rowIterator.hasNext() ? rowIterator.next() : null);
}
private void fillBeanValues(B b, Row row){
for (int i = 0 ; i < heading.length ; i ++ ){
Method getter = getGetter(heading[i]);
if (getter == null) {
throw new RuntimeException("Getter not found for " + heading[i]);
}
Method setter = getMethod("set"+heading[i],getter.getReturnType());
if (setter == null){
throw new RuntimeException("Setter not found for " + heading[i]);
}
Cell cell = row.getCell(i);
Object value = null;
if (isNumeric(getter.getReturnType())) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
case Cell.CELL_TYPE_FORMULA:
value = cell.getNumericCellValue();
break;
default :
value = Double.valueOf(cell.getStringCellValue());
break;
}
if (int.class.isAssignableFrom(getter.getReturnType())){
value = ((Double)value).intValue();
}else if (float.class.isAssignableFrom(getter.getReturnType())) {
value = ((Double)value).floatValue();
}
}else if (isDate(getter.getReturnType())){
value = cell.getDateCellValue();
}else if (isBoolean(getter.getReturnType())){
value = cell.getBooleanCellValue() ;
}else {
value = cell.getStringCellValue();
}
try {
setter.invoke(b, value);
}catch (Exception e){
throw new RuntimeException("Cannot set " + heading[i] + " as " + value + " of Class " + value.getClass().getName(), e);
}
}
}
}