所有的代码如下:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;





import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.hssf.util.HSSFCellUtil;





/**

 * 将excel数据装换成数据模型

 * 

 * @author 

 * 

 */

public class ExcelImport

{

private static final int HEADER = 0;





private static final int START = 1;





private Logger log = Logger.getLogger(this.getClass());





private HSSFWorkbook book;

/**

* key:excel对应标题 ,value:对象属性

*/

private Map<String, String> associations;

/**

* 装换失败的数据信息,记录行数

*/

private StringBuffer error = new StringBuffer(0);





private Map<Integer, String> header;

/**

* 默认的日期格式

*/

private String date_format = "yyyy-MM-dd";





private SimpleDateFormat format;





/**

* 初始化工作簿



* @param file

*/

public void init(File file)

{

FileInputStream in;

try

{

in = new FileInputStream(file);

book = new HSSFWorkbook(in);





} catch (FileNotFoundException e)

{

e.printStackTrace();

} catch (IOException e)

{

e.printStackTrace();

}





}





public ExcelImport(Map<String, String> associations)

{

this.associations = associations;

format = new SimpleDateFormat(date_format);





}





public ExcelImport(Map<String, String> associations, String date_format)

{

this.associations = associations;

this.date_format = date_format;

format = new SimpleDateFormat(date_format);

}





/**



* @return true 存在错误,false 不存在错误

*/

public boolean hasError()

{

return error.capacity() > 0;

}





public StringBuffer getError()

{

return error;

}





/**

* 获取第一行标题栏数据



* @param sheet

* @return map key:标题栏列下标(0开始) value 标题栏值

*/

private void loadHeader(HSSFSheet sheet)

{

this.header = new HashMap<Integer, String>();

HSSFRow row = sheet.getRow(HEADER);

int columns = row.getLastCellNum();

for (int i = 0; i < columns; i++)

{

log.debug("加载标题栏:" + row.getCell(i).getStringCellValue());

String value = row.getCell(i).getStringCellValue();

if (null == value)

{

throw new RuntimeException("标题栏不能为空!");

}

header.put(i, value);

}

log.debug("<<<<<<<<<<<<标题栏加载完毕>>>>>>>>>>>");

}





/**



* @param clazz

* @param required

*            是否每个属性都是必须的

* @return

*/

public <T> List<T> bindToModels(Class clazz, boolean required)

throws Exception

{

// 获取第一页

HSSFSheet sheet = this.book.getSheetAt(0);

int rowNum = sheet.getLastRowNum();// 获取行数





if (rowNum < 1)

{

return new ArrayList<T>();

}

// 加载标题栏数据

this.loadHeader(sheet);

List<T> result = new ArrayList<T>();





for (int i = START; i < rowNum; i++)

{

HSSFRow row = sheet.getRow(i);

int cellNum = row.getLastCellNum();

T instance = (T) clazz.newInstance();





for (int columns = 0; columns < cellNum; columns++)

{

HSSFCell cell = row.getCell(columns);

// 判断单元格的数据类型

String value = loadCellType(cell);





// 获取单元格的值

if (null == value)

{

// 如果为必填的则将错误信息记录

if (required)

{

this.error.append(

"第" + (i + 1) + "行," + header.get(columns)

+ "字段,数据为空,跳过!").append("\n");

log.debug("第" + (i + 1) + "行," + header.get(columns)

+ "字段,数据为空,跳过!");

continue;

}

} else

{

String key = header.get(columns);

// 加载实际值

this.loadValue(clazz, instance, this.associations.get(key),

value);

}

}

result.add(instance);

}

log.debug("<<<<<装换完成" + (this.hasError() ? "有错误信息" : "") + ",共有对象:"

+ result.size() + "个" + ">>>>>>");

return result;

}





/**

* 将单元格数据转换成string类型



* @param cellType

* @param cell

* @return

*/

private String loadCellType(HSSFCell cell)

{

String value = null;

switch (cell.getCellType())

{

case HSSFCell.CELL_TYPE_BOOLEAN:

value = String.valueOf(cell.getBooleanCellValue());

break;

case HSSFCell.CELL_TYPE_NUMERIC:

// 判断当前的cell是否为Date

if (HSSFDateUtil.isCellDateFormatted(cell))

{

value = this.formateDate(cell.getDateCellValue());

} else

{

value = String.valueOf((long) cell.getNumericCellValue());

}

break;

case HSSFCell.CELL_TYPE_STRING:

value = cell.getStringCellValue();

break;

case HSSFCell.CELL_TYPE_FORMULA:

log.debug("不支持函数!");

break;

}





return value;

}





/**

* 注入属性值



* @param instance

* @param pro

*            属性对象

* @param value

*            属性值

*/

@SuppressWarnings("unchecked")

private <T> void loadValue(Class clazz, T instance, String pro, String value)

throws SecurityException, NoSuchMethodException, Exception

{

String getMethod = this.initGetMethod(pro);

Class type = clazz.getDeclaredMethod(getMethod, null).getReturnType();





Method method = clazz.getMethod(this.initSetMethod(pro), type);





if (type == String.class)

{

method.invoke(instance, value);

} else if (type == int.class || type == Integer.class)

{

method.invoke(instance, Integer.parseInt(value));





} else if (type == long.class || type == Long.class)

{

method.invoke(instance, Long.parseLong(value));





} else if (type == float.class || type == Float.class)

{

method.invoke(instance, Float.parseFloat(value));





} else if (type == double.class || type == Double.class)

{

method.invoke(instance, Double.parseDouble(value));





} else if (type == Date.class)

{

method.invoke(instance, this.parseDate(value));

}





}





private Date parseDate(String value) throws ParseException

{

return format.parse(value);

}





private String formateDate(Date date)

{

return format.format(date);

}





public String initSetMethod(String field)

{

return "set" + field.substring(0, 1).toUpperCase() + field.substring(1);

}





public String initGetMethod(String field)

{

return "get" + field.substring(0, 1).toUpperCase() + field.substring(1);

}





public String getDate_format()

{

return date_format;

}





public void setDate_format(String date_format)

{

this.date_format = date_format;

}





}

POI 导入excel数据自动封装成model对象--代码的更多相关文章

  1. POI 导入excel数据自动封装成model对象--代码分析

    上完代码后,对代码进行主要的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后需要调用init()方法初始化 ...

  2. POI 导入excel数据自动封装成model对象--介绍

    1.项目开发中,导入输入应该是常用的基本功能.我们经常会使用excel将数据导入到数据库,在导入之前必须得将excel数据转换成javaBean对象 2.由于此功能经常使用,所以开发此工具类方便日后轻 ...

  3. POI 导入excel数据自己主动封装成model对象--代码分析

    上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化 ...

  4. java 使用poi 导入Excel 数据到数据库

    由于我个人电脑装的Excel是2016版本的,所以这地方我使用了XSSF 方式导入 . 1先手要制定一个Excel 模板 把模板放入javaWeb工程的某一个目录下如图: 2模板建好了后,先实现模板下 ...

  5. 使用jquery将表单自动封装成json对象 /json对象元素的添加删除和转换

    $.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function ( ...

  6. 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程

    1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...

  7. 基于 Aspose.Cells与XML导入excel 数据----操作类封装

    前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...

  8. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

    ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...

  9. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

随机推荐

  1. Blazor WebAssembly 3.2.0 已在塔架就位 将发射新一代前端SPA框架

    最美人间四月天,春光不负赶路人.在充满无限希望的明媚春天里,一路风雨兼程的.NET团队正奋力实现新的突破. 根据计划,新一代基于WebAssembly 技术研发的前端SPA框架Blazor 将于5月1 ...

  2. 从零开始学习docker之docker的安装

    一.Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程 ...

  3. Python中的可视化神器!你知道是啥吗?没错就是pyecharts!

    pyecharts是一款将python与echarts结合的强大的数据可视化工具,本文将为你阐述pyecharts的使用细则 前言 我们都知道python上的一款可视化工具matplotlib,而前些 ...

  4. ubuntu(Linux)下,查看CPU性能集合

    CPU: 详细:cat /proc/cpuinfo型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}'数量:ls ...

  5. Ubuntu 18.04更换apt-get源

    使用apt-get安装时,会很慢,更换了国内的源后,就可以解决这个问题了. 1. 备份sources.list文件 sudo cp /etc/apt/sources.list /etc/apt/sou ...

  6. opencv-2-VS2017与QT显示图像

    opencv-2-VS2017与QT显示图像 opencvqtVSC++ 目的 使用 VS 构建第一个 opencv 程序 使用 QT 构建 第一个 opencv 程序 VS 导入 QT 程序 开始 ...

  7. css之单位

    css之单位 角度<angle> 用于<gradient>s和某些transform功能中 deg表示以度为单位的角度.一整圈就是360deg. 例如:0deg,90deg,1 ...

  8. 【集群实战】NFS服务常见故障排查和解决方法

    NFS,全名叫Network File System,中文叫网络文件系统,是Linux.UNIX系统的分布式文件系统的一个组成部分,可实现在不同网络上共享远程文件系统. NFS由Sun公司开发,目前已 ...

  9. 【Linux网络基础】TCP/IP协议簇的详细介绍(三次握手四次断开,11种状态)

    一.TCP/IP协议簇(DoD参考模型) 用于简化OSI层次,以及相关的标准. 传输控制协议(tcp/ip)簇是相关国防部DoD所创建的,主要用来确保数据的完整性以及在毁灭性战争中维持通信 是由一组不 ...

  10. Excel中的clean函数

    纯属note. 之前经常用excel处理数据的时候,对长文本或网站上拉取的值都会用clean函数清除一些我们肉眼看不到的非打印字符. Excel官方介绍:clean 删除文本中的所有非打印字符. 此次 ...