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; import com.jeffy.bean.Indexmanage; /**
* 读取excel的公用方法
* @author Jeffy
*
*/
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;
} /**
* 读取EXCEL中的数据
* @param path EXCEL路径
* @param sheetName sheet页名称
* @param className 要返回的list的类
* @return 传入类的list
*/
public static List getDataFromExcel(String path, String sheetName,Class<? extends Object> className) {
ExcelManage em = new ExcelManage(path);
Object obj = null;
try {
obj = className.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return em.readFromExcel(sheetName, obj);
} public static void main(String[] args) {
getDataFromExcel("d:/test2.xls", "sheet1", Indexmanage.class);
}
}

EXCEL通用类

maven依赖

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>

EXCEL导入(反射)的更多相关文章

  1. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  2. C# Excel导入、导出【源码下载】

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  3. 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

    做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...

  4. Excel导入导出(篇二)

    <body> <h3>一.Excel导入</h3> <h5>.模板下载:<a href="UpFiles/TemplateFiles/学 ...

  5. C# Excel导入、导出

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  6. 土制Excel导入导出及相关问题探讨

    转载请注明出处https://www.cnblogs.com/funnyzpc/p/10392085.html 新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗: < ...

  7. Open XML操作Excel导入数据

    项目中发现使用OleDb(using System.Data.OleDb)相关对象处理Excel导入功能,不是很稳定经常出问题,需要把这个问题解决掉.项目组提出使用OpenXML来处理Excel的导入 ...

  8. POI操作Excel导入和导出

    Apache的POI组件是Java操作Microsoft Office办公套件的强大API,当中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel.由于Word和Po ...

  9. 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

    注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

随机推荐

  1. mysql 查询优化

    不说话,先贴代码 public PageResult<BoTmcRaw> getLargeList(BaseCondition baseCondition) { PageResult< ...

  2. java通用的方法整理

    判断字符串是否为空 public static boolean IsEmpty(String str){ if (str == null){ return true; } if ("&quo ...

  3. css2--collapse

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. 最小系统加载工具 systemjs

    systemjs 是一个最小系统加载工具,用来创建插件来处理可替代的场景加载过程,包括加载 CSS 场景和图片,主要运行在浏览器和 NodeJS 中.它是 ES6 浏览器加载程序的的扩展,将应用在本地 ...

  5. GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包

    0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持 ...

  6. BZOJ 4518 征途

    斜率优化.又是变量名打错看了老半天. 把方差式子展开一下就好了. #include<iostream> #include<cstdio> #include<cstring ...

  7. UE4 通过HTTP 接受JPG并动态 构建 UTexture2D 简单例子

    s void UChildBaseUserWidget::setTextureFromLoadImg(FHttpRequestPtr _request, FHttpResponsePtr _respo ...

  8. The constructor User.Student(String, String, String) is not visible

    项目:蒙文词语检索 日期:2016-05-01 提示:The constructor User.Student(String, String, String) is not visible 出处:Db ...

  9. 黑马-----内存模型和volatile详解

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA线程-内存模型和volatile详解 一.单核内存模型 1.程序运行时,将临时数据存放到Cache中 2.将CPU计算所 ...

  10. Runtime Complexity of .NET Generic Collection

    Runtime Complexity of .NET Generic Collection   I had to implement some data structures for my compu ...