excel数据录入数据库工具
excel数据录入数据库工具1、主要方法/*** 将excel表对应列,装入实体类对应字段,形成实体类结果集* @param path excel表路径* @param clazz 对应实体类* @param result 结果集* @param columns excel读取列,索引从0开始* @param fns 对应实体类的lambda表达式,get方法*/public static <
·
excel数据录入数据库工具
之前客户需要录入excel到数据库,手动录入太麻烦了,于是结合之前学的lambda,自己搞了一个工具
1、主要方法
/**
* 将excel表对应列,装入实体类对应字段,形成实体类结果集
* @param path excel表路径
* @param clazz 对应实体类
* @param result 结果集
* @param columns excel读取列,索引从0开始
* @param fns 对应实体类的lambda表达式,get方法
*/
public static <T> void Excel2EntityList(String path, Class clazz, Collection result, List<Integer> columns, IGetter<T>... fns) {
try {
// 获取需要赋值的属性名
List<String> attributes = new ArrayList<>();
Arrays.stream(fns).forEach(fn -> {
SerializedLambda lambda = LambdaUtil.getSerializedLambda(fn);
String methodName = lambda.getImplMethodName();
methodName = methodName.replaceFirst("get", "");
methodName = methodName.substring(0,1).toLowerCase() + methodName.substring(1);
attributes.add(methodName);
});
// 创建对Excel工作簿文件的引用
Workbook wb = WorkbookFactory.create(new FileInputStream(path));
// 在Excel文档中,第一张工作表的缺省索引是0
// 其语句为:XSSFSheet sheet = workbook.getSheetAt(0);
Sheet sheet = wb.getSheetAt(0);
if (null != sheet) {
// 获取到Excel文件中的所有行数
int rows = sheet.getPhysicalNumberOfRows();
// 遍历行(由于excel表第一行为对应表字段的列,所以i从1开始)
for (int i = 1; i < rows; i++) {
// 读取左上端单元格
Row row = sheet.getRow(i);
// 行不为空
if (row != null) {
// 获取一行对应的一个对象实例
Object o = clazz.getConstructor().newInstance();
AtomicInteger k = new AtomicInteger();
// 为对象赋值
attributes.stream().forEach(attribute -> {
try {
Field field = clazz.getDeclaredField(attribute);
field.setAccessible(true);
Class<?> typeClass = field.getType();
String type = field.getGenericType().getTypeName();
Method method = clazz.getMethod("set" + attribute.substring(0,1).toUpperCase() + attribute.substring(1), typeClass);
if ("java.lang.String".equals(type)) {
method.invoke(o, row.getCell(columns.get(k.get())).getStringCellValue());
}
else if ("java.lang.Float".equals(type)) {
method.invoke(o, (float) row.getCell(columns.get(k.get())).getNumericCellValue());
}
else if ("java.lang.Double".equals(type)) {
method.invoke(o, row.getCell(columns.get(k.get())).getNumericCellValue());
}
else if ("java.lang.Integer".equals(type)) {
method.invoke(o, (int) row.getCell(columns.get(k.get())).getNumericCellValue());
}
k.getAndIncrement();
if (columns.size() <= k.get()) {
k.set(0);
}
} catch (Exception e) {
System.out.println("参数错误:");
System.out.println("实体类属性:" + attribute);
System.out.println("excel表第" + k.get() +"列");
}
});
// 将对象装入集合
result.add(o);
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
2、其他方法
/**
* 获取函数式接口的SerializedLambda
*/
public static SerializedLambda getSerializedLambda(Serializable fn) {
SerializedLambda lambda = CLASS_LAMDBA_CACHE.get(fn.getClass());
if(lambda == null) {
try {
Method method = fn.getClass().getDeclaredMethod("writeReplace");
method.setAccessible(Boolean.TRUE);
lambda = (SerializedLambda) method.invoke(fn);
CLASS_LAMDBA_CACHE.put(fn.getClass(), lambda);
} catch (Exception e) {
e.printStackTrace();
}
}
return lambda;
}
/**
* 测试
*/
public static void main(String[] args) {
List<Entity> list = new ArrayList<>();
List<Integer> columns = new ArrayList<>();
columns.add(0);
columns.add(2);
ExcelUtil.Excel2EntityList("D:\\zl\\xxx.xlsx",
Entity.class,
list,
columns,
Entity::getName, Entity::getAge);
// list中数据录入数据库
}
3、代码地址:
https://gitee.com/zilong123666/cabinet 一起进步,一起学习

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)