实现思路:

1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel、2003/2007/2010都没问题;

2.对行数据进行解析

  (1)首先第一行作为标题,即和基础类的字段名要保持一致。

  (2)根据传入的Class创建实例

  (3)利用反射,获取方法名,执行方法

  1. Method method = cls.getDeclaredMethod(methodName,cls.getDeclaredField(title).getType());
  2. method.invoke(obj, value);

  (4)将创建的对象加入到集合

需要的jar文件:

所有的jar文件均可以在http://poi.apache.org中找到

具体实现代码细节:

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  9. import org.apache.poi.ss.usermodel.Cell;
  10. import org.apache.poi.ss.usermodel.Row;
  11. import org.apache.poi.ss.usermodel.Sheet;
  12. import org.apache.poi.ss.usermodel.Workbook;
  13. import org.apache.poi.ss.usermodel.WorkbookFactory;
  14.  
  15. /**
  16. * 解析一个Excel表格,将其存放到一个对象集合中
  17. *
  18. * @author jingang
  19. *
  20. */
  21. public class ReadExcel {
  22.  
  23. /**
  24. * 传入一Excel表格,创建出对应的类集合 要求: 类的字段名必须和Excel的首行的标题相同
  25. *
  26. * @param filePath
  27. * @param cls
  28. * @return
  29. * @throws InvalidFormatException
  30. * @throws IOException
  31. * @throws InstantiationException
  32. * @throws IllegalAccessException
  33. * @throws NoSuchMethodException
  34. * @throws SecurityException
  35. * @throws NoSuchFieldException
  36. * @throws IllegalArgumentException
  37. * @throws InvocationTargetException
  38. */
  39. public static List readExcel(String filePath, Class cls) throws InvalidFormatException, IOException,
  40. InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException,
  41. NoSuchFieldException, IllegalArgumentException, InvocationTargetException {
  42. File excelFile = new File(filePath);
  43. FileInputStream is = new FileInputStream(excelFile); // 文件流
  44. Workbook workbook = WorkbookFactory.create(is); // 这种方式完美支持Excel、2003/2007/2010
  45. Sheet sheet = workbook.getSheetAt(0);// 获取工作区(只提取第一个工作区)
  46. int rowCount = sheet.getPhysicalNumberOfRows();// 文件的总行数
  47. List<Object> objList = new ArrayList<>();// 对象的集合
  48. Row row1 = sheet.getRow(0);// 获得首行表示,单元格的内容必须与pojo类的字段名一致
  49. for (int i = 1; i < rowCount; i++) {
  50. // 解析每一行
  51. Row row = sheet.getRow(i);
  52. Object obj = cls.newInstance();// 反射创建对象
  53. for (int j = 0; j < row1.getPhysicalNumberOfCells(); j++) {
  54. String title = row1.getCell(j).getStringCellValue();
  55. String methodName = "set" + title.substring(0, 1).toUpperCase() + title.substring(1);
  56. Cell cell = row.getCell(j);
  57. if (cell != null) {
  58. if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
  59. int value = (int) cell.getNumericCellValue();
  60. Method method = cls.getDeclaredMethod(methodName, cls.getDeclaredField(title).getType());
  61. method.invoke(obj, value);
  62. }
  63. //这里可根据需要,增加对其它数据类型的判断
  64. } else {
  65. Method method = cls.getDeclaredMethod(methodName, cls.getDeclaredField(title).getType());
  66. method.invoke(obj, 0);
  67. }
  68. }
  69. objList.add(obj);
  70. }
  71. return objList;
  72. }
  73. }

该方法目前只是形成了一个初步的模型,仍还有许多需要改进的。譬如:

1.这里只支持了表格中的int数据类型;

2.对于方法耗时太长,可能在使用WorkbookFactory.create(is);的地方耗时太长。

希望各位有好的想法或者改进,敬请指教,多谢!

POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)的更多相关文章

  1. Java基础知识强化之IO流笔记46:IO流练习之 把文本文件中数据存储到集合中的案例

    1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据 ...

  2. 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load

    package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...

  3. java8 从对象集合中取出某个字段的集合

    public class FeildTest { public static void main(String[] args) { //定义list集合 List<P> list = Ar ...

  4. ANDROID_MARS学习笔记_S02_015_Gson解析json串为对象集合

    package com.example.s02_e12_json3; import java.lang.reflect.Type; import java.util.Iterator; import ...

  5. python实例:在列表,字典,集合中,根据条件筛选数据

    1. 从列表中过滤掉 负数 from random import randint # 随机生成列表 data = [randint(-10, 10) for _ in range(10)] print ...

  6. .NET[C#]使用LINQ从List<T>集合中获取最后N条数据记录的方法有哪些?

    https://codedefault.com/2018/using-linq-to-get-the-last-n-elements-of-a-collection-in-csharp-applica ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_1_使用Properties集合存储数据,遍历取出集合中的数据

    map下面的实现类叫做Hashtable Properties是唯一和IO流相结合的 讲解 代码

  8. Jmeter beanshell把数据写入csv文件中,最后清除csv数据

    有时候我们需要使用jmeter去结合csv文件去做一些简单的数据驱动处理: 例如把数据库数据黏贴到csv文件中或者把网页上的数据填入到csv文件中: 直接我一般是用手自己黏贴复制过csv文件中,比较麻 ...

  9. MVC传递数据-传递对象或对象集合

    前言 本文主要介绍从View(或者js)文件向Controller提交对象或者对象集合.比方.将表格中的一行数据作为一个对象提交.或将多行数据作为一个集合提交到Controller. 回想 从View ...

随机推荐

  1. css使absolute相对于父容器进行定位而不是以body(为什么绝对定位(absolute)的父级元素必须是相对定位(relative))

    借知乎的回答如下解释: 首先,我想告诉你的是,如果父级元素是绝对定位(absolute)或者没有设置,里面的绝对定位(absolute)自动以body定位.这句话是错的.正确的是:只要父级元素设了po ...

  2. NOIp 11.11/12

    最后一场比较正式的NOIp模拟赛,写一发小总结.题目没什么好说的,大部分很简单,先贴一下代码. 1111 T1 //string //by Cydiater //2016.11.11 #include ...

  3. 数据降维技术(1)—PCA的数据原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  4. Rest webservice 和SOAP webservice

    SOAP: 简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP) ...

  5. 第1章 (ASP.NET MVC简介)

    一.MVC概念 MVC由三部分组成:视图(View).模型(Model).控制器(Controller)组成 二.运用VS创建MVC 1.新建一个"解决方案" 2.在"解 ...

  6. PHP异步调用多线程

    $data["name"] = 'godlike';$data["age"] = 18; $post = http_build_query($data);$le ...

  7. 博文Contents<1--到200—>

    ====================-------------- 前言:博客中的随笔文章.并非都是笔者的原创文章.有些是听别人说的.有些是书上摘录的.有些是百度的.有些是别人博客的文章.有些是自己 ...

  8. PHP基础之PDO

    简介 PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操作各种数据库.PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方 ...

  9. IRequiresSessionState接口控制

    刚刚接触.net web端的朋友都会被Session坑过,莫名其妙的不能读取Session数据,后来知道原来有IRequiresSessionState这个接口,不继承的就不能读取Session里面的 ...

  10. macOS Sierra U盘USB启动安装盘

    http://www.iplaysoft.com/macos-usb-install-drive.html 文章里提供了一个软件可以自动化操作,但是试了下,不行,试了两三次还是不行,只有参照文章中的第 ...