java通过桥访问excel_利用java反射机制实现读取excel表格中的数据

如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来。

为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List、List等,所以需要使用泛型机制去实现。下面会给出代码,可能会稍微复杂一点,但注释很清晰,希望大家耐心阅读。

在上代码之前简单说一下思路:

1.excel表格必须有表头,且表头中各列的值要与实体类的属性相同;

2.先读取表头信息,然后获取表头列数,接着确定需要使用的set方法的名称,并存到数组中;

3.利用反射机制,获取object对象的属性,通过与excel表格表头对比,确定各个属性的类型,存到数组中(以excel表格中属性的顺序);

4.遍历除表头行的数据,利用反射机制实例化对象,调用对应的set方法,方法参数通过3获取;

上代码:(需要使用poi包,请自行下载)

实体类User:

public class User {

private int id;

private String name;

private String password;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}处理类:

package module.system.common;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

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

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

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

/**

* 从excel读取数据/往excel中写入 excel有表头,表头每列的内容对应实体类的属性

*

* @author nagsh

*

*/

public class ExcelManage {

private HSSFWorkbook workbook;

public ExcelManage(String fileDir) {

File file = new File(fileDir);

try {

workbook = new HSSFWorkbook(new FileInputStream(file));

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 读取excel表中的数据.

*

* @param sheetName

* 表格索引(EXCEL 是多表文档,所以需要输入表索引号,如sheet1)

*/

public List readFromExcel(String sheetName, Object object) {

List result = new ArrayList();

// 获取该对象的class对象

Class class_ = object.getClass();

// 获得该类的所有属性

Field[] fields = class_.getDeclaredFields();

// 读取excel数据

// 获得指定的excel表

HSSFSheet sheet = workbook.getSheet(sheetName);

// 获取表格的总行数

int rowCount = sheet.getLastRowNum() + 1; // 需要加一

if (rowCount < 1) {

return result;

}

// 获取表头的列数

int columnCount = sheet.getRow(0).getLastCellNum();

// 读取表头信息,确定需要用的方法名---set方法

// 用于存储方法名

String[] methodNames = new String[columnCount]; // 表头列数即为需要的set方法个数

// 用于存储属性类型

String[] fieldTypes = new String[columnCount];

// 获得表头行对象

HSSFRow titleRow = sheet.getRow(0);

// 遍历

for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { // 遍历表头列

String data = titleRow.getCell(columnIndex).toString(); // 某一列的内容

String Udata = Character.toUpperCase(data.charAt(0))

+ data.substring(1, data.length()); // 使其首字母大写

methodNames[columnIndex] = "set" + Udata;

for (int i = 0; i < fields.length; i++) { // 遍历属性数组

if (data.equals(fields[i].getName())) { // 属性与表头相等

fieldTypes[columnIndex] = fields[i].getType().getName(); // 将属性类型放到数组中

}

}

}

// 逐行读取数据 从1开始 忽略表头

for (int rowIndex = 1; rowIndex < rowCount; rowIndex++) {

// 获得行对象

HSSFRow row = sheet.getRow(rowIndex);

if (row != null) {

Object obj = null;

// 实例化该泛型类的对象一个对象

try {

obj = class_.newInstance();

} catch (Exception e1) {

e1.printStackTrace();

}

// 获得本行中各单元格中的数据

for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {

String data = row.getCell(columnIndex).toString();

// 获取要调用方法的方法名

String methodName = methodNames[columnIndex];

Method method = null;

try {

// 这部分可自己扩展

if (fieldTypes[columnIndex].equals("java.lang.String")) {

method = class_.getDeclaredMethod(methodName,

String.class); // 设置要执行的方法--set方法参数为String

method.invoke(obj, data); // 执行该方法

} else if (fieldTypes[columnIndex].equals("int")) {

method = class_.getDeclaredMethod(methodName,

int.class); // 设置要执行的方法--set方法参数为int

double data_double = Double.parseDouble(data);

int data_int = (int) data_double;

method.invoke(obj, data_int); // 执行该方法

}

} catch (Exception e) {

e.printStackTrace();

}

}

result.add(obj);

}

}

return result;

}

public static void main(String[] args) {

ExcelManage em = new ExcelManage("E:/test.xls");

User user = new User();

List list = em.readFromExcel("sheet1", user);

for (int i = 0; i < list.size(); i++) {

User newUser = (User) list.get(i);

System.out.println(newUser.getId() + " " + newUser.getName() + " "

+ newUser.getPassword());

}

}

}excel表格:

78f51048ef7a30512c4c0c8ad3116b74.png

运行结果:

1 aa qqqq

2 bb wwwww

3 cc eeee

4 dd rrrr

5 ee tttt

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值