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

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

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

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

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

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

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

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

实体类User:

  1. public class User {
  2. private int id;
  3. private String name;
  4. private String password;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public String getPassword() {
  18. return password;
  19. }
  20. public void setPassword(String password) {
  21. this.password = password;
  22. }
  23.  
  24. }

处理类:

  1. package module.system.common;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.lang.reflect.Field;
  8. import java.lang.reflect.Method;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. import org.apache.poi.hssf.usermodel.HSSFRow;
  13. import org.apache.poi.hssf.usermodel.HSSFSheet;
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  15.  
  16. /**
  17. * 从excel读取数据/往excel中写入 excel有表头,表头每列的内容对应实体类的属性
  18. *
  19. * @author nagsh
  20. *
  21. */
  22. public class ExcelManage {
  23. private HSSFWorkbook workbook;
  24.  
  25. public ExcelManage(String fileDir) {
  26. File file = new File(fileDir);
  27. try {
  28. workbook = new HSSFWorkbook(new FileInputStream(file));
  29. } catch (FileNotFoundException e) {
  30. e.printStackTrace();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. /**
  37. * 读取excel表中的数据.
  38. *
  39. * @param sheetName
  40. * 表格索引(EXCEL 是多表文档,所以需要输入表索引号,如sheet1)
  41. */
  42. public List readFromExcel(String sheetName, Object object) {
  43.  
  44. List result = new ArrayList();
  45. // 获取该对象的class对象
  46. Class class_ = object.getClass();
  47. // 获得该类的所有属性
  48. Field[] fields = class_.getDeclaredFields();
  49.  
  50. // 读取excel数据
  51. // 获得指定的excel表
  52. HSSFSheet sheet = workbook.getSheet(sheetName);
  53. // 获取表格的总行数
  54. int rowCount = sheet.getLastRowNum() + 1; // 需要加一
  55. if (rowCount < 1) {
  56. return result;
  57. }
  58. // 获取表头的列数
  59. int columnCount = sheet.getRow(0).getLastCellNum();
  60. // 读取表头信息,确定需要用的方法名---set方法
  61. // 用于存储方法名
  62. String[] methodNames = new String[columnCount]; // 表头列数即为需要的set方法个数
  63. // 用于存储属性类型
  64. String[] fieldTypes = new String[columnCount];
  65. // 获得表头行对象
  66. HSSFRow titleRow = sheet.getRow(0);
  67. // 遍历
  68. for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { // 遍历表头列
  69. String data = titleRow.getCell(columnIndex).toString(); // 某一列的内容
  70. String Udata = Character.toUpperCase(data.charAt(0))
  71. + data.substring(1, data.length()); // 使其首字母大写
  72. methodNames[columnIndex] = "set" + Udata;
  73. for (int i = 0; i < fields.length; i++) { // 遍历属性数组
  74. if (data.equals(fields[i].getName())) { // 属性与表头相等
  75. fieldTypes[columnIndex] = fields[i].getType().getName(); // 将属性类型放到数组中
  76. }
  77. }
  78. }
  79. // 逐行读取数据 从1开始 忽略表头
  80. for (int rowIndex = 1; rowIndex < rowCount; rowIndex++) {
  81. // 获得行对象
  82. HSSFRow row = sheet.getRow(rowIndex);
  83. if (row != null) {
  84. Object obj = null;
  85. // 实例化该泛型类的对象一个对象
  86. try {
  87. obj = class_.newInstance();
  88. } catch (Exception e1) {
  89. e1.printStackTrace();
  90. }
  91.  
  92. // 获得本行中各单元格中的数据
  93. for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
  94. String data = row.getCell(columnIndex).toString();
  95. // 获取要调用方法的方法名
  96. String methodName = methodNames[columnIndex];
  97. Method method = null;
  98. try {
  99. // 这部分可自己扩展
  100. if (fieldTypes[columnIndex].equals("java.lang.String")) {
  101. method = class_.getDeclaredMethod(methodName,
  102. String.class); // 设置要执行的方法--set方法参数为String
  103. method.invoke(obj, data); // 执行该方法
  104. } else if (fieldTypes[columnIndex].equals("int")) {
  105. method = class_.getDeclaredMethod(methodName,
  106. int.class); // 设置要执行的方法--set方法参数为int
  107. double data_double = Double.parseDouble(data);
  108. int data_int = (int) data_double;
  109. method.invoke(obj, data_int); // 执行该方法
  110. }
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. result.add(obj);
  116. }
  117. }
  118. return result;
  119. }
  120.  
  121. public static void main(String[] args) {
  122. ExcelManage em = new ExcelManage("E:/test.xls");
  123. User user = new User();
  124. List list = em.readFromExcel("sheet1", user);
  125. for (int i = 0; i < list.size(); i++) {
  126. User newUser = (User) list.get(i);
  127. System.out.println(newUser.getId() + " " + newUser.getName() + " "
  128. + newUser.getPassword());
  129. }
  130.  
  131. }
  132.  
  133. }

excel表格:

运行结果:

  1. 1 aa qqqq
  2. 2 bb wwwww
  3. 3 cc eeee
  4. 4 dd rrrr
  5. 5 ee tttt

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

利用java反射机制实现读取excel表格中的数据的更多相关文章

  1. python读取excel表格中的数据

    使用python语言实现Excel 表格中的数据读取,需要用到xlrd.py模块,实现程序如下: import xlrd #导入xlrd模块 class ExcelData(): def __init ...

  2. java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...

  3. java读取Excel表格中的数据

    1.需求 用java代码读取hello.xls表格中的数据 2.hello.xls表格 3.java代码 package com.test; import java.io.File; import j ...

  4. 读取Excel表格中数据原型

    写下这篇博客来记录自己的工作,这部分功能是读取Excel表格中的数据,并通过c#中的datagridview控件将读取的数据显示出来.为了方便用户,我设计了一个read按钮,用户点击这个按钮,会弹出打 ...

  5. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  6. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  7. 利用Java反射机制对实体类的常用操作工具类ObjectUtil

    代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...

  8. 利用Java反射机制将Bean转成Map

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  9. 读取Excel表格日期类型数据的时候

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel 2.Excel数据处理: Excel存储日期.时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化 1 ...

随机推荐

  1. Android开发技巧——自定义控件之增加状态

    Android开发技巧--自定义控件之增加状态 题外话 这篇本该是上周四或上周五写的,无奈太久没写博客,前几段把我的兴头都用完了,就一拖再拖,直到今天.不想把这篇拖到下个月,所以还是先硬着头皮写了. ...

  2. java--加强之 Java5的线程并发库

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...

  3. C++实现二叉树

    #include <iostream> using namespace std ; class Tree { public : int number ; class Tree *left ...

  4. ORM框架--GreenDao 3.0基本使用指南

    0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...

  5. asp.net core上使用redis探索(1)

    基于Ubuntu安装redis, 我找的一个很好的网站: https://www.digitalocean.com/community/tutorials/how-to-install-and-con ...

  6. 浮点数据有损压缩算法 附完整C代码

    在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...

  7. javascript简单介绍(二)

    晨读单词: onmouseover:鼠标移入 onmouseout:鼠标移出 attribute:属性 node:节点 document:文档 element:元素 textNode:文本节点 app ...

  8. 使用jdk8 stream 统计单词数

    在我的SpringBoot2.0不容错过的新特性 WebFlux响应式编程里面,有同学问如何使用stream统计单词数.这是个好例子,也很典型,在这里补上. 下面的例子实现了从一个文本文件读取(英文) ...

  9. access登录窗口校验代码一

    Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...

  10. SQL SERVER 锁资源问题

    1204: cannot obtain a LOCK resource 在sql server 锁资源的限制基本是自动优化调整.如果调整过参数,可能在系统大批量查询的时候出现以上错误,或者是 alwa ...