import com.google.common.base.Strings;
import com.jianwu.util.excel.annotation.ExcelAttribute;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by tookbra on 2016/4/6.
*/
public class ExcelUtil {
private static final Log log = LogFactory.getLog(ExcelUtil.class); public static <T> List<T> importExcel(Class<T> clazz, HSSFWorkbook wb, String sheetName) {
int maxCol = 0;
List<T> list = new ArrayList<T>();
List<T> errorList = new ArrayList<T>(); if(Strings.isNullOrEmpty(sheetName)) {
//没有制定sheet返回null
return null;
}
HSSFSheet sheet = wb.getSheet(sheetName);
if(!sheetName.trim().equals("")) {
// 获取指定sheet
sheet = wb.getSheet(sheetName);
} int rows = sheet.getPhysicalNumberOfRows();
try {
if (rows > 0) {
List<Field> allFields = getMappedFiled(clazz, null); Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
for (Field field : allFields) {
// 将有注解的field存放到map中.
if (field.isAnnotationPresent(ExcelAttribute.class)) {
ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
int col = getExcelCol(attr.column());// 获得列号
maxCol = Math.max(col, maxCol);
field.setAccessible(true);// 设置类的私有字段属性可访问.
fieldsMap.put(col, field);
}
}
for (int i = 2; i < rows; i++) {// 从第3行开始取数据,默认第一行是表头.
HSSFRow row = sheet.getRow(i);
int cellNum = maxCol;
T entity = null;
for (int j = 0; j < cellNum; j++) {
String errorMsg = "";
HSSFCell cell = row.getCell(j);
if (cell == null) {
continue;
}
int cellType = cell.getCellType();
String c = "";
if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
c = String.valueOf(cell.getNumericCellValue());
} else if (cellType == HSSFCell.CELL_TYPE_BOOLEAN) {
c = String.valueOf(cell.getBooleanCellValue());
} else {
c = cell.getStringCellValue();
}
if (c == null || c.equals("")) {
continue;
}
entity = (entity == null ? clazz.newInstance() : entity);// 如果不存在实例则新建.
// System.out.println(cells[j].getContents());
Field field = fieldsMap.get(j);// 从map中得到对应列的field. if (field == null) {
continue;
} // 取得类型,并根据对象类型设置值.
Class<?> fieldType = field.getType();
if (String.class == fieldType) {
field.set(entity, String.valueOf(c));
} else if ((Integer.TYPE == fieldType)
|| (Integer.class == fieldType)) {
field.set(entity, Integer.parseInt(c));
} else if ((Long.TYPE == fieldType)
|| (Long.class == fieldType)) {
field.set(entity, Long.valueOf(c));
} else if ((Float.TYPE == fieldType)
|| (Float.class == fieldType)) {
field.set(entity, Float.valueOf(c));
} else if ((Short.TYPE == fieldType)
|| (Short.class == fieldType)) {
field.set(entity, Short.valueOf(c));
} else if ((Double.TYPE == fieldType)
|| (Double.class == fieldType)) {
field.set(entity, Double.valueOf(c));
} else if (Character.TYPE == fieldType) {
if ((c != null) && (c.length() > 0)) {
field.set(entity, Character
.valueOf(c.charAt(0)));
}
}
}
if (entity != null) {
list.add(entity);
}
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("[importExcel]: {}", e);
}
return list;
} private static List<Field> getMappedFiled(Class clazz, List<Field> fields) {
if (fields == null) {
fields = new ArrayList<Field>();
} Field[] allFields = clazz.getDeclaredFields();
// 所有field并存放到一个list中.
for (Field field : allFields) {
if (field.isAnnotationPresent(ExcelAttribute.class)) {
fields.add(field);
}
}
if (clazz.getSuperclass() != null
&& !clazz.getSuperclass().equals(Object.class)) {
getMappedFiled(clazz.getSuperclass(), fields);
} return fields;
} /**
* 将EXCEL中A,B,C,D,E列映射成0,1,2,3
*
* @param col
*/
public static int getExcelCol(String col) {
col = col.toUpperCase();
// 从-1开始计算,字母重1开始运算。这种总数下来算数正好相同。
int count = -1;
char[] cs = col.toCharArray();
for (int i = 0; i < cs.length; i++) {
count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
}
return count;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、
import com.jianwu.util.excel.RegexType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by tookbra on 2016/4/7.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelAttribute {
/**
* 标题, 该列名对应Excel中第一列的内容
*/
String value() default ""; /**
* 该列是否必须
*/
boolean required() default false; /**
* 列名
* @return
*/
String column(); /**
* 正则表达式校验规则
*
* @return
*/
RegexType regexType() default RegexType.NONE; /**
* 正则规则校验失败错误提示信息
*
* @return
*/
String regexpErrorMessage() default ""; public abstract boolean isExport() default true;
}
、、、、、、、、、、、、、、、、、、、、
/**
* 将EXCEL中A,B,C,D,E列映射成0,1,2,3
*
* @param col
*/
public static int getExcelCol(String col) {
col = col.toUpperCase();
// 从-1开始计算,字母从1开始运算。这种总数下来算数正好相同。
int count = -1;
char[] cs = col.toCharArray();
for (int i = 0; i < cs.length; i++) {
count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
}
return count;
}
、、、、、、、、、、、、、、、
import com.google.common.base.Strings;
import com.jianwu.util.RegexUtils;
import com.jianwu.util.excel.annotation.ExcelAttribute;
import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; /**
* Created by tookbra on 2016/4/7.
*/
public class ExcelValidate {
private static ExcelAttribute excelAttribute; public static String valid(Object object) throws Exception{
//获取object的类型
Class<? extends Object> clazz=object.getClass();
//获取该类型声明的成员
Field[] fields = clazz.getDeclaredFields();
//遍历属性
for(Field field:fields){
//对于private私有化的成员变量,通过setAccessible来修改器访问权限
field.setAccessible(true);
String errorMsg = validate(field,object);
//重新设置会私有权限
field.setAccessible(false);
if(Strings.isNullOrEmpty(errorMsg)) {
continue;
}
return errorMsg;
}
return null;
} public static String validate(Field field,Object object) throws Exception{
String description;
Object value;
//获取对象的成员的注解信息
excelAttribute = field.getAnnotation(ExcelAttribute.class);
value = field.get(object);
if(excelAttribute == null) {
return "";
} else {
description = excelAttribute.value();
} if(excelAttribute.required()){
if(value == null || StringUtils.isBlank(value.toString())){
return description + "不能为空";
}
} if(excelAttribute.regexType() != RegexType.NONE){
switch (excelAttribute.regexType()) {
case NONE:
break;
case SPECIALCHAR:
if(RegexUtils.hasSpecialChar(value.toString())){
return excelAttribute.regexpErrorMessage();
}
break;
case EMAIL:
if(!RegexUtils.isEmail(value.toString())){
return excelAttribute.regexpErrorMessage();
}
break;
case IP:
if(!RegexUtils.isIp(value.toString())){
return excelAttribute.regexpErrorMessage();
}
break;
case NUMBER:
if(!RegexUtils.isNumber(value.toString())){
return excelAttribute.regexpErrorMessage();
}
break;
case PHONENUMBER:
if(!RegexUtils.isPhoneNumber(value.toString())){
return excelAttribute.regexpErrorMessage();
}
break;
default:
break;
}
}
return null;
}
}
、、、、、、、、、、、、、、、、
package com.jianwu.util.excel;

/**
* Created by tookbra on 2016/4/7.
*/
public enum RegexType {
NONE,
SPECIALCHAR,
EMAIL,
IP,
NUMBER,
PHONENUMBER;
}
、、、、、、、、、、、、、、、、、、、、

import com.google.common.base.Strings;
import com.jianwu.util.excel.annotation.ExcelAttribute;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by tookbra on 2016/4/6.
*/
public class ExcelUtil {
private static final Log log = LogFactory.getLog(ExcelUtil.class); public static <T> List<T> importExcel(Class<T> clazz, HSSFWorkbook wb, String sheetName) {
int maxCol = 0;
List<T> list = new ArrayList<T>();
List<T> errorList = new ArrayList<T>(); if(Strings.isNullOrEmpty(sheetName)) {
//没有制定sheet返回null
return null;
}
HSSFSheet sheet = wb.getSheet(sheetName);
if(!sheetName.trim().equals("")) {
// 获取指定sheet
sheet = wb.getSheet(sheetName);
} int rows = sheet.getPhysicalNumberOfRows();
try {
if (rows > 0) {
List<Field> allFields = getMappedFiled(clazz, null); Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
for (Field field : allFields) {
// 将有注解的field存放到map中.
if (field.isAnnotationPresent(ExcelAttribute.class)) {
ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
int col = getExcelCol(attr.column());// 获得列号
maxCol = Math.max(col, maxCol);
field.setAccessible(true);// 设置类的私有字段属性可访问.
fieldsMap.put(col, field);
}
}
for (int i = 2; i < rows; i++) {// 从第3行开始取数据,默认第一行是表头.
HSSFRow row = sheet.getRow(i);
int cellNum = maxCol;
T entity = null;
for (int j = 0; j < cellNum; j++) {
String errorMsg = "";
HSSFCell cell = row.getCell(j);
if (cell == null) {
continue;
}
int cellType = cell.getCellType();
String c = "";
if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
c = String.valueOf(cell.getNumericCellValue());
} else if (cellType == HSSFCell.CELL_TYPE_BOOLEAN) {
c = String.valueOf(cell.getBooleanCellValue());
} else {
c = cell.getStringCellValue();
}
if (c == null || c.equals("")) {
continue;
}
entity = (entity == null ? clazz.newInstance() : entity);// 如果不存在实例则新建.
// System.out.println(cells[j].getContents());
Field field = fieldsMap.get(j);// 从map中得到对应列的field. if (field == null) {
continue;
} // 取得类型,并根据对象类型设置值.
Class<?> fieldType = field.getType();
if (String.class == fieldType) {
field.set(entity, String.valueOf(c));
} else if ((Integer.TYPE == fieldType)
|| (Integer.class == fieldType)) {
field.set(entity, Integer.parseInt(c));
} else if ((Long.TYPE == fieldType)
|| (Long.class == fieldType)) {
field.set(entity, Long.valueOf(c));
} else if ((Float.TYPE == fieldType)
|| (Float.class == fieldType)) {
field.set(entity, Float.valueOf(c));
} else if ((Short.TYPE == fieldType)
|| (Short.class == fieldType)) {
field.set(entity, Short.valueOf(c));
} else if ((Double.TYPE == fieldType)
|| (Double.class == fieldType)) {
field.set(entity, Double.valueOf(c));
} else if (Character.TYPE == fieldType) {
if ((c != null) && (c.length() > 0)) {
field.set(entity, Character
.valueOf(c.charAt(0)));
}
}
}
if (entity != null) {
list.add(entity);
}
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("[importExcel]: {}", e);
}
return list;
} private static List<Field> getMappedFiled(Class clazz, List<Field> fields) {
if (fields == null) {
fields = new ArrayList<Field>();
} Field[] allFields = clazz.getDeclaredFields();
// 所有field并存放到一个list中.
for (Field field : allFields) {
if (field.isAnnotationPresent(ExcelAttribute.class)) {
fields.add(field);
}
}
if (clazz.getSuperclass() != null
&& !clazz.getSuperclass().equals(Object.class)) {
getMappedFiled(clazz.getSuperclass(), fields);
} return fields;
} /**
* 将EXCEL中A,B,C,D,E列映射成0,1,2,3
*
* @param col
*/
public static int getExcelCol(String col) {
col = col.toUpperCase();
// 从-1开始计算,字母重1开始运算。这种总数下来算数正好相同。
int count = -1;
char[] cs = col.toCharArray();
for (int i = 0; i < cs.length; i++) {
count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
}
return count;
}
}

ExcelUtil工具类的更多相关文章

  1. Excelutil 工具类

    1.说明:ExcelUtil主要用于获得单元格的数据和对对指定单元格中写入数据用! 相关代码如下: package main.java; import java.io.File; import jav ...

  2. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  3. java常用工具类(三)

    一.连接数据库的综合类 package com.itjh.javaUtil; import java.sql.Connection; import java.sql.DriverManager; im ...

  4. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  5. 导入导出Excel的Java工具类ExcelUtil

    在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单 ...

  6. 【原创】POI操作Excel导入导出工具类ExcelUtil

    关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...

  7. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  8. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  9. 使用POI插件,提取导出excel的工具类

    在网站的不同的模块都需要使用到导入导出excel的功能,我们就需要写一个通用的工具类ExcelUtil. 我的思路:首先,导入和导出的Excel的文件格式固定:主标题,二级标题,数据行(姑且就这么叫) ...

随机推荐

  1. StarRTC , AndroidThings , 树莓派小车,公网环境,视频遥控(一)准备工作

    原文地址:http://blog.starrtc.com/?p=48 啥也不说,先来个视频看看效果 视频播放器     00:00   00:54     概述为了体现StarRTC的实时音视频传输能 ...

  2. xshell用ssh连接VMware中的ubuntu

    SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo apt-ge ...

  3. anroid 广播

    广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroa ...

  4. Javascript中最常用的61个经典技巧[转]

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...

  5. JavaScript裸体识别技术

    当第一次听说nude.js的时候,我非常怀疑这种浏览器端的裸体识别技术,有几个理由: 正常情况下,裸体识别应该在服务器端进行,这样,那些色情图片或色情视频才能在发送给浏览者前被发现. 我不相信完全依赖 ...

  6. ElasticSearch使用代码

    package elasticsearch01; import static org.junit.Assert.*; import java.util.HashMap; import java.uti ...

  7. 重复数据删除 开源实现 (deduputil) (转)

    [dedup util] dedup util是一款开源的轻量级文件打包工具,它基于块级的重复数据删除技术,可以有效缩减数据容量,节省用户存储空间.目前已经在Sourceforge上创建项目,并且源码 ...

  8. chrome 常用快捷键(可以摆脱鼠标哦)

      Ctrl+N                                打开新窗口. Ctrl+T                                打开新标签页. Ctrl+Sh ...

  9. python中常用的内建模块

    [datetime] datetime是python处理日期和时间的标准库 获取当前日期和时间 我们先看如何获取当前日期和时间: 注意到datetime是模块,datetime模块还包含一个datet ...

  10. 什么是事务(transaction)?它有什么好处

    为了完成对数据的操作,企业应用经常要求并发访问在多个构件之间共享的数据.这些应用在下列条件下应该维护数据的完整性(由应用的商务规则来定义): 分布式访问一个单独的数据资源,以及从一个单独的应用构件访问 ...