From 4a9c428077960c6e9fc82b4b47b18384a5c14a5e Mon Sep 17 00:00:00 2001 From: jueyue Date: Sat, 10 Jan 2015 18:06:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=8F=90=E4=BE=9B=E4=BA=86sa?= =?UTF-8?q?x=E5=AF=BC=E5=85=A5=E6=96=B9=E5=BC=8F,=E7=94=A8=E6=9D=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=A7=E6=95=B0=E6=8D=AE=E9=87=8F=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=AF=94=E5=A6=82=E5=87=A0=E4=B8=87=E4=BB=A5=E4=B8=8A?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E9=87=8F,=E5=8D=A0=E7=94=A8?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=92=8Ccpu=E6=98=8E=E6=98=BE=E5=B0=8F?= =?UTF-8?q?=E5=BE=88=E5=A4=9A,=E4=B8=8D=E4=BC=9A=E9=80=A0=E6=88=90?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=BA=A2=E5=87=BA=20=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81=E5=9B=BE=E7=89=87,=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=B7=A5=E8=A7=A3=E6=9E=90,=E8=AE=A9=E5=A4=A7?= =?UTF-8?q?=E5=AE=B6=E5=8F=AF=E4=BB=A5=E8=87=AA=E5=B7=B1=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- easypoi-base/pom.xml | 4 + .../poi/excel/ExcelImportUtil.java | 79 +++++- .../excel/entity/sax/SaxReadCellEntity.java | 5 + .../poi/excel/export/ExcelExportServer.java | 1 - .../poi/excel/imports/CellValueServer.java | 29 +- .../poi/excel/imports/ExcelImportServer.java | 230 +--------------- .../excel/imports/base/ImportBaseService.java | 259 ++++++++++++++++++ .../poi/excel/imports/sax/SaxReadExcel.java | 45 ++- .../poi/excel/imports/sax/SheetHandler.java | 15 +- .../excel/imports/sax/parse/SaxRowRead.java | 167 ++++++++++- .../poi/util/POIPublicUtil.java | 5 +- .../poi/excel/ExcelImportUtilTest.java | 20 +- .../excel/test/ExcelExportStatisticTest.java | 5 +- pom.xml | 10 +- 14 files changed, 596 insertions(+), 278 deletions(-) create mode 100644 easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/base/ImportBaseService.java diff --git a/easypoi-base/pom.xml b/easypoi-base/pom.xml index 312dfd6..3a64ec0 100644 --- a/easypoi-base/pom.xml +++ b/easypoi-base/pom.xml @@ -25,6 +25,10 @@ org.apache.poi poi-scratchpad + + xerces + xerces + diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java index 8961eb2..e356a85 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java @@ -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 List importExcelByIs(InputStream inputstream, Class pojoClass, - ImportParams params) throws Exception { + public static List 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 List 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 List 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 List 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 List importExcelBySax(InputStream inputstream, Class pojoClass, + ImportParams params, ISaxRowRead rowRead) + throws Exception { + return new SaxReadExcel().readExcel(inputstream, pojoClass, params, rowRead); + } + } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java index 139d1fe..a8fe0ba 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java @@ -38,4 +38,9 @@ public class SaxReadCellEntity { this.value = value; } + @Override + public String toString() { + return "[type=" + cellType.toString() + ",value=" + value + "]"; + } + } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java index 0222d2b..4fbf792 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java @@ -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; diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/CellValueServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/CellValueServer.java index 8e41267..c337606 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/CellValueServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/CellValueServer.java @@ -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 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 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); } } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java index 70c323b..0223ce5 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java @@ -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 getMethods, - Map 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 newMethods = new ArrayList(); - 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 excelParams, - List excelCollection, Class pojoClass, - List 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 temp = new HashMap(); - 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 newMethods = new ArrayList(); - 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 temp, List 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 newMethods = new ArrayList(); - 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 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 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); - } - } - } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/base/ImportBaseService.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/base/ImportBaseService.java new file mode 100644 index 0000000..322eb01 --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/base/ImportBaseService.java @@ -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 getMethods, + Map 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 newMethods = new ArrayList(); + 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 excelParams, + List excelCollection, Class pojoClass, + List 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 temp = new HashMap(); + 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 newMethods = new ArrayList(); + 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 temp, List 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 newMethods = new ArrayList(); + 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 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 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); + } + } + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java index 1d2c8cf..31682d0 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java @@ -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 List readExcel(InputStream inputstream, Class pojoClass, ImportParams params) { + private static final Logger LOGGER = LoggerFactory.getLogger(SaxReadExcel.class); + + public List 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 List 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 List 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 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); diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java index d955e8c..2af5fbe 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java @@ -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; } } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java index 1486bc1..5c15c88 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java @@ -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 * @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 titlemap = new HashMap(); + /** 当前的对象**/ + private Object object = null; - public SaxRowRead() { + private Map excelParams = new HashMap(); + + private List excelCollection = new ArrayList(); + + 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 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 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 datas, Map 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 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 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())); + } + } + } } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java index 28e0dd3..599305f 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java @@ -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) diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtilTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtilTest.java index 16cc101..f4b3359 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtilTest.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtilTest.java @@ -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 list = ExcelImportUtil.importExcel(new File("d:/tt.xlsx"), - CourseEntity.class, params); + List list = ExcelImportUtil.importExcelBySax(new File("d:/tt.xlsx"), + StatisticEntity.class, params); +// List 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); diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java index 9f5d876..d095ab4 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java @@ -21,7 +21,7 @@ public class ExcelExportStatisticTest { public void test() throws Exception { List list = new ArrayList(); - 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:/"); diff --git a/pom.xml b/pom.xml index f1c336f..e2b8caa 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ 2.0.7-SNAPSHOT - 3.11 + 3.9 + 2.4.0 16.0.1 - 1.09 2.6 1.6.1 3.1.1.RELEASE @@ -100,12 +100,18 @@ spring-core ${spring.version} + + xerces + xerces + ${xerces.version} + javax.servlet servlet-api 2.5 provided + true