package myProject.excelUtil.util;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.math.BigDecimal;
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 java.util.Set;
import jxl.Cell;
import jxl.Sheet;
import myProject.excelUtil.annotation.ExcelBigDecimal;
import myProject.excelUtil.annotation.ExcelBoolean;
import myProject.excelUtil.annotation.ExcelDate;
import myProject.excelUtil.annotation.ExcelField;
import myProject.excelUtil.annotation.ExcelValid;
import myProject.excelUtil.pojo.ExcelHelper;
public class ExcelUtil {
public static ExcelUtil excelUitl = null;
public static ExcelUtil getInstance() {
if (excelUitl == null) {
excelUitl = new ExcelUtil();
}
return excelUitl;
}
/**
* 读取注解值、字段名及字段的类型
*
* @param className
* @return
* @throws Exception
*/
public Map<Integer, ExcelHelper> loadExcelAnnotationFieldVlaue(Class<?> className) throws Exception {
Map<String, ExcelHelper> temp = new HashMap<String, ExcelHelper>();
Field[] fields = className.getDeclaredFields();
for (Field field : fields) {
if (!field.getName().equals("serialVersionUID")) {
if (!field.isAccessible())
field.setAccessible(true);
ExcelHelper helper = new ExcelHelper();
Type type = field.getGenericType();
if (type instanceof Class<?>) {
Class<?> cls = (Class<?>) type;
helper.setClazz(cls);
}
helper.setFieldName(field.getName());
temp.put(field.getName(), helper);
Annotation[] ans = field.getAnnotations();
for (Annotation annotation : ans) {
if (annotation.annotationType().equals(ExcelField.class)) {
ExcelField fd = field.getAnnotation(ExcelField.class);
temp.get(field.getName()).setSort(fd.sort());
temp.get(field.getName()).setName(fd.name());
temp.get(field.getName()).setNullable(fd.nullable());
} else if (annotation.annotationType().equals(ExcelBoolean.class)) {
ExcelBoolean fd = field.getAnnotation(ExcelBoolean.class);
temp.get(field.getName()).setFalseName(fd.False().toString());
temp.get(field.getName()).setTrueName(fd.True().toString());
} else if (annotation.annotationType().equals(ExcelDate.class)) {
ExcelDate fd = field.getAnnotation(ExcelDate.class);
temp.get(field.getName()).setFormat(fd.format());
} else if (annotation.annotationType().equals(ExcelValid.class)) {
ExcelValid fd = field.getAnnotation(ExcelValid.class);
temp.get(field.getName()).setRegexp(fd.regexp());
} else if (annotation.annotationType().equals(ExcelBigDecimal.class)) {
ExcelBigDecimal fd = field.getAnnotation(ExcelBigDecimal.class);
temp.get(field.getName()).setScale(fd.scale());
}
}
}
}
Map<Integer, ExcelHelper> map = new HashMap<>();
for (Map.Entry<String, ExcelHelper> m : temp.entrySet()) {
map.put(m.getValue().getSort(), m.getValue());
}
return map;
}
/**
* 获取Excel显示的中文名及排列的顺序
*
* @param className
* @return
*/
public Map<Integer, String> getExcelFieldName(Class<?> className) {
Map<Integer, String> map = new HashMap<Integer, String>();
Field[] fields = className.getDeclaredFields();
for (Field field : fields) {
if (!field.getName().equals("serialVersionUID")) {
if (field.isAnnotationPresent(ExcelField.class)) {
ExcelField fd = field.getAnnotation(ExcelField.class);
if (!field.isAccessible())
field.setAccessible(true);
map.put(fd.sort(), fd.name());
}
}
}
return map;
}
/**
* 比较Excel的头字段与实体类的showname数量、名称及顺序是否一致
*
* @param sheet
* @param map
* @return
*/
public boolean equalsArrays(Sheet sheet, Map<Integer, String> map) {
boolean check = true;
for (int k = 0; k < sheet.getColumns(); k++) {
if (!sheet.getCell(k, 0).getContents().equals(map.get(k))) {
check = false;
break;
}
}
return check;
}
/**
* 校验实体类与Excel的字段是否是相同类型
*
* @param sheet
* @param clazz
* @return
* @throws Exception
*/
public String checkExcelContent(Sheet sheet, Class<?> clazz) throws Exception {
StringBuilder result = new StringBuilder();
result.append("");
int size = sheet.getRows();
Cell[] heads = sheet.getRow(0);
Map<Integer, ExcelHelper> map = loadExcelAnnotationFieldVlaue(clazz);
for (int i = 1; i < size; i++) {
Cell[] cells = sheet.getRow(i);
int len = cells.length;
for (int j = 0; j < len; j++) {
boolean warnning = false;
ExcelHelper helper = map.get(j);
// 判断字段内容是否为非空字段
if (!helper.isNullable()) {
if (!Validator.isEffective(cells[j].getContents())) {
warnning = true;
}
}
if (!warnning) {
// 判断字段注解是否存在规则过滤
if (Validator.isEffective(cells[j].getContents())) {
if (Validator.isEffective(helper.getRegexp())) {
if (!Validator.match(helper.getRegexp(), cells[j].getContents())) {
warnning = true;
}
}
}
}
if (!warnning) {
if (Date.class.isAssignableFrom(helper.getClazz())) {
if (Validator.isEffective(cells[j].getContents())) {
if (!Validator.isValidDate(cells[j].getContents(), helper.getFormat())) {
warnning = true;
}
}
} else if (Boolean.class.isAssignableFrom(helper.getClazz())) {
if (!(cells[j].getContents().equals(helper.getFalseName())
|| cells[j].getContents().equals(helper.getTrueName()))) {
warnning = true;
}
} else if (Integer.class.isAssignableFrom(helper.getClazz())) {
if (!Validator.IsNumber(cells[j].getContents())) {
warnning = true;
}
} else if (BigDecimal.class.isAssignableFrom(helper.getClazz())) {
String regexp = "^[+-]?[0-9]+(.[0-9]{1," + (helper.getScale() != null ? helper.getScale() : 2)
+ "})?$";
if (!(Validator.match(regexp, cells[j].getContents()))) {
warnning = true;
}
}
}
if (warnning) {
if (result.toString().indexOf(heads[j].getContents()) == -1) {
result.append("[" + heads[j].getContents() + "]").append(",");
}
}
}
}
return result.toString();
}
/**
* 将Excel的内容转换成实体类
*
* @param sheet
* @param clazz
* @return
* @throws Exception
*/
public <T> List<T> importExcelToEntity(Sheet sheet, Class<T> clazz) throws Exception {
List<T> list = new ArrayList<>();
Map<Integer, ExcelHelper> map = loadExcelAnnotationFieldVlaue(clazz);
int size = sheet.getRows();
for (int i = 1; i < size; i++) {
Cell[] cells = sheet.getRow(i);
int len = cells.length;
T t = (T) clazz.newInstance();
for (int j = 0; j < len; j++) {
ExcelHelper helper = map.get(j);
Field f = t.getClass().getDeclaredField(helper.getFieldName());
if (!f.isAccessible())
f.setAccessible(true);
if (Date.class.isAssignableFrom(helper.getClazz())) {
if (Validator.isEffective(cells[j].getContents())) {
f.set(t, new SimpleDateFormat(helper.getFormat()).parse(cells[j].getContents().toString()));
} else {
f.set(t, null);
}
} else if (BigDecimal.class.isAssignableFrom(helper.getClazz())) {
f.set(t, BigDecimal.valueOf(Double.valueOf(cells[j].getContents().toString()))
.setScale(helper.getScale() != null ? helper.getScale() : 2, BigDecimal.ROUND_HALF_UP));
} else if (Boolean.class.isAssignableFrom(helper.getClazz())) {
f.set(t, cells[j].getContents().toString().equals(helper.getTrueName()) ? true : false);
} else if (String.
没有合适的资源?快使用搜索试试~ 我知道了~
Excel导入导及动态验证
共48个文件
java:13个
class:13个
xls:6个
需积分: 50 11 下载量 132 浏览量
2017-11-21
16:02:51
上传
评论
收藏 102KB RAR 举报
温馨提示
使用jxl实现poi简单的功能,通过反射原理动态验证内容及导入导出excel文件
资源推荐
资源详情
资源评论
收起资源包目录
ExcelUtil.rar (48个子文件)
ExcelUtil
.project 922B
mvnw.cmd 5KB
mvnw 6KB
src
test
java
myProject
excelUtil
ExcelUtilApplicationTests.java 339B
main
resources
application.properties 0B
java
myProject
excelUtil
pojo
OrderForm.java 2KB
ExcelEnum.java 346B
ExcelHelper.java 2KB
annotation
ExcelBoolean.java 403B
ExcelDate.java 330B
ExcelValid.java 331B
ExcelField.java 385B
ExcelBigDecimal.java 344B
ExcelUtilApplication.java 317B
util
ExcelUtil.java 10KB
Validator.java 1KB
test
export.xls 28KB
Test.java 6KB
import_fail.xls 23KB
import.xls 23KB
target
classes
application.properties 0B
META-INF
MANIFEST.MF 329B
maven
david.mygithub
david_github
pom.properties 228B
pom.xml 3KB
myProject
excelUtil
pojo
ExcelEnum.class 1KB
ExcelHelper.class 3KB
OrderForm.class 3KB
annotation
ExcelBoolean.class 479B
ExcelDate.class 441B
ExcelField.class 521B
ExcelBigDecimal.class 469B
ExcelValid.class 443B
util
Validator.class 2KB
ExcelUtil.class 12KB
test
export.xls 28KB
import_fail.xls 23KB
import.xls 23KB
Test.class 8KB
ExcelUtilApplication.class 724B
test-classes
myProject
excelUtil
ExcelUtilApplicationTests.class 643B
.settings
org.eclipse.m2e.core.prefs 97B
org.eclipse.jdt.core.prefs 243B
org.eclipse.core.resources.prefs 155B
.mvn
wrapper
maven-wrapper.jar 46KB
maven-wrapper.properties 110B
pom.xml 3KB
.classpath 1KB
.gitignore 249B
共 48 条
- 1
资源评论
davidxiang007
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功