我用POI读excel然后插入mysql里面的字段什么的都已固定现在我是一列一列的插入就是 HSSFCell barCode=row.getCell((short) 0);
HSSFCell name=row.getCell((short) 1);得到一列一列的值 然后在insert的但总感觉非常麻烦 请前辈们给我提示,怎样操作方便!就是如何避免将值一个一个的写出来(麻烦,估计效率也不高)
HSSFCell name=row.getCell((short) 1);得到一列一列的值 然后在insert的但总感觉非常麻烦 请前辈们给我提示,怎样操作方便!就是如何避免将值一个一个的写出来(麻烦,估计效率也不高)
解决方案 »
- Action中如何接收<s:select>标签中的值?
- java内部类如何映射为数据库实体?
- resin 配制ORCALE连接池问题?很急!!!!!!!!!!!!!!!!!!!1
- 请大家帮忙解决几个问题 weblogic
- 请问: WebLogic支持Axis吗?
- 一个eclipse操作的问题,还是不清楚怎么操作
- ejb中relationship的问题,高手请进
- jdbc连接mysql时的异常问题catch(SQLException e)
- 非技术关于J2EE的问题,各位点拨一下?
- log4j怎么使用相对于classpath的相对路径来输出日志文件
- 短信猫连接数据库
- spring结合mybatis多数据源
大体思路:
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的值,请注意。
楼主是用HSSFCell barCode=row.getCell((short) 0)的方法来获取Cell值再设置到Bean中,我是动态获取Cell的值再设置到相应的Bean的属性名上。getNumericCellValue不是我的,是POI的API。如果你有高见,请提出。好像你并没有正确指出我的问题,也没有提供解决办法。