利用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 ...
随机推荐
- Android开发技巧——自定义控件之增加状态
Android开发技巧--自定义控件之增加状态 题外话 这篇本该是上周四或上周五写的,无奈太久没写博客,前几段把我的兴头都用完了,就一拖再拖,直到今天.不想把这篇拖到下个月,所以还是先硬着头皮写了. ...
- java--加强之 Java5的线程并发库
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...
- C++实现二叉树
#include <iostream> using namespace std ; class Tree { public : int number ; class Tree *left ...
- ORM框架--GreenDao 3.0基本使用指南
0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...
- asp.net core上使用redis探索(1)
基于Ubuntu安装redis, 我找的一个很好的网站: https://www.digitalocean.com/community/tutorials/how-to-install-and-con ...
- 浮点数据有损压缩算法 附完整C代码
在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...
- javascript简单介绍(二)
晨读单词: onmouseover:鼠标移入 onmouseout:鼠标移出 attribute:属性 node:节点 document:文档 element:元素 textNode:文本节点 app ...
- 使用jdk8 stream 统计单词数
在我的SpringBoot2.0不容错过的新特性 WebFlux响应式编程里面,有同学问如何使用stream统计单词数.这是个好例子,也很典型,在这里补上. 下面的例子实现了从一个文本文件读取(英文) ...
- access登录窗口校验代码一
Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...
- SQL SERVER 锁资源问题
1204: cannot obtain a LOCK resource 在sql server 锁资源的限制基本是自动优化调整.如果调整过参数,可能在系统大批量查询的时候出现以上错误,或者是 alwa ...