但是不支持图片,同时工解析,让大家可以自己解析数据4.1.3.A
@@ -25,6 +25,10 @@ | |||
<groupId>org.apache.poi</groupId> | |||
<artifactId>poi-scratchpad</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>xerces</groupId> | |||
<artifactId>xerces</artifactId> | |||
</dependency> | |||
<!-- google 工具类 --> | |||
<dependency> | |||
@@ -9,6 +9,8 @@ import java.util.List; | |||
import org.jeecgframework.poi.excel.entity.ImportParams; | |||
import org.jeecgframework.poi.excel.entity.result.ExcelImportResult; | |||
import org.jeecgframework.poi.excel.imports.ExcelImportServer; | |||
import org.jeecgframework.poi.excel.imports.sax.SaxReadExcel; | |||
import org.jeecgframework.poi.excel.imports.sax.parse.ISaxRowRead; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -40,12 +42,12 @@ public class ExcelImportUtil { | |||
in = new FileInputStream(file); | |||
result = new ExcelImportServer().importExcelByIs(in, pojoClass, params).getList(); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(),e); | |||
LOGGER.error(e.getMessage(), e); | |||
} finally { | |||
try { | |||
in.close(); | |||
} catch (IOException e) { | |||
LOGGER.error(e.getMessage(),e); | |||
LOGGER.error(e.getMessage(), e); | |||
} | |||
} | |||
return result; | |||
@@ -60,8 +62,8 @@ public class ExcelImportUtil { | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public static <T> List<T> importExcelByIs(InputStream inputstream, Class<?> pojoClass, | |||
ImportParams params) throws Exception { | |||
public static <T> List<T> importExcel(InputStream inputstream, Class<?> pojoClass, | |||
ImportParams params) throws Exception { | |||
return new ExcelImportServer().importExcelByIs(inputstream, pojoClass, params).getList(); | |||
} | |||
@@ -74,9 +76,8 @@ public class ExcelImportUtil { | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public static ExcelImportResult importExcelByIsAndVerify(InputStream inputstream, | |||
Class<?> pojoClass, ImportParams params) | |||
throws Exception { | |||
public static ExcelImportResult importExcelVerify(InputStream inputstream, Class<?> pojoClass, | |||
ImportParams params) throws Exception { | |||
return new ExcelImportServer().importExcelByIs(inputstream, pojoClass, params); | |||
} | |||
@@ -96,15 +97,75 @@ public class ExcelImportUtil { | |||
in = new FileInputStream(file); | |||
return new ExcelImportServer().importExcelByIs(in, pojoClass, params); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(),e); | |||
LOGGER.error(e.getMessage(), e); | |||
} finally { | |||
try { | |||
in.close(); | |||
} catch (IOException e) { | |||
LOGGER.error(e.getMessage(),e); | |||
LOGGER.error(e.getMessage(), e); | |||
} | |||
} | |||
return null; | |||
} | |||
/** | |||
* Excel 通过SAX解析方法,适合大数据导入,不支持图片 | |||
* 导入 数据源本地文件,不返回校验结果 导入 字 段类型 Integer,Long,Double,Date,String,Boolean | |||
* | |||
* @param file | |||
* @param pojoClass | |||
* @param params | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public static <T> List<T> importExcelBySax(File file, Class<?> pojoClass, ImportParams params) { | |||
return new SaxReadExcel().readExcel(file, pojoClass, params, null); | |||
} | |||
/** | |||
* Excel 通过SAX解析方法,适合大数据导入,不支持图片 | |||
* 导入 数据源IO流,不返回校验结果 导入 字段类型 Integer,Long,Double,Date,String,Boolean | |||
* | |||
* @param file | |||
* @param pojoClass | |||
* @param params | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public static <T> List<T> importExcelBySax(InputStream inputstream, Class<?> pojoClass, | |||
ImportParams params) throws Exception { | |||
return new SaxReadExcel().readExcel(inputstream, pojoClass, params, null); | |||
} | |||
/** | |||
* Excel 通过SAX解析方法,适合大数据导入,不支持图片 | |||
* 导入 数据源本地文件,不返回校验结果 导入 字 段类型 Integer,Long,Double,Date,String,Boolean | |||
* | |||
* @param file | |||
* @param pojoClass | |||
* @param params | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public static <T> List<T> importExcelBySax(File file, Class<?> pojoClass, ImportParams params, | |||
ISaxRowRead rowRead) { | |||
return new SaxReadExcel().readExcel(file, pojoClass, params, rowRead); | |||
} | |||
/** | |||
* Excel 通过SAX解析方法,适合大数据导入,不支持图片 | |||
* 导入 数据源IO流,不返回校验结果 导入 字段类型 Integer,Long,Double,Date,String,Boolean | |||
* | |||
* @param file | |||
* @param pojoClass | |||
* @param params | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public static <T> List<T> importExcelBySax(InputStream inputstream, Class<?> pojoClass, | |||
ImportParams params, ISaxRowRead rowRead) | |||
throws Exception { | |||
return new SaxReadExcel().readExcel(inputstream, pojoClass, params, rowRead); | |||
} | |||
} |
@@ -38,4 +38,9 @@ public class SaxReadCellEntity { | |||
this.value = value; | |||
} | |||
@Override | |||
public String toString() { | |||
return "[type=" + cellType.toString() + ",value=" + value + "]"; | |||
} | |||
} |
@@ -20,7 +20,6 @@ import org.jeecgframework.poi.excel.entity.enmus.ExcelType; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; | |||
import org.jeecgframework.poi.excel.export.base.ExcelExportBase; | |||
import org.jeecgframework.poi.excel.export.styler.ExcelExportStylerDefaultImpl; | |||
import org.jeecgframework.poi.excel.export.styler.IExcelExportStyler; | |||
import org.jeecgframework.poi.exception.excel.ExcelExportException; | |||
import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; | |||
@@ -13,6 +13,7 @@ import java.util.Map; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.poi.ss.usermodel.Cell; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity; | |||
import org.jeecgframework.poi.excel.entity.sax.SaxReadCellEntity; | |||
import org.jeecgframework.poi.exception.excel.ExcelImportException; | |||
import org.jeecgframework.poi.exception.excel.enums.ExcelImportEnum; | |||
import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | |||
@@ -28,7 +29,7 @@ import org.slf4j.LoggerFactory; | |||
*/ | |||
public class CellValueServer { | |||
private static final Logger logger = LoggerFactory.getLogger(CellValueServer.class); | |||
private static final Logger LOGGER = LoggerFactory.getLogger(CellValueServer.class); | |||
private List<String> hanlderList = null; | |||
@@ -79,7 +80,7 @@ public class CellValueServer { | |||
try { | |||
return format.parse(value); | |||
} catch (ParseException e) { | |||
logger.error("时间格式化失败,格式化:{},值:{}", entity.getFormat(), value); | |||
LOGGER.error("时间格式化失败,格式化:{},值:{}", entity.getFormat(), value); | |||
throw new ExcelImportException(ExcelImportEnum.GET_VALUE_ERROR); | |||
} | |||
} | |||
@@ -108,6 +109,29 @@ public class CellValueServer { | |||
return getValueByType(xclass, result); | |||
} | |||
/** | |||
* 获取cell值 | |||
* @param dataHanlder | |||
* @param object | |||
* @param entity | |||
* @param excelParams | |||
* @param titleString | |||
* @return | |||
*/ | |||
public Object getValue(IExcelDataHandler dataHanlder, Object object, | |||
SaxReadCellEntity cellEntity, | |||
Map<String, ExcelImportEntity> excelParams, String titleString) { | |||
ExcelImportEntity entity = excelParams.get(titleString); | |||
Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 ? entity | |||
.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | |||
Type[] ts = setMethod.getGenericParameterTypes(); | |||
String xclass = ts[0].toString(); | |||
Object result = cellEntity.getValue(); | |||
result = replaceValue(entity.getReplace(), result); | |||
result = hanlderValue(dataHanlder, object, result, titleString); | |||
return getValueByType(xclass, result); | |||
} | |||
/** | |||
* 根据返回类型获取返回值 | |||
* | |||
@@ -140,6 +164,7 @@ public class CellValueServer { | |||
} | |||
return result; | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(),e); | |||
throw new ExcelImportException(ExcelImportEnum.GET_VALUE_ERROR); | |||
} | |||
} | |||
@@ -39,6 +39,7 @@ import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelVerifyEntity; | |||
import org.jeecgframework.poi.excel.entity.result.ExcelImportResult; | |||
import org.jeecgframework.poi.excel.entity.result.ExcelVerifyHanlderResult; | |||
import org.jeecgframework.poi.excel.imports.base.ImportBaseService; | |||
import org.jeecgframework.poi.excel.imports.verifys.VerifyHandlerServer; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
import org.slf4j.Logger; | |||
@@ -51,7 +52,7 @@ import org.slf4j.LoggerFactory; | |||
* @date 2014年6月26日 下午9:20:51 | |||
*/ | |||
@SuppressWarnings({ "rawtypes", "unchecked", "hiding" }) | |||
public class ExcelImportServer { | |||
public class ExcelImportServer extends ImportBaseService { | |||
private final static Logger LOGGER = LoggerFactory.getLogger(ExcelImportServer.class); | |||
@@ -66,39 +67,6 @@ public class ExcelImportServer { | |||
this.verifyHandlerServer = new VerifyHandlerServer(); | |||
} | |||
/** | |||
* 把这个注解解析放到类型对象中 | |||
* | |||
* @param targetId | |||
* @param field | |||
* @param excelEntity | |||
* @param pojoClass | |||
* @param getMethods | |||
* @param temp | |||
* @throws Exception | |||
*/ | |||
private void addEntityToMap(String targetId, Field field, ExcelImportEntity excelEntity, | |||
Class<?> pojoClass, List<Method> getMethods, | |||
Map<String, ExcelImportEntity> temp) throws Exception { | |||
Excel excel = field.getAnnotation(Excel.class); | |||
excelEntity = new ExcelImportEntity(); | |||
excelEntity.setType(excel.type()); | |||
excelEntity.setSaveUrl(excel.savePath()); | |||
excelEntity.setSaveType(excel.imageType()); | |||
excelEntity.setReplace(excel.replace()); | |||
excelEntity.setDatabaseFormat(excel.databaseFormat()); | |||
excelEntity.setVerify(getImportVerify(field)); | |||
getExcelField(targetId, field, excelEntity, excel, pojoClass); | |||
if (getMethods != null) { | |||
List<Method> newMethods = new ArrayList<Method>(); | |||
newMethods.addAll(getMethods); | |||
newMethods.add(excelEntity.getMethod()); | |||
excelEntity.setMethods(newMethods); | |||
} | |||
temp.put(excelEntity.getName(), excelEntity); | |||
} | |||
/*** | |||
* 向List里面继续添加元素 | |||
* | |||
@@ -138,141 +106,6 @@ public class ExcelImportServer { | |||
} | |||
} | |||
/** | |||
* 获取需要导出的全部字段 | |||
* | |||
* | |||
* @param exclusions | |||
* @param targetId | |||
* 目标ID | |||
* @param fields | |||
* @param excelCollection | |||
* @throws Exception | |||
*/ | |||
private void getAllExcelField(String targetId, Field[] fields, | |||
Map<String, ExcelImportEntity> excelParams, | |||
List<ExcelCollectionParams> excelCollection, Class<?> pojoClass, | |||
List<Method> getMethods) throws Exception { | |||
ExcelImportEntity excelEntity = null; | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
if (POIPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
continue; | |||
} | |||
if (POIPublicUtil.isCollection(field.getType())) { | |||
// 集合对象设置属性 | |||
ExcelCollectionParams collection = new ExcelCollectionParams(); | |||
collection.setName(field.getName()); | |||
Map<String, ExcelImportEntity> temp = new HashMap<String, ExcelImportEntity>(); | |||
ParameterizedType pt = (ParameterizedType) field.getGenericType(); | |||
Class<?> clz = (Class<?>) pt.getActualTypeArguments()[0]; | |||
collection.setType(clz); | |||
getExcelFieldList(targetId, POIPublicUtil.getClassFields(clz), clz, temp, null); | |||
collection.setExcelParams(temp); | |||
excelCollection.add(collection); | |||
} else if (POIPublicUtil.isJavaClass(field)) { | |||
addEntityToMap(targetId, field, excelEntity, pojoClass, getMethods, excelParams); | |||
} else { | |||
List<Method> newMethods = new ArrayList<Method>(); | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods.add(POIPublicUtil.getMethod(field.getName(), pojoClass)); | |||
getAllExcelField(targetId, POIPublicUtil.getClassFields(field.getType()), | |||
excelParams, excelCollection, field.getType(), newMethods); | |||
} | |||
} | |||
} | |||
private void getExcelField(String targetId, Field field, ExcelImportEntity excelEntity, | |||
Excel excel, Class<?> pojoClass) throws Exception { | |||
excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
String fieldname = field.getName(); | |||
excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass, field.getType())); | |||
if (StringUtils.isEmpty(excel.importFormat())) { | |||
excelEntity.setFormat(excel.format()); | |||
} else { | |||
excelEntity.setFormat(excel.importFormat()); | |||
} | |||
} | |||
private void getExcelFieldList(String targetId, Field[] fields, Class<?> pojoClass, | |||
Map<String, ExcelImportEntity> temp, List<Method> getMethods) | |||
throws Exception { | |||
ExcelImportEntity excelEntity = null; | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
if (POIPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
continue; | |||
} | |||
if (POIPublicUtil.isJavaClass(field)) { | |||
addEntityToMap(targetId, field, excelEntity, pojoClass, getMethods, temp); | |||
} else { | |||
List<Method> newMethods = new ArrayList<Method>(); | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods | |||
.add(POIPublicUtil.getMethod(field.getName(), pojoClass, field.getType())); | |||
getExcelFieldList(targetId, POIPublicUtil.getClassFields(field.getType()), | |||
field.getType(), temp, newMethods); | |||
} | |||
} | |||
} | |||
/** | |||
* 判断在这个单元格显示的名称 | |||
* | |||
* @param exportName | |||
* @param targetId | |||
* @return | |||
*/ | |||
private String getExcelName(String exportName, String targetId) { | |||
if (exportName.indexOf("_") < 0) { | |||
return exportName; | |||
} | |||
String[] arr = exportName.split(","); | |||
for (String str : arr) { | |||
if (str.indexOf(targetId) != -1) { | |||
return str.split("_")[0]; | |||
} | |||
} | |||
return null; | |||
} | |||
private Object getFieldBySomeMethod(List<Method> list, Object t) throws Exception { | |||
Method m; | |||
for (int i = 0; i < list.size() - 1; i++) { | |||
m = list.get(i); | |||
t = m.invoke(t, new Object[] {}); | |||
} | |||
return t; | |||
} | |||
/** | |||
* 获取导入校验参数 | |||
* | |||
* @param field | |||
* @return | |||
*/ | |||
private ExcelVerifyEntity getImportVerify(Field field) { | |||
ExcelVerify verify = field.getAnnotation(ExcelVerify.class); | |||
if (verify != null) { | |||
ExcelVerifyEntity entity = new ExcelVerifyEntity(); | |||
entity.setEmail(verify.isEmail()); | |||
entity.setInterHandler(verify.interHandler()); | |||
entity.setMaxLength(verify.maxLength()); | |||
entity.setMinLength(verify.minLength()); | |||
entity.setMobile(verify.isMobile()); | |||
entity.setNotNull(verify.notNull()); | |||
entity.setRegex(verify.regex()); | |||
entity.setRegexTip(verify.regexTip()); | |||
entity.setTel(verify.isTel()); | |||
return entity; | |||
} | |||
return null; | |||
} | |||
/** | |||
* 获取key的值,针对不同类型获取不同的值 | |||
* | |||
@@ -297,23 +130,6 @@ public class ExcelImportServer { | |||
return obj == null ? null : obj.toString(); | |||
} | |||
/** | |||
* 获取保存的Excel 的真实路径 | |||
* | |||
* @param params | |||
* @param pojoClass | |||
* @return | |||
* @throws Exception | |||
*/ | |||
private String getSaveExcelUrl(ImportParams params, Class<?> pojoClass) throws Exception { | |||
String url = ""; | |||
if (params.getSaveUrl().equals("upload/excelUpload")) { | |||
url = pojoClass.getName().split("\\.")[pojoClass.getName().split("\\.").length - 1]; | |||
return params.getSaveUrl() + "/" + url; | |||
} | |||
return params.getSaveUrl(); | |||
} | |||
/** | |||
* 获取保存的真实路径 | |||
* | |||
@@ -520,46 +336,4 @@ public class ExcelImportServer { | |||
} | |||
} | |||
private void saveThisExcel(ImportParams params, Class<?> pojoClass, boolean isXSSFWorkbook, | |||
Workbook book) throws Exception { | |||
String path = POIPublicUtil.getWebRootPath(getSaveExcelUrl(params, pojoClass)); | |||
File savefile = new File(path); | |||
if (!savefile.exists()) { | |||
savefile.mkdirs(); | |||
} | |||
SimpleDateFormat format = new SimpleDateFormat("yyyMMddHHmmss"); | |||
FileOutputStream fos = new FileOutputStream(path + "/" + format.format(new Date()) + "_" | |||
+ Math.round(Math.random() * 100000) | |||
+ (isXSSFWorkbook == true ? ".xlsx" : ".xls")); | |||
book.write(fos); | |||
fos.close(); | |||
} | |||
/** | |||
* 多个get 最后再set | |||
* | |||
* @param setMethods | |||
* @param object | |||
*/ | |||
private void setFieldBySomeMethod(List<Method> setMethods, Object object, Object value) | |||
throws Exception { | |||
Object t = getFieldBySomeMethod(setMethods, object); | |||
setMethods.get(setMethods.size() - 1).invoke(t, value); | |||
} | |||
/** | |||
* | |||
* @param entity | |||
* @param object | |||
* @param value | |||
* @throws Exception | |||
*/ | |||
private void setValues(ExcelImportEntity entity, Object object, Object value) throws Exception { | |||
if (entity.getMethods() != null) { | |||
setFieldBySomeMethod(entity.getMethods(), object, value); | |||
} else { | |||
entity.getMethod().invoke(object, value); | |||
} | |||
} | |||
} |
@@ -0,0 +1,259 @@ | |||
package org.jeecgframework.poi.excel.imports.base; | |||
import java.io.File; | |||
import java.io.FileOutputStream; | |||
import java.lang.reflect.Field; | |||
import java.lang.reflect.Method; | |||
import java.lang.reflect.ParameterizedType; | |||
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.commons.lang.StringUtils; | |||
import org.apache.poi.ss.usermodel.Workbook; | |||
import org.jeecgframework.poi.excel.annotation.Excel; | |||
import org.jeecgframework.poi.excel.annotation.ExcelVerify; | |||
import org.jeecgframework.poi.excel.entity.ImportParams; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelCollectionParams; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelVerifyEntity; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
/** | |||
* 导入基础和,普通方法和Sax共用 | |||
* @author JueYue | |||
* @date 2015年1月9日 下午10:25:53 | |||
*/ | |||
public class ImportBaseService { | |||
/** | |||
* 把这个注解解析放到类型对象中 | |||
* | |||
* @param targetId | |||
* @param field | |||
* @param excelEntity | |||
* @param pojoClass | |||
* @param getMethods | |||
* @param temp | |||
* @throws Exception | |||
*/ | |||
public void addEntityToMap(String targetId, Field field, ExcelImportEntity excelEntity, | |||
Class<?> pojoClass, List<Method> getMethods, | |||
Map<String, ExcelImportEntity> temp) throws Exception { | |||
Excel excel = field.getAnnotation(Excel.class); | |||
excelEntity = new ExcelImportEntity(); | |||
excelEntity.setType(excel.type()); | |||
excelEntity.setSaveUrl(excel.savePath()); | |||
excelEntity.setSaveType(excel.imageType()); | |||
excelEntity.setReplace(excel.replace()); | |||
excelEntity.setDatabaseFormat(excel.databaseFormat()); | |||
excelEntity.setVerify(getImportVerify(field)); | |||
getExcelField(targetId, field, excelEntity, excel, pojoClass); | |||
if (getMethods != null) { | |||
List<Method> newMethods = new ArrayList<Method>(); | |||
newMethods.addAll(getMethods); | |||
newMethods.add(excelEntity.getMethod()); | |||
excelEntity.setMethods(newMethods); | |||
} | |||
temp.put(excelEntity.getName(), excelEntity); | |||
} | |||
/** | |||
* 获取导入校验参数 | |||
* | |||
* @param field | |||
* @return | |||
*/ | |||
public ExcelVerifyEntity getImportVerify(Field field) { | |||
ExcelVerify verify = field.getAnnotation(ExcelVerify.class); | |||
if (verify != null) { | |||
ExcelVerifyEntity entity = new ExcelVerifyEntity(); | |||
entity.setEmail(verify.isEmail()); | |||
entity.setInterHandler(verify.interHandler()); | |||
entity.setMaxLength(verify.maxLength()); | |||
entity.setMinLength(verify.minLength()); | |||
entity.setMobile(verify.isMobile()); | |||
entity.setNotNull(verify.notNull()); | |||
entity.setRegex(verify.regex()); | |||
entity.setRegexTip(verify.regexTip()); | |||
entity.setTel(verify.isTel()); | |||
return entity; | |||
} | |||
return null; | |||
} | |||
/** | |||
* 获取需要导出的全部字段 | |||
* | |||
* | |||
* @param exclusions | |||
* @param targetId | |||
* 目标ID | |||
* @param fields | |||
* @param excelCollection | |||
* @throws Exception | |||
*/ | |||
public void getAllExcelField(String targetId, Field[] fields, | |||
Map<String, ExcelImportEntity> excelParams, | |||
List<ExcelCollectionParams> excelCollection, Class<?> pojoClass, | |||
List<Method> getMethods) throws Exception { | |||
ExcelImportEntity excelEntity = null; | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
if (POIPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
continue; | |||
} | |||
if (POIPublicUtil.isCollection(field.getType())) { | |||
// 集合对象设置属性 | |||
ExcelCollectionParams collection = new ExcelCollectionParams(); | |||
collection.setName(field.getName()); | |||
Map<String, ExcelImportEntity> temp = new HashMap<String, ExcelImportEntity>(); | |||
ParameterizedType pt = (ParameterizedType) field.getGenericType(); | |||
Class<?> clz = (Class<?>) pt.getActualTypeArguments()[0]; | |||
collection.setType(clz); | |||
getExcelFieldList(targetId, POIPublicUtil.getClassFields(clz), clz, temp, null); | |||
collection.setExcelParams(temp); | |||
excelCollection.add(collection); | |||
} else if (POIPublicUtil.isJavaClass(field)) { | |||
addEntityToMap(targetId, field, excelEntity, pojoClass, getMethods, excelParams); | |||
} else { | |||
List<Method> newMethods = new ArrayList<Method>(); | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods.add(POIPublicUtil.getMethod(field.getName(), pojoClass)); | |||
getAllExcelField(targetId, POIPublicUtil.getClassFields(field.getType()), | |||
excelParams, excelCollection, field.getType(), newMethods); | |||
} | |||
} | |||
} | |||
public void getExcelField(String targetId, Field field, ExcelImportEntity excelEntity, | |||
Excel excel, Class<?> pojoClass) throws Exception { | |||
excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
String fieldname = field.getName(); | |||
excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass, field.getType())); | |||
if (StringUtils.isEmpty(excel.importFormat())) { | |||
excelEntity.setFormat(excel.format()); | |||
} else { | |||
excelEntity.setFormat(excel.importFormat()); | |||
} | |||
} | |||
public void getExcelFieldList(String targetId, Field[] fields, Class<?> pojoClass, | |||
Map<String, ExcelImportEntity> temp, List<Method> getMethods) | |||
throws Exception { | |||
ExcelImportEntity excelEntity = null; | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
if (POIPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
continue; | |||
} | |||
if (POIPublicUtil.isJavaClass(field)) { | |||
addEntityToMap(targetId, field, excelEntity, pojoClass, getMethods, temp); | |||
} else { | |||
List<Method> newMethods = new ArrayList<Method>(); | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods | |||
.add(POIPublicUtil.getMethod(field.getName(), pojoClass, field.getType())); | |||
getExcelFieldList(targetId, POIPublicUtil.getClassFields(field.getType()), | |||
field.getType(), temp, newMethods); | |||
} | |||
} | |||
} | |||
/** | |||
* 判断在这个单元格显示的名称 | |||
* | |||
* @param exportName | |||
* @param targetId | |||
* @return | |||
*/ | |||
public String getExcelName(String exportName, String targetId) { | |||
if (exportName.indexOf("_") < 0) { | |||
return exportName; | |||
} | |||
String[] arr = exportName.split(","); | |||
for (String str : arr) { | |||
if (str.indexOf(targetId) != -1) { | |||
return str.split("_")[0]; | |||
} | |||
} | |||
return null; | |||
} | |||
public Object getFieldBySomeMethod(List<Method> list, Object t) throws Exception { | |||
Method m; | |||
for (int i = 0; i < list.size() - 1; i++) { | |||
m = list.get(i); | |||
t = m.invoke(t, new Object[] {}); | |||
} | |||
return t; | |||
} | |||
public void saveThisExcel(ImportParams params, Class<?> pojoClass, boolean isXSSFWorkbook, | |||
Workbook book) throws Exception { | |||
String path = POIPublicUtil.getWebRootPath(getSaveExcelUrl(params, pojoClass)); | |||
File savefile = new File(path); | |||
if (!savefile.exists()) { | |||
savefile.mkdirs(); | |||
} | |||
SimpleDateFormat format = new SimpleDateFormat("yyyMMddHHmmss"); | |||
FileOutputStream fos = new FileOutputStream(path + "/" + format.format(new Date()) + "_" | |||
+ Math.round(Math.random() * 100000) | |||
+ (isXSSFWorkbook == true ? ".xlsx" : ".xls")); | |||
book.write(fos); | |||
fos.close(); | |||
} | |||
/** | |||
* 获取保存的Excel 的真实路径 | |||
* | |||
* @param params | |||
* @param pojoClass | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public String getSaveExcelUrl(ImportParams params, Class<?> pojoClass) throws Exception { | |||
String url = ""; | |||
if (params.getSaveUrl().equals("upload/excelUpload")) { | |||
url = pojoClass.getName().split("\\.")[pojoClass.getName().split("\\.").length - 1]; | |||
return params.getSaveUrl() + "/" + url; | |||
} | |||
return params.getSaveUrl(); | |||
} | |||
/** | |||
* 多个get 最后再set | |||
* | |||
* @param setMethods | |||
* @param object | |||
*/ | |||
public void setFieldBySomeMethod(List<Method> setMethods, Object object, Object value) | |||
throws Exception { | |||
Object t = getFieldBySomeMethod(setMethods, object); | |||
setMethods.get(setMethods.size() - 1).invoke(t, value); | |||
} | |||
/** | |||
* | |||
* @param entity | |||
* @param object | |||
* @param value | |||
* @throws Exception | |||
*/ | |||
public void setValues(ExcelImportEntity entity, Object object, Object value) throws Exception { | |||
if (entity.getMethods() != null) { | |||
setFieldBySomeMethod(entity.getMethods(), object, value); | |||
} else { | |||
entity.getMethod().invoke(object, value); | |||
} | |||
} | |||
} |
@@ -1,18 +1,19 @@ | |||
package org.jeecgframework.poi.excel.imports.sax; | |||
import java.io.IOException; | |||
import java.io.File; | |||
import java.io.InputStream; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | |||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException; | |||
import org.apache.poi.openxml4j.opc.OPCPackage; | |||
import org.apache.poi.xssf.eventusermodel.XSSFReader; | |||
import org.apache.poi.xssf.model.SharedStringsTable; | |||
import org.jeecgframework.poi.excel.entity.ImportParams; | |||
import org.jeecgframework.poi.excel.imports.sax.parse.ISaxRowRead; | |||
import org.jeecgframework.poi.excel.imports.sax.parse.SaxRowRead; | |||
import org.jeecgframework.poi.exception.excel.ExcelImportException; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.xml.sax.ContentHandler; | |||
import org.xml.sax.InputSource; | |||
import org.xml.sax.SAXException; | |||
@@ -27,12 +28,38 @@ import org.xml.sax.helpers.XMLReaderFactory; | |||
*/ | |||
public class SaxReadExcel { | |||
public <T> List<T> readExcel(InputStream inputstream, Class<?> pojoClass, ImportParams params) { | |||
private static final Logger LOGGER = LoggerFactory.getLogger(SaxReadExcel.class); | |||
public <T> List<T> readExcel(InputStream inputstream, Class<?> pojoClass, ImportParams params, | |||
ISaxRowRead rowRead) { | |||
try { | |||
OPCPackage opcPackage = OPCPackage.open(inputstream); | |||
return readExcel(opcPackage, pojoClass, params, rowRead); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(), e); | |||
throw new ExcelImportException(e.getMessage()); | |||
} | |||
} | |||
public <T> List<T> readExcel(File file, Class<?> pojoClass, ImportParams params, | |||
ISaxRowRead rowRead) { | |||
try { | |||
OPCPackage opcPackage = OPCPackage.open(file); | |||
return readExcel(opcPackage, pojoClass, params, rowRead); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(), e); | |||
throw new ExcelImportException(e.getMessage()); | |||
} | |||
} | |||
private <T> List<T> readExcel(OPCPackage opcPackage, Class<?> pojoClass, ImportParams params, | |||
ISaxRowRead rowRead) { | |||
try { | |||
XSSFReader xssfReader = new XSSFReader(opcPackage); | |||
SharedStringsTable sst = xssfReader.getSharedStringsTable(); | |||
ISaxRowRead rowRead = new SaxRowRead(); | |||
if (rowRead == null) { | |||
rowRead = new SaxRowRead(pojoClass, params); | |||
} | |||
XMLReader parser = fetchSheetParser(sst, rowRead); | |||
Iterator<InputStream> sheets = xssfReader.getSheetsData(); | |||
int sheetIndex = 0; | |||
@@ -45,13 +72,13 @@ public class SaxReadExcel { | |||
} | |||
return rowRead.getList(); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(), e); | |||
throw new ExcelImportException("SAX导入数据失败"); | |||
} | |||
return null; | |||
} | |||
public XMLReader fetchSheetParser(SharedStringsTable sst, ISaxRowRead rowRead) | |||
throws SAXException { | |||
private XMLReader fetchSheetParser(SharedStringsTable sst, ISaxRowRead rowRead) | |||
throws SAXException { | |||
XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); | |||
ContentHandler handler = new SheetHandler(sst, rowRead); | |||
parser.setContentHandler(handler); | |||
@@ -99,16 +99,15 @@ public class SheetHandler extends DefaultHandler { | |||
} else if (CellValueType.Number.equals(type)) { | |||
BigDecimal bd = new BigDecimal(value); | |||
rowlist.add(curCol, new SaxReadCellEntity(CellValueType.Number, bd)); | |||
} else if (CellValueType.String.equals(type)) { | |||
rowlist.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); | |||
} | |||
curCol++; | |||
} else { | |||
//如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法 | |||
if (name.equals("row")) { | |||
read.parse(curRow, rowlist); | |||
rowlist.clear(); | |||
curRow++; | |||
curCol = 0; | |||
} | |||
} else if (name.equals("row")) {//如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法 | |||
read.parse(curRow, rowlist); | |||
rowlist.clear(); | |||
curRow++; | |||
curCol = 0; | |||
} | |||
} | |||
@@ -1,8 +1,24 @@ | |||
package org.jeecgframework.poi.excel.imports.sax.parse; | |||
import java.lang.reflect.Field; | |||
import java.util.ArrayList; | |||
import java.util.Collection; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.jeecgframework.poi.excel.annotation.ExcelTarget; | |||
import org.jeecgframework.poi.excel.entity.ImportParams; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelCollectionParams; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity; | |||
import org.jeecgframework.poi.excel.entity.sax.SaxReadCellEntity; | |||
import org.jeecgframework.poi.excel.imports.CellValueServer; | |||
import org.jeecgframework.poi.excel.imports.base.ImportBaseService; | |||
import org.jeecgframework.poi.exception.excel.ExcelImportException; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import com.google.common.collect.Lists; | |||
@@ -12,13 +28,52 @@ import com.google.common.collect.Lists; | |||
* @param <T> | |||
* @date 2015年1月1日 下午7:59:39 | |||
*/ | |||
@SuppressWarnings("rawtypes") | |||
public class SaxRowRead implements ISaxRowRead { | |||
@SuppressWarnings({ "rawtypes", "unchecked" }) | |||
public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||
private List list; | |||
private static final Logger LOGGER = LoggerFactory | |||
.getLogger(SaxRowRead.class); | |||
/** 需要返回的数据 **/ | |||
private List list; | |||
/** 导出的对象 **/ | |||
private Class<?> pojoClass; | |||
/** 导入参数 **/ | |||
private ImportParams params; | |||
/** 列表头对应关系 **/ | |||
private Map<Integer, String> titlemap = new HashMap<Integer, String>(); | |||
/** 当前的对象**/ | |||
private Object object = null; | |||
public SaxRowRead() { | |||
private Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>(); | |||
private List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>(); | |||
private String targetId; | |||
private CellValueServer cellValueServer; | |||
public SaxRowRead(Class<?> pojoClass, ImportParams params) { | |||
list = Lists.newArrayList(); | |||
this.params = params; | |||
this.pojoClass = pojoClass; | |||
cellValueServer = new CellValueServer(); | |||
initParams(pojoClass, params); | |||
} | |||
private void initParams(Class<?> pojoClass, ImportParams params) { | |||
try { | |||
Field fileds[] = POIPublicUtil.getClassFields(pojoClass); | |||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
if (etarget != null) { | |||
targetId = etarget.value(); | |||
} | |||
getAllExcelField(targetId, fileds, excelParams, excelCollection, pojoClass, null); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(), e); | |||
throw new ExcelImportException(e.getMessage()); | |||
} | |||
} | |||
@Override | |||
@@ -28,7 +83,111 @@ public class SaxRowRead implements ISaxRowRead { | |||
@Override | |||
public void parse(int index, List<SaxReadCellEntity> datas) { | |||
try { | |||
if (datas == null || datas.size() == 0) { | |||
return; | |||
} | |||
//标题行跳过 | |||
if (index < params.getTitleRows()) { | |||
return; | |||
} | |||
//表头行 | |||
if (index < params.getTitleRows() + params.getHeadRows()) { | |||
addHeadData(datas); | |||
} else { | |||
addListData(datas); | |||
} | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(), e); | |||
throw new ExcelImportException(e.getMessage()); | |||
} | |||
} | |||
/** | |||
* 集合元素处理 | |||
* @param datas | |||
*/ | |||
private void addListData(List<SaxReadCellEntity> datas) throws Exception { | |||
// 判断是集合元素还是不是集合元素,如果是就继续加入这个集合,不是就创建新的对象 | |||
if ((datas.get(params.getKeyIndex()) == null || StringUtils.isEmpty(String.valueOf(datas | |||
.get(params.getKeyIndex()).getValue()))) && object != null) { | |||
for (ExcelCollectionParams param : excelCollection) { | |||
addListContinue(object, param, datas, titlemap, targetId, params); | |||
} | |||
} else { | |||
object = POIPublicUtil.createObject(pojoClass, targetId); | |||
SaxReadCellEntity entity; | |||
for (int i = 0, le = datas.size(); i < le; i++) { | |||
entity = datas.get(i); | |||
String titleString = (String) titlemap.get(i); | |||
if (excelParams.containsKey(titleString)) { | |||
saveFieldValue(params, object, entity, excelParams, titleString); | |||
} | |||
} | |||
for (ExcelCollectionParams param : excelCollection) { | |||
addListContinue(object, param, datas, titlemap, targetId, params); | |||
} | |||
list.add(object); | |||
} | |||
} | |||
/*** | |||
* 向List里面继续添加元素 | |||
* | |||
* @param exclusions | |||
* @param object | |||
* @param param | |||
* @param datas | |||
* @param titlemap | |||
* @param targetId | |||
* @param params | |||
*/ | |||
private void addListContinue(Object object, ExcelCollectionParams param, | |||
List<SaxReadCellEntity> datas, Map<Integer, String> titlemap, | |||
String targetId, ImportParams params) throws Exception { | |||
Collection collection = (Collection) POIPublicUtil.getMethod(param.getName(), | |||
object.getClass()).invoke(object, new Object[] {}); | |||
Object entity = POIPublicUtil.createObject(param.getType(), targetId); | |||
boolean isUsed = false;// 是否需要加上这个对象 | |||
for (int i = 0; i < datas.size(); i++) { | |||
String titleString = (String) titlemap.get(i); | |||
if (param.getExcelParams().containsKey(titleString)) { | |||
saveFieldValue(params, entity, datas.get(i), param.getExcelParams(), titleString); | |||
isUsed = true; | |||
} | |||
} | |||
if (isUsed) { | |||
collection.add(entity); | |||
} | |||
} | |||
/** | |||
* 设置值 | |||
* @param params | |||
* @param object | |||
* @param entity | |||
* @param excelParams | |||
* @param titleString | |||
* @throws Exception | |||
*/ | |||
private void saveFieldValue(ImportParams params, Object object, SaxReadCellEntity entity, | |||
Map<String, ExcelImportEntity> excelParams, String titleString) | |||
throws Exception { | |||
Object value = cellValueServer.getValue(params.getDataHanlder(), object, entity, | |||
excelParams, titleString); | |||
setValues(excelParams.get(titleString), object, value); | |||
} | |||
/** | |||
* put 表头数据 | |||
* @param datas | |||
*/ | |||
private void addHeadData(List<SaxReadCellEntity> datas) { | |||
for (int i = 0; i < datas.size(); i++) { | |||
if (StringUtils.isNotEmpty(String.valueOf(datas.get(i).getValue()))) { | |||
titlemap.put(i, String.valueOf(datas.get(i).getValue())); | |||
} | |||
} | |||
} | |||
} |
@@ -317,7 +317,7 @@ public class POIPublicUtil { | |||
* 返回流和图片类型 | |||
*@Author JueYue | |||
*@date 2013-11-20 | |||
*@param obj | |||
*@param entity | |||
*@return (byte[]) isAndType[0],(Integer)isAndType[1] | |||
* @throws Exception | |||
*/ | |||
@@ -395,9 +395,6 @@ public class POIPublicUtil { | |||
* @param index | |||
* @return | |||
* @throws Exception | |||
* @throws InvocationTargetException | |||
* @throws IllegalAccessException | |||
* @throws IllegalArgumentException | |||
*/ | |||
@SuppressWarnings("rawtypes") | |||
public static Object getValueDoWhile(Object object, String[] paramsArr, int index) | |||
@@ -5,27 +5,31 @@ import java.util.Date; | |||
import java.util.List; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.commons.lang.builder.ReflectionToStringBuilder; | |||
import org.jeecgframework.poi.entity.CourseEntity; | |||
import org.jeecgframework.poi.entity.TestEntity; | |||
import org.jeecgframework.poi.entity.statistics.StatisticEntity; | |||
import org.jeecgframework.poi.excel.entity.ImportParams; | |||
import org.junit.Test; | |||
public class ExcelImportUtilTest { | |||
//@Test | |||
@Test | |||
public void test() { | |||
ImportParams params = new ImportParams(); | |||
params.setTitleRows(2); | |||
params.setHeadRows(2); | |||
//params.setSheetNum(9); | |||
params.setNeedSave(true); | |||
params.setTitleRows(1); | |||
long start = new Date().getTime(); | |||
List<CourseEntity> list = ExcelImportUtil.importExcel(new File("d:/tt.xlsx"), | |||
CourseEntity.class, params); | |||
List<StatisticEntity> list = ExcelImportUtil.importExcelBySax(new File("d:/tt.xlsx"), | |||
StatisticEntity.class, params); | |||
// List<StatisticEntity> list = ExcelImportUtil.importExcelBySax(new File("d:/tt.xlsx"), | |||
// StatisticEntity.class, params); | |||
/*for (int i = 0; i < list.size(); i++) { | |||
System.out.println(ReflectionToStringBuilder.toString(list.get(i))); | |||
}*/ | |||
System.out.println(list.size() + "-----" + (new Date().getTime() - start)); | |||
} | |||
@Test | |||
// @Test | |||
public void test2() { | |||
ImportParams params = new ImportParams(); | |||
params.setTitleRows(1); | |||
@@ -21,7 +21,7 @@ public class ExcelExportStatisticTest { | |||
public void test() throws Exception { | |||
List<StatisticEntity> list = new ArrayList<StatisticEntity>(); | |||
for (int i = 0; i < 20; i++) { | |||
for (int i = 0; i < 20000; i++) { | |||
StatisticEntity client = new StatisticEntity(); | |||
client.setName("index" + i); | |||
client.setIntTest(1 + i); | |||
@@ -32,8 +32,7 @@ public class ExcelExportStatisticTest { | |||
list.add(client); | |||
} | |||
Date start = new Date(); | |||
ExportParams params = new ExportParams("2412312", "测试", ExcelType.XSSF); | |||
params.setStyle(ExcelStyleType.COLOR.getClazz()); | |||
ExportParams params = new ExportParams("2412312", "测试",ExcelType.XSSF); | |||
Workbook workbook = ExcelExportUtil.exportExcel(params, StatisticEntity.class, list); | |||
System.out.println(new Date().getTime() - start.getTime()); | |||
File savefile = new File("d:/"); | |||
@@ -24,9 +24,9 @@ | |||
<properties> | |||
<sub.version>2.0.7-SNAPSHOT</sub.version> | |||
<poi.version>3.11</poi.version> | |||
<poi.version>3.9</poi.version> | |||
<xerces.version>2.4.0</xerces.version> | |||
<guava.version>16.0.1</guava.version> | |||
<reflectasm.version>1.09</reflectasm.version> | |||
<commons-lang.version>2.6</commons-lang.version> | |||
<slf4j.version>1.6.1</slf4j.version> | |||
<spring.version>3.1.1.RELEASE</spring.version> | |||
@@ -100,12 +100,18 @@ | |||
<artifactId>spring-core</artifactId> | |||
<version>${spring.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>xerces</groupId> | |||
<artifactId>xerces</artifactId> | |||
<version>${xerces.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>javax.servlet</groupId> | |||
<artifactId>servlet-api</artifactId> | |||
<version>2.5</version> | |||
<scope>provided</scope> | |||
<optional>true</optional> | |||
</dependency> | |||
<!-- test --> | |||