Browse Source

导入提供了sax导入方式,用来支持大数据量导出比如几万以上的数据量,占用内存和cpu明显小很多,不会造成内存溢出

但是不支持图片,同时工解析,让大家可以自己解析数据
4.1.3.A
jueyue 10 years ago
parent
commit
4a9c428077
14 changed files with 596 additions and 278 deletions
  1. +4
    -0
      easypoi-base/pom.xml
  2. +70
    -9
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java
  3. +5
    -0
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java
  4. +0
    -1
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java
  5. +27
    -2
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/CellValueServer.java
  6. +2
    -228
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java
  7. +259
    -0
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/base/ImportBaseService.java
  8. +36
    -9
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java
  9. +7
    -8
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java
  10. +163
    -4
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java
  11. +1
    -4
      easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java
  12. +12
    -8
      easypoi-test/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtilTest.java
  13. +2
    -3
      easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java
  14. +8
    -2
      pom.xml

+ 4
- 0
easypoi-base/pom.xml View File

@@ -25,6 +25,10 @@
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xerces</artifactId>
</dependency>
<!-- google 工具类 -->
<dependency>


+ 70
- 9
easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java View File

@@ -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);
}
}

+ 5
- 0
easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java View File

@@ -38,4 +38,9 @@ public class SaxReadCellEntity {
this.value = value;
}
@Override
public String toString() {
return "[type=" + cellType.toString() + ",value=" + value + "]";
}
}

+ 0
- 1
easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java View File

@@ -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;


+ 27
- 2
easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/CellValueServer.java View File

@@ -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);
}
}


+ 2
- 228
easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java View File

@@ -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);
}
}
}

+ 259
- 0
easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/base/ImportBaseService.java View File

@@ -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);
}
}
}

+ 36
- 9
easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java View File

@@ -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);


+ 7
- 8
easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java View File

@@ -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;
}
}


+ 163
- 4
easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java View File

@@ -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()));
}
}
}
}

+ 1
- 4
easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java View File

@@ -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)


+ 12
- 8
easypoi-test/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtilTest.java View File

@@ -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);


+ 2
- 3
easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java View File

@@ -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:/");


+ 8
- 2
pom.xml View File

@@ -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 -->


Loading…
Cancel
Save