天天看点

POI读取Excel 初步支持对象封装功能

package com.randy;

import java.beans.beaninfo;

import java.beans.introspectionexception;

import java.beans.introspector;

import java.beans.propertydescriptor;

import java.io.fileinputstream;

import java.io.filenotfoundexception;

import java.io.ioexception;

import java.text.dateformat;

import java.text.decimalformat;

import java.text.simpledateformat;

import java.util.arraylist;

import java.util.date;

import java.util.hashmap;

import java.util.iterator;

import java.util.list;

import java.util.map;

import java.util.set;

import org.apache.commons.beanutils.beanutils;

import org.apache.commons.beanutils.propertyutils;

import org.apache.commons.collections.maputils;

import org.apache.commons.lang.arrayutils;

import org.apache.commons.lang.booleanutils;

import org.apache.poi.hssf.usermodel.hssfcell;

import org.apache.poi.hssf.usermodel.hssfdateutil;

import org.apache.poi.hssf.usermodel.hssfrow;

import org.apache.poi.hssf.usermodel.hssfsheet;

import org.apache.poi.hssf.usermodel.hssfworkbook;

public class excelreader {

  final simpledateformat format = new simpledateformat("yyyy-mm-dd");

  private fileinputstream inputstream;

  private hssfworkbook workbook;

  private int sheetindex;

  /**

    * 开始读取数据行

    */

  private int startrow =0;

    * 开始读取数据列

  private int startcolumn=0;

    * 指定输入流

    * 初始化workbook对象

  private void initworkbook() {

    if (workbook == null) {

      try {

        workbook = new hssfworkbook(inputstream);

      } catch (ioexception e) {

        e.printstacktrace();

      }

    }

  }

    * 获取所有行

    * @return

  public list<hssfrow> readhssfrows(){

    hssfsheet sheet = workbook.getsheetat(sheetindex);

    //实际存在的行数

    int rows = sheet.getphysicalnumberofrows();

    list<hssfrow> hssfrows = new arraylist<hssfrow>();

    for (int count = startrow; count <=rows-1; count++) {

      hssfrow row = sheet.getrow(count);

      if(row !=null){

        hssfrows.add(row);

    return hssfrows;

    * 读取行数据

    * @param hssfrow

  public string[] readcellsvalue(hssfrow hssfrow){

    int cells = hssfrow.getphysicalnumberofcells();//列数

    system.out.println("\nrow " + hssfrow.getrownum() + " has " + cells

        + " cell(s).");

    string[] cellvalues = new string[cells];

    for (int counter = startcolumn; counter < cells; counter++) {

      hssfcell cell = hssfrow.getcell(counter);

      string value = null;

      switch (cell.getcelltype()) {

        case hssfcell.cell_type_formula:

          value = cell.getcellformula();

          break;

        case hssfcell.cell_type_numeric:

          value = string.valueof(cell.getnumericcellvalue());

                                        if (hssfdateutil.iscelldateformatted(cell)) {

                                                date date = cell.getdatecellvalue();

                                                if (date != null) {

              value = format.format(date);

                                                } else {

                                                        value = "";

                                                }

                                        } else {

                                                value = new decimalformat("0").format(cell.getnumericcellvalue());

                                        }

        case hssfcell.cell_type_string:

          value = cell.getstringcellvalue();

        default:

          value ="9999";

      cellvalues[counter] = value;

    }//end for

    return cellvalues;

    * 

    * 根据传入的map;将cell的数值依次对应赋值给对象属性

    * @param propertiesmap:格式為[-1:class,0:filedname1;1:filedname2.....]

    * 其中:0代表第0个cell;1代表第1个cell

    * @param cells

  @suppresswarnings("unchecked")

  public object genvofromcells(map<integer,string> propertiesmap,string cells[]){

    //存放对象属性描述信息

    map<string,propertydescriptor> propmap = new hashmap<string,propertydescriptor>();

    object obj = null;

    string classname = propertiesmap.get(-1);

    map properdesc = null;

    try {

      class cls = class.forname(classname);

      obj = cls.newinstance();

      //获取对象的描述信息

      beaninfo bi = introspector.getbeaninfo(cls);

      propertydescriptor[] pds = bi.getpropertydescriptors();

      for(propertydescriptor p:pds){

        propmap.put(p.getname(), p);

      }      

      properdesc = beanutils.describe(obj);

      set<integer> keys = propertiesmap.keyset();

      iterator<integer> iter = keys.iterator();

      while(iter.hasnext()){

        integer index = iter.next();

        if(index.intvalue() == -1){continue;}

        string property = propertiesmap.get(index);

        if(properdesc.containskey(property)){

          //获取对象类型

          class<?> propertytype = propmap.get(property).getpropertytype();

          system.out.println(property+".class:"+propertytype);

          string value = cells[index];

          if(string.class.equals(propertytype)){

            propertyutils.setproperty(obj, property, value);

          }else if(date.class.equals(propertytype)){

            date d;

            try {

              d = format.parse(value);

            } catch (exception e) {

              d = new date();

            }

            propertyutils.setproperty(obj,property,d);

          }else if(int.class.equals(propertytype)|| integer.class.equals(propertytype)){

            int i = 0; 

            try{

              i = integer.parseint(value);

            }catch (numberformatexception e) {

              i = 0;

            propertyutils.setproperty(obj,property,i);

          }else if(double.class.equals(propertytype) || double.class.equals(propertytype)){

            double d = 0; 

              d = double.parsedouble(value);

              d = 0.0;

            propertyutils.setproperty(obj,property,d);            

          }else if(long.class.equals(propertytype) || long.class.equals(propertytype)){

            long l = 0; 

              l = long.parselong(value);

              l = 0l;

            propertyutils.setproperty(obj,property,l);            

          }else if(float.class.equals(propertytype) || float.class.equals(propertytype)){

            float f = 0; 

              f = float.parsefloat(value);

              f = 0l;

            propertyutils.setproperty(obj,property,f);            

          }else{//boolean

            boolean b = booleanutils.tobooleanobject(value);

            propertyutils.setproperty(obj,property,b);

          }

        }

    } catch (exception e) {

      e.printstacktrace();

    return obj;

    * 设置输入流;

    * 必须为excel指定输入流

    * @param inputstream

  public void setinputstream(fileinputstream inputstream) {

    this.inputstream = inputstream;

    initworkbook();

    * 设置读取sheet

    * @param sheetindex

  public void setsheetindex(int sheetindex) {

    this.sheetindex = sheetindex;

    * 设置读取数据起始行

    * 默认从0开始

    * @param startrow

  public void setstartrow(int startrow) {

    this.startrow = startrow;

    * 设置行数据,读取数据起始列

    * @param startcolumn

  public void setstartcolumn(int startcolumn) {

    this.startcolumn = startcolumn;

  public static void main(string args[]){

    map<integer,string> propertiesmap = new hashmap<integer,string>();

    propertiesmap.put(-1, "com.randy.vo");

    propertiesmap.put(0, "num");

    propertiesmap.put(1, "str");

    propertiesmap.put(2, "date");

    excelreader reader = new excelreader();

    fileinputstream excelfile = null;

      excelfile = new fileinputstream("f:\\workbook.xls");

    } catch (filenotfoundexception e) {

    reader.setinputstream(excelfile);

    list<hssfrow> rows = reader.readhssfrows();

    for(hssfrow row:rows){

      string[] values = reader.readcellsvalue(row);

      for(string v:values){

        system.out.print(v+"\t");

      system.out.println();

      object obj = reader.genvofromcells(propertiesmap,values);

      system.out.println(obj);

}