我用POI读excel然后插入mysql里面的字段什么的都已固定现在我是一列一列的插入就是 HSSFCell barCode=row.getCell((short) 0);
 HSSFCell name=row.getCell((short) 1);得到一列一列的值  然后在insert的但总感觉非常麻烦 请前辈们给我提示,怎样操作方便!就是如何避免将值一个一个的写出来(麻烦,估计效率也不高)

解决方案 »

  1.   

    大致理解你是想动态把Cell的值设置到Bean中,然后把Bean持久化到数据库中,是这么吧?如果是,用Java的反射机制可以做到的。
    大体思路:
        1.读取Excel文件
        2.得到目标Bean(下面以User为例)
        3.获取Excel文件的每一行,通过反射把每一列的内容设置到User中
        4.把User保存到数据库中给段代码你试试.import java.io.File;
    import java.io.FileInputStream;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    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;public class ExcelUtils {
    //Class是指Bean的Class,你可以传递如User.Class
    public static <T> List<T> convertToList(File excelFile, Class<T> clazz) throws Exception {
    List<T> list = new ArrayList<T>();
    //以Excel2003格式为例,如果你需要处理2007格式的,请自行参考POI文档
    Workbook workbook = new HSSFWorkbook(new FileInputStream(excelFile));
    Sheet sheet = workbook.getSheetAt(0);
    int rows = sheet.getPhysicalNumberOfRows();
                    //要求Excel文件中的第1行作为标题行,即Bean的属性名,如userName等
    Row header = sheet.getRow(0); for(int i=1; i<rows; i++) {
    Row row = sheet.getRow(i);
    int cells = row.getPhysicalNumberOfCells();
                            
    T t = clazz.newInstance();
    Method[] methods = t.getClass().getDeclaredMethods();
      for(int j=0; j<cells; j++) {
    Cell cell = row.getCell(j);
    for(Method method : methods) {
                                            //通过反射机制设置目标Bean的值
    if (method.getName().equalsIgnoreCase("set" + header.getCell(j))) {
                                                    //这里要注意类型转换,如果类型不对,会抛出Argument Type Mismatch的异常。
    method.invoke(t, getCellValue(cell));
    }
    }
    }

    list.add(t);
    }

    return list;
    }

    public static Object getCellValue(Cell cell) {
    switch(cell.getCellType()) {
    case Cell.CELL_TYPE_NUMERIC : return cell.getNumericCellValue();
    case Cell.CELL_TYPE_STRING : return cell.getStringCellValue();
    case Cell.CELL_TYPE_FORMULA : return cell.getCellFormula();
    case Cell.CELL_TYPE_BOOLEAN : return cell.getBooleanCellValue();
    case Cell.CELL_TYPE_ERROR : return cell.getErrorCellValue();
    case Cell.CELL_TYPE_BLANK : return "";
    default : return cell.getStringCellValue();
    }

    }

    }
    以上代码需要注意几个地方:
        1.cell.getNumericCellValue()返回的是Double类型,如果User中包含有int类型的数据,请自行转换.
        2.如果User中包含其他Bean,如在User中有个Account的Bean,通过以上代码是无法设置Account的值,请注意。
      

  2.   

    你的做法和楼主有何不同 还有你的NumericCellValue 连对日期的判断都没的
      

  3.   


    楼主是用HSSFCell barCode=row.getCell((short) 0)的方法来获取Cell值再设置到Bean中,我是动态获取Cell的值再设置到相应的Bean的属性名上。getNumericCellValue不是我的,是POI的API。如果你有高见,请提出。好像你并没有正确指出我的问题,也没有提供解决办法。