利用java反射机制实现读取excel表格中的数据
如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来。
为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>、List<Book>等,所以需要使用泛型机制去实现。下面会给出代码,可能会稍微复杂一点,但注释很清晰,希望大家耐心阅读。
在上代码之前简单说一下思路:
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表格:
运行结果:
1 aa qqqq
2 bb wwwww
3 cc eeee
4 dd rrrr
5 ee tttt
版权声明:本文为博主原创文章,未经博主允许不得转载。
利用java反射机制实现读取excel表格中的数据的更多相关文章
- python读取excel表格中的数据
使用python语言实现Excel 表格中的数据读取,需要用到xlrd.py模块,实现程序如下: import xlrd #导入xlrd模块 class ExcelData(): def __init ...
- java用poi读取Excel表格中的数据
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...
- java读取Excel表格中的数据
1.需求 用java代码读取hello.xls表格中的数据 2.hello.xls表格 3.java代码 package com.test; import java.io.File; import j ...
- 读取Excel表格中数据原型
写下这篇博客来记录自己的工作,这部分功能是读取Excel表格中的数据,并通过c#中的datagridview控件将读取的数据显示出来.为了方便用户,我设计了一个read按钮,用户点击这个按钮,会弹出打 ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- 利用Java反射机制将Bean转成Map
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- 读取Excel表格日期类型数据的时候
用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel 2.Excel数据处理: Excel存储日期.时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化 1 ...
随机推荐
- 基于opencv的gpu与cpu对比程序,代码来自opencv的文档中
原文链接: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/gpu/gpu-basics-similarity/gpu-basi ...
- 初探linux子系统集之led子系统(二)
巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...
- MCU实战经验:多种的按键处理
按键通常有:IO口按键(BUTTON),AD按键(通过AD采样电压),IR(遥控器) 按按键功能分:有短按键,长按键,连续按键.打个比方,遥控电视机,按一下音量键,音量增加1,这个就是短按键.按住音量 ...
- javascript语言扩展:可迭代对象(5)
文章1-4篇说的都是js中的可迭代对象,下面让我们看看ruby中的等价物. 不可否认,ruby中对于迭代器和生成器的语法都相当简洁:ruby从一开始就有一个简洁的基因,而js后来的不断扩充使得其有些语 ...
- 织云 Metis:看腾讯怎么做智能运维
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作为企业智能运维门户,业界早已关注织云的智能运维体系.我们很荣幸地宣布织云 Metis 智能运维体系正式发布.自此,织云家族已发布:织云企业 ...
- Java不走弯路教程(6.JDBC)
6.JDBC 在上一章,我们完成了MyDb数据库的简单的客户段调用.作为产品我们还封装了驱动程序,并且提供了统一的调用接口. 大家应该知道,市面上有多种数据库产品,比如Oracle,Mysql,DB2 ...
- Linux下DB2数据库安装教程
最近因为工作需要在学习DB2数据库,本教程讲解DB2数据库在inux下的安装步骤. 安装前请查看 DB2版本和许可证 说明来增加了解,先弄明白改安装什么版本,这里我用的是最新的Express-C版本, ...
- JTA 原理分析
JTA 深度历险 - 原理与实现 在 J2EE 应用中,事务是一个不可或缺的组件模型,它保证了用户操作的 ACID(即原子.一致.隔离.持久)属性.对于只操作单一数据源的应用,可以通过本地资源接口实现 ...
- 原生Eclipse下Java服务器调试的一个问题
当你对Server的配置修改以后,最好到 workspacedir\.metadata\.plugins\org.eclipse.wst.server.core\tmp0目录下把缓存文件给删除了,否则 ...
- Nowcoder84D
Nowcoder84D 传送门 很有趣的进制转换题! 如果x满足题意,那么x+k-1一定能符合要求! 因为k-1用k进制表示就是1,-1,1+(-1)=0所以数位之和不变! 用map维护一下前缀和.就 ...