POI 导入excel数据自动封装成model对象--代码
所有的代码如下:
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对象--代码的更多相关文章
- POI 导入excel数据自动封装成model对象--代码分析
上完代码后,对代码进行主要的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后需要调用init()方法初始化 ...
- POI 导入excel数据自动封装成model对象--介绍
1.项目开发中,导入输入应该是常用的基本功能.我们经常会使用excel将数据导入到数据库,在导入之前必须得将excel数据转换成javaBean对象 2.由于此功能经常使用,所以开发此工具类方便日后轻 ...
- POI 导入excel数据自己主动封装成model对象--代码分析
上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化 ...
- java 使用poi 导入Excel 数据到数据库
由于我个人电脑装的Excel是2016版本的,所以这地方我使用了XSSF 方式导入 . 1先手要制定一个Excel 模板 把模板放入javaWeb工程的某一个目录下如图: 2模板建好了后,先实现模板下 ...
- 使用jquery将表单自动封装成json对象 /json对象元素的添加删除和转换
$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function ( ...
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...
- 基于 Aspose.Cells与XML导入excel 数据----操作类封装
前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...
- Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
随机推荐
- 神奇的Kivy,让Python快速开发移动app
随着移动互联网的不断发展,手机.Pad等移动终端已经被普遍使用,充斥在人们的工作.学习和生活中,越来越多的程序都转向移动终端,各类app应用相拥而至. Kivy作为Python的Android和IOS ...
- 纯css画三角形
纯css画三角形与border元素相关 设置border的属性 width: 100px; height: 100px; border-style: solid; border-width: 100p ...
- B站百大UP主党妹被黑客勒索!!!
4月27日,哔哩哔哩视频网站的UP主“机智的党妹”发布消息称,自己被黑客勒索了.她的视频表示:“事发突然,我被勒索了,你也有可能继续被诈骗!这种诈骗的页面是由病毒程序自动生成并留在那里的.”根据她的介 ...
- php表格--大数据处理
参考来源1:https://blog.csdn.net/tim_phper/article/details/77581071 参考来源2:https://blog.csdn.net/qq_376822 ...
- ansible的剧本play(四)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA68AAAETCAYAAADZDzDOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw
- time_t 是不定长的,如果写在superblocck里,要用定长的类型
例如 time_t 变量在32位机上生成,在64位机上读出,这样两个连续的 time_t 变量(例如在结构体中),会变当成一个变量.
- 非阻塞算法(Lock-Free)的实现
目录 非阻塞的栈 非阻塞的链表 非阻塞算法(Lock-Free)的实现 上篇文章我们讲到了使用锁会带来的各种缺点,本文将会讲解如何使用非阻塞算法.非阻塞算法一般会使用CAS来协调线程的操作. 虽然非阻 ...
- webpack插件解析:HtmlWebpackPlugin是干什么的以及如何使用它
HtmlWebpackPlugin是一个出现频率比较高的webpack插件,本文对其作用和配置作一番比较详细的分析(本文的配置均在webpack.config.js中进行). 为何使用它 简单来说,H ...
- OSG程序设计之更新回调
更新回调(Update Callback)涉及到一个类:osg::NodeCallback.这个类重载了函数调用操作符.当回调动作发生时,将会执行这一操作符的内容. 如果节点绑定了更新回调函数,那么在 ...
- go 模板详说
模板是我们常用的手段用于动态生成页面,或者用于代码生成器的编写等.比如把数据库的表映射成go语言的struct,这些体力活,写个代码生成器是最合适不过的了. 示例例把表转成 struct : 当然这篇 ...