| @@ -1,2 +1,3 @@ | |||
| eclipse.preferences.version=1 | |||
| encoding//src/main/java=UTF-8 | |||
| encoding//src/test/java=UTF-8 | |||
| @@ -4,7 +4,7 @@ | |||
| <parent> | |||
| <groupId>org.jeecgframework</groupId> | |||
| <artifactId>easypoi</artifactId> | |||
| <version>2.0.1</version> | |||
| <version>2.0.2</version> | |||
| </parent> | |||
| <artifactId>easypoi-base</artifactId> | |||
| <dependencies> | |||
| @@ -22,6 +22,7 @@ import org.apache.poi.ss.util.CellRangeAddress; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelTarget; | |||
| import org.jeecgframework.poi.excel.entity.ExportParams; | |||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
| import org.jeecgframework.poi.excel.export.base.ExcelExportBase; | |||
| import org.jeecgframework.poi.exception.excel.ExcelExportException; | |||
| import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; | |||
| import org.jeecgframework.poi.util.POIPublicUtil; | |||
| @@ -1,15 +1,12 @@ | |||
| package org.jeecgframework.poi.excel.export; | |||
| package org.jeecgframework.poi.excel.export.base; | |||
| import java.awt.image.BufferedImage; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| 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.Arrays; | |||
| import java.util.Collection; | |||
| import java.util.Collections; | |||
| import java.util.Date; | |||
| @@ -33,10 +30,6 @@ import org.apache.poi.ss.usermodel.Row; | |||
| import org.apache.poi.ss.usermodel.Sheet; | |||
| import org.apache.poi.ss.usermodel.Workbook; | |||
| import org.apache.poi.ss.util.CellRangeAddress; | |||
| import org.jeecgframework.poi.excel.annotation.Excel; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelCollection; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelEntity; | |||
| import org.jeecgframework.poi.excel.entity.params.ComparatorExcelField; | |||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
| import org.jeecgframework.poi.excel.entity.params.MergeEntity; | |||
| import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | |||
| @@ -48,184 +41,7 @@ import org.jeecgframework.poi.util.POIPublicUtil; | |||
| * @author JueYue | |||
| * @date 2014年6月17日 下午6:15:13 | |||
| */ | |||
| public abstract class ExcelExportBase { | |||
| protected IExcelDataHandler dataHanlder; | |||
| protected List<String> needHanlderList; | |||
| /** | |||
| * 获取需要导出的全部字段 | |||
| * | |||
| * @param exclusions | |||
| * @param targetId | |||
| * 目标ID | |||
| * @param fields | |||
| * @throws Exception | |||
| */ | |||
| public void getAllExcelField(String[] exclusions, String targetId, | |||
| Field[] fields, List<ExcelExportEntity> excelParams, | |||
| Class<?> pojoClass, List<Method> getMethods) throws Exception { | |||
| List<String> exclusionsList = exclusions != null ? Arrays | |||
| .asList(exclusions) : null; | |||
| ExcelExportEntity excelEntity; | |||
| // 遍历整个filed | |||
| for (int i = 0; i < fields.length; i++) { | |||
| Field field = fields[i]; | |||
| // 先判断是不是collection,在判断是不是java自带对象,之后就是我们自己的对象了 | |||
| if (POIPublicUtil.isNotUserExcelUserThis(exclusionsList, field, | |||
| targetId)) { | |||
| continue; | |||
| } | |||
| if (POIPublicUtil.isCollection(field.getType())) { | |||
| ExcelCollection excel = field | |||
| .getAnnotation(ExcelCollection.class); | |||
| ParameterizedType pt = (ParameterizedType) field | |||
| .getGenericType(); | |||
| Class<?> clz = (Class<?>) pt.getActualTypeArguments()[0]; | |||
| List<ExcelExportEntity> list = new ArrayList<ExcelExportEntity>(); | |||
| getAllExcelField(exclusions, | |||
| StringUtils.isNotEmpty(excel.id()) ? excel.id() | |||
| : targetId, | |||
| POIPublicUtil.getClassFields(clz), list, clz, null); | |||
| excelEntity = new ExcelExportEntity(); | |||
| excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
| excelEntity | |||
| .setOrderNum(getCellOrder(excel.orderNum(), targetId)); | |||
| excelEntity.setMethod(POIPublicUtil.getMethod( | |||
| field.getName(), pojoClass)); | |||
| excelEntity.setList(list); | |||
| excelParams.add(excelEntity); | |||
| } else if (POIPublicUtil.isJavaClass(field)) { | |||
| excelParams.add(createExcelExportEntity(field, targetId, | |||
| pojoClass, getMethods)); | |||
| } else { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| if (getMethods != null) { | |||
| newMethods.addAll(getMethods); | |||
| } | |||
| newMethods.add(POIPublicUtil.getMethod(field.getName(), | |||
| pojoClass)); | |||
| ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | |||
| getAllExcelField(exclusions, | |||
| StringUtils.isNotEmpty(excel.id()) ? excel.id() | |||
| : targetId, | |||
| POIPublicUtil.getClassFields(field.getType()), | |||
| excelParams, field.getType(), newMethods); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 创建导出实体对象 | |||
| * | |||
| * @param field | |||
| * @param targetId | |||
| * @param pojoClass | |||
| * @param getMethods | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| private ExcelExportEntity createExcelExportEntity(Field field, | |||
| String targetId, Class<?> pojoClass, List<Method> getMethods) | |||
| throws Exception { | |||
| Excel excel = field.getAnnotation(Excel.class); | |||
| ExcelExportEntity excelEntity = new ExcelExportEntity(); | |||
| excelEntity.setType(excel.type()); | |||
| 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); | |||
| } | |||
| return excelEntity; | |||
| } | |||
| /** | |||
| * 判断在这个单元格显示的名称 | |||
| * | |||
| * @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; | |||
| } | |||
| /** | |||
| * 获取这个字段的顺序 | |||
| * | |||
| * @param orderNum | |||
| * @param targetId | |||
| * @return | |||
| */ | |||
| public int getCellOrder(String orderNum, String targetId) { | |||
| if (isInteger(orderNum) || targetId == null) { | |||
| return Integer.valueOf(orderNum); | |||
| } | |||
| String[] arr = orderNum.split(","); | |||
| String[] temp; | |||
| for (String str : arr) { | |||
| temp = str.split("_"); | |||
| if (targetId.equals(temp[1])) { | |||
| return Integer.valueOf(temp[0]); | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| /** | |||
| * 判断字符串是否是整数 | |||
| */ | |||
| public boolean isInteger(String value) { | |||
| try { | |||
| Integer.parseInt(value); | |||
| return true; | |||
| } catch (NumberFormatException e) { | |||
| return false; | |||
| } | |||
| } | |||
| /** | |||
| * 注解到导出对象的转换 | |||
| * | |||
| * @param targetId | |||
| * @param field | |||
| * @param excelEntity | |||
| * @param excel | |||
| * @param pojoClass | |||
| * @throws Exception | |||
| */ | |||
| private void getExcelField(String targetId, Field field, | |||
| ExcelExportEntity excelEntity, Excel excel, Class<?> pojoClass) | |||
| throws Exception { | |||
| excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
| excelEntity.setWidth(excel.width()); | |||
| excelEntity.setHeight(excel.height()); | |||
| excelEntity.setNeedMerge(excel.needMerge()); | |||
| excelEntity.setMergeVertical(excel.mergeVertical()); | |||
| excelEntity.setMergeRely(excel.mergeRely()); | |||
| excelEntity.setReplace(excel.replace()); | |||
| excelEntity.setOrderNum(getCellOrder(excel.orderNum(), targetId)); | |||
| excelEntity.setWrap(excel.isWrap()); | |||
| excelEntity.setExportImageType(excel.imageType()); | |||
| excelEntity.setDatabaseFormat(excel.databaseFormat()); | |||
| excelEntity | |||
| .setFormat(StringUtils.isNotEmpty(excel.exportFormat()) ? excel | |||
| .exportFormat() : excel.format()); | |||
| String fieldname = field.getName(); | |||
| excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass)); | |||
| } | |||
| public abstract class ExcelExportBase extends ExportBase { | |||
| /** | |||
| * 合并单元格 | |||
| @@ -454,60 +270,6 @@ public abstract class ExcelExportBase { | |||
| return null; | |||
| } | |||
| /** | |||
| * 获取填如这个cell的值,提供一些附加功能 | |||
| * | |||
| * @param entity | |||
| * @param obj | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public Object getCellValue(ExcelExportEntity entity, Object obj) | |||
| throws Exception { | |||
| Object value = entity.getMethods() != null ? getFieldBySomeMethod( | |||
| entity.getMethods(), obj) : entity.getMethod().invoke(obj, | |||
| new Object[] {}); | |||
| if (needHanlderList != null | |||
| && needHanlderList.contains(entity.getName())) { | |||
| value = dataHanlder.exportHandler(obj, entity.getName(), value); | |||
| } else if (StringUtils.isNotEmpty(entity.getFormat())) { | |||
| value = formatValue(value, entity); | |||
| } else if (entity.getReplace() != null | |||
| && entity.getReplace().length > 0) { | |||
| value = replaceValue(entity.getReplace(), String.valueOf(value)); | |||
| } | |||
| return value == null ? "" : value.toString(); | |||
| } | |||
| private Object replaceValue(String[] replace, String value) { | |||
| String[] temp; | |||
| for (String str : replace) { | |||
| temp = str.split("_"); | |||
| if (value.equals(temp[1])) { | |||
| value = temp[0]; | |||
| break; | |||
| } | |||
| } | |||
| return value; | |||
| } | |||
| private Object formatValue(Object value, ExcelExportEntity entity) | |||
| throws Exception { | |||
| Date temp = null; | |||
| if (value instanceof String) { | |||
| SimpleDateFormat format = new SimpleDateFormat( | |||
| entity.getDatabaseFormat()); | |||
| temp = format.parse(value.toString()); | |||
| } else if (value instanceof Date) { | |||
| temp = (Date) value; | |||
| } | |||
| if (temp != null) { | |||
| SimpleDateFormat format = new SimpleDateFormat(entity.getFormat()); | |||
| value = format.format(temp); | |||
| } | |||
| return value; | |||
| } | |||
| /** | |||
| * 创建List之后的各个Cells | |||
| * | |||
| @@ -543,54 +305,6 @@ public abstract class ExcelExportBase { | |||
| } | |||
| } | |||
| public short getRowHeight(List<ExcelExportEntity> excelParams) { | |||
| int maxHeight = 0; | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| maxHeight = maxHeight > excelParams.get(i).getHeight() ? maxHeight | |||
| : excelParams.get(i).getHeight(); | |||
| if (excelParams.get(i).getList() != null) { | |||
| for (int j = 0; j < excelParams.get(i).getList().size(); j++) { | |||
| maxHeight = maxHeight > excelParams.get(i).getList().get(j) | |||
| .getHeight() ? maxHeight : excelParams.get(i) | |||
| .getList().get(j).getHeight(); | |||
| } | |||
| } | |||
| } | |||
| return (short) (maxHeight * 50); | |||
| } | |||
| /** | |||
| * 对字段根据用户设置排序 | |||
| */ | |||
| public void sortAllParams(List<ExcelExportEntity> excelParams) { | |||
| Collections.sort(excelParams, new ComparatorExcelField()); | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| if (entity.getList() != null) { | |||
| Collections.sort(entity.getList(), new ComparatorExcelField()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 多个反射获取值 | |||
| * | |||
| * @param list | |||
| * @param t | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public Object getFieldBySomeMethod(List<Method> list, Object t) | |||
| throws Exception { | |||
| for (Method m : list) { | |||
| if (t == null) { | |||
| t = ""; | |||
| break; | |||
| } | |||
| t = m.invoke(t, new Object[] {}); | |||
| } | |||
| return t; | |||
| } | |||
| public void setCellWith(List<ExcelExportEntity> excelParams, Sheet sheet) { | |||
| int index = 0; | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| @@ -0,0 +1,314 @@ | |||
| package org.jeecgframework.poi.excel.export.base; | |||
| 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.Arrays; | |||
| import java.util.Collections; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| import org.apache.commons.lang.StringUtils; | |||
| import org.jeecgframework.poi.excel.annotation.Excel; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelCollection; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelEntity; | |||
| import org.jeecgframework.poi.excel.entity.params.ComparatorExcelField; | |||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
| import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | |||
| import org.jeecgframework.poi.util.POIPublicUtil; | |||
| /** | |||
| * 导出基础处理,不设计POI,只设计对象,保证复用性 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午11:01:32 | |||
| */ | |||
| public class ExportBase { | |||
| protected IExcelDataHandler dataHanlder; | |||
| protected List<String> needHanlderList; | |||
| /** | |||
| * 获取需要导出的全部字段 | |||
| * | |||
| * @param exclusions | |||
| * @param targetId | |||
| * 目标ID | |||
| * @param fields | |||
| * @throws Exception | |||
| */ | |||
| public void getAllExcelField(String[] exclusions, String targetId, | |||
| Field[] fields, List<ExcelExportEntity> excelParams, | |||
| Class<?> pojoClass, List<Method> getMethods) throws Exception { | |||
| List<String> exclusionsList = exclusions != null ? Arrays | |||
| .asList(exclusions) : null; | |||
| ExcelExportEntity excelEntity; | |||
| // 遍历整个filed | |||
| for (int i = 0; i < fields.length; i++) { | |||
| Field field = fields[i]; | |||
| // 先判断是不是collection,在判断是不是java自带对象,之后就是我们自己的对象了 | |||
| if (POIPublicUtil.isNotUserExcelUserThis(exclusionsList, field, | |||
| targetId)) { | |||
| continue; | |||
| } | |||
| if (POIPublicUtil.isCollection(field.getType())) { | |||
| ExcelCollection excel = field | |||
| .getAnnotation(ExcelCollection.class); | |||
| ParameterizedType pt = (ParameterizedType) field | |||
| .getGenericType(); | |||
| Class<?> clz = (Class<?>) pt.getActualTypeArguments()[0]; | |||
| List<ExcelExportEntity> list = new ArrayList<ExcelExportEntity>(); | |||
| getAllExcelField(exclusions, | |||
| StringUtils.isNotEmpty(excel.id()) ? excel.id() | |||
| : targetId, POIPublicUtil.getClassFields(clz), | |||
| list, clz, null); | |||
| excelEntity = new ExcelExportEntity(); | |||
| excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
| excelEntity | |||
| .setOrderNum(getCellOrder(excel.orderNum(), targetId)); | |||
| excelEntity.setMethod(POIPublicUtil.getMethod(field.getName(), | |||
| pojoClass)); | |||
| excelEntity.setList(list); | |||
| excelParams.add(excelEntity); | |||
| } else if (POIPublicUtil.isJavaClass(field)) { | |||
| excelParams.add(createExcelExportEntity(field, targetId, | |||
| pojoClass, getMethods)); | |||
| } else { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| if (getMethods != null) { | |||
| newMethods.addAll(getMethods); | |||
| } | |||
| newMethods.add(POIPublicUtil.getMethod(field.getName(), | |||
| pojoClass)); | |||
| ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | |||
| getAllExcelField(exclusions, | |||
| StringUtils.isNotEmpty(excel.id()) ? excel.id() | |||
| : targetId, POIPublicUtil.getClassFields(field | |||
| .getType()), excelParams, field.getType(), | |||
| newMethods); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 创建导出实体对象 | |||
| * | |||
| * @param field | |||
| * @param targetId | |||
| * @param pojoClass | |||
| * @param getMethods | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| private ExcelExportEntity createExcelExportEntity(Field field, | |||
| String targetId, Class<?> pojoClass, List<Method> getMethods) | |||
| throws Exception { | |||
| Excel excel = field.getAnnotation(Excel.class); | |||
| ExcelExportEntity excelEntity = new ExcelExportEntity(); | |||
| excelEntity.setType(excel.type()); | |||
| 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); | |||
| } | |||
| return excelEntity; | |||
| } | |||
| /** | |||
| * 判断在这个单元格显示的名称 | |||
| * | |||
| * @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; | |||
| } | |||
| /** | |||
| * 获取这个字段的顺序 | |||
| * | |||
| * @param orderNum | |||
| * @param targetId | |||
| * @return | |||
| */ | |||
| public int getCellOrder(String orderNum, String targetId) { | |||
| if (isInteger(orderNum) || targetId == null) { | |||
| return Integer.valueOf(orderNum); | |||
| } | |||
| String[] arr = orderNum.split(","); | |||
| String[] temp; | |||
| for (String str : arr) { | |||
| temp = str.split("_"); | |||
| if (targetId.equals(temp[1])) { | |||
| return Integer.valueOf(temp[0]); | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| /** | |||
| * 判断字符串是否是整数 | |||
| */ | |||
| public boolean isInteger(String value) { | |||
| try { | |||
| Integer.parseInt(value); | |||
| return true; | |||
| } catch (NumberFormatException e) { | |||
| return false; | |||
| } | |||
| } | |||
| /** | |||
| * 注解到导出对象的转换 | |||
| * | |||
| * @param targetId | |||
| * @param field | |||
| * @param excelEntity | |||
| * @param excel | |||
| * @param pojoClass | |||
| * @throws Exception | |||
| */ | |||
| private void getExcelField(String targetId, Field field, | |||
| ExcelExportEntity excelEntity, Excel excel, Class<?> pojoClass) | |||
| throws Exception { | |||
| excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
| excelEntity.setWidth(excel.width()); | |||
| excelEntity.setHeight(excel.height()); | |||
| excelEntity.setNeedMerge(excel.needMerge()); | |||
| excelEntity.setMergeVertical(excel.mergeVertical()); | |||
| excelEntity.setMergeRely(excel.mergeRely()); | |||
| excelEntity.setReplace(excel.replace()); | |||
| excelEntity.setOrderNum(getCellOrder(excel.orderNum(), targetId)); | |||
| excelEntity.setWrap(excel.isWrap()); | |||
| excelEntity.setExportImageType(excel.imageType()); | |||
| excelEntity.setDatabaseFormat(excel.databaseFormat()); | |||
| excelEntity | |||
| .setFormat(StringUtils.isNotEmpty(excel.exportFormat()) ? excel | |||
| .exportFormat() : excel.format()); | |||
| String fieldname = field.getName(); | |||
| excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass)); | |||
| } | |||
| /** | |||
| * 根据注解获取行高 | |||
| * @param excelParams | |||
| * @return | |||
| */ | |||
| public short getRowHeight(List<ExcelExportEntity> excelParams) { | |||
| int maxHeight = 0; | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| maxHeight = maxHeight > excelParams.get(i).getHeight() ? maxHeight | |||
| : excelParams.get(i).getHeight(); | |||
| if (excelParams.get(i).getList() != null) { | |||
| for (int j = 0; j < excelParams.get(i).getList().size(); j++) { | |||
| maxHeight = maxHeight > excelParams.get(i).getList().get(j) | |||
| .getHeight() ? maxHeight : excelParams.get(i) | |||
| .getList().get(j).getHeight(); | |||
| } | |||
| } | |||
| } | |||
| return (short) (maxHeight * 50); | |||
| } | |||
| /** | |||
| * 对字段根据用户设置排序 | |||
| */ | |||
| public void sortAllParams(List<ExcelExportEntity> excelParams) { | |||
| Collections.sort(excelParams, new ComparatorExcelField()); | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| if (entity.getList() != null) { | |||
| Collections.sort(entity.getList(), new ComparatorExcelField()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 获取填如这个cell的值,提供一些附加功能 | |||
| * | |||
| * @param entity | |||
| * @param obj | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public Object getCellValue(ExcelExportEntity entity, Object obj) | |||
| throws Exception { | |||
| Object value = entity.getMethods() != null ? getFieldBySomeMethod( | |||
| entity.getMethods(), obj) : entity.getMethod().invoke(obj, | |||
| new Object[] {}); | |||
| if (needHanlderList != null | |||
| && needHanlderList.contains(entity.getName())) { | |||
| value = dataHanlder.exportHandler(obj, entity.getName(), value); | |||
| } else if (StringUtils.isNotEmpty(entity.getFormat())) { | |||
| value = formatValue(value, entity); | |||
| } else if (entity.getReplace() != null | |||
| && entity.getReplace().length > 0) { | |||
| value = replaceValue(entity.getReplace(), String.valueOf(value)); | |||
| } | |||
| return value == null ? "" : value.toString(); | |||
| } | |||
| private Object replaceValue(String[] replace, String value) { | |||
| String[] temp; | |||
| for (String str : replace) { | |||
| temp = str.split("_"); | |||
| if (value.equals(temp[1])) { | |||
| value = temp[0]; | |||
| break; | |||
| } | |||
| } | |||
| return value; | |||
| } | |||
| private Object formatValue(Object value, ExcelExportEntity entity) | |||
| throws Exception { | |||
| Date temp = null; | |||
| if (value instanceof String) { | |||
| SimpleDateFormat format = new SimpleDateFormat( | |||
| entity.getDatabaseFormat()); | |||
| temp = format.parse(value.toString()); | |||
| } else if (value instanceof Date) { | |||
| temp = (Date) value; | |||
| } | |||
| if (temp != null) { | |||
| SimpleDateFormat format = new SimpleDateFormat(entity.getFormat()); | |||
| value = format.format(temp); | |||
| } | |||
| return value; | |||
| } | |||
| /** | |||
| * 多个反射获取值 | |||
| * | |||
| * @param list | |||
| * @param t | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public Object getFieldBySomeMethod(List<Method> list, Object t) | |||
| throws Exception { | |||
| for (Method m : list) { | |||
| if (t == null) { | |||
| t = ""; | |||
| break; | |||
| } | |||
| t = m.invoke(t, new Object[] {}); | |||
| } | |||
| return t; | |||
| } | |||
| } | |||
| @@ -19,7 +19,7 @@ import org.jeecgframework.poi.cache.ExcelCache; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelTarget; | |||
| import org.jeecgframework.poi.excel.entity.TemplateExportParams; | |||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
| import org.jeecgframework.poi.excel.export.ExcelExportBase; | |||
| import org.jeecgframework.poi.excel.export.base.ExcelExportBase; | |||
| import org.jeecgframework.poi.exception.excel.ExcelExportException; | |||
| import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; | |||
| import org.jeecgframework.poi.util.POIPublicUtil; | |||
| @@ -0,0 +1,27 @@ | |||
| package org.jeecgframework.poi.exception.word; | |||
| import org.jeecgframework.poi.exception.word.enmus.WordExportEnum; | |||
| /** | |||
| * word导出异常 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午10:32:51 | |||
| */ | |||
| public class WordExportException extends RuntimeException { | |||
| private static final long serialVersionUID = 1L; | |||
| public WordExportException() { | |||
| super(); | |||
| } | |||
| public WordExportException(String msg) { | |||
| super(msg); | |||
| } | |||
| public WordExportException(WordExportEnum exception) { | |||
| super(exception.getMsg()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| package org.jeecgframework.poi.exception.word.enmus; | |||
| /** | |||
| * 导出异常枚举 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午10:34:58 | |||
| */ | |||
| public enum WordExportEnum { | |||
| EXCEL_PARAMS_ERROR("Excel 导出 参数错误"), | |||
| EXCEL_HEAD_HAVA_NULL("Excel 表头 有的字段为空"), | |||
| EXCEL_NO_HEAD("Excel 没有表头"); | |||
| private String msg; | |||
| WordExportEnum(String msg) { | |||
| this.msg = msg; | |||
| } | |||
| public String getMsg() { | |||
| return msg; | |||
| } | |||
| public void setMsg(String msg) { | |||
| this.msg = msg; | |||
| } | |||
| } | |||
| @@ -29,6 +29,7 @@ public abstract class ExcelDataHandlerDefaultImpl implements IExcelDataHandler { | |||
| return needHandlerFields; | |||
| } | |||
| @Override | |||
| public void setNeedHandlerFields(String[] needHandlerFields) { | |||
| this.needHandlerFields = needHandlerFields; | |||
| } | |||
| @@ -9,13 +9,14 @@ package org.jeecgframework.poi.handler.inter; | |||
| public interface IExcelDataHandler { | |||
| /** | |||
| * 获取需要处理的字段,导入和导出统一处理了, | |||
| * 减少书写的字段 | |||
| * 获取需要处理的字段,导入和导出统一处理了, 减少书写的字段 | |||
| * | |||
| * @return | |||
| */ | |||
| public String[] getNeedHandlerFields(); | |||
| public void setNeedHandlerFields(String[] fields); | |||
| /** | |||
| * 导出处理方法 | |||
| * | |||
| @@ -1,12 +1,22 @@ | |||
| package org.jeecgframework.poi.handler.inter; | |||
| import org.jeecgframework.poi.excel.entity.result.ExcelVerifyHanlderResult; | |||
| /** | |||
| * 导入校验接口 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年6月23日 下午11:08:21 | |||
| */ | |||
| public interface IExcelVerifyHandler { | |||
| /** | |||
| * 获取需要处理的字段,导入和导出统一处理了, 减少书写的字段 | |||
| * | |||
| * @return | |||
| */ | |||
| public String[] getNeedVerifyFields(); | |||
| /** | |||
| * 导出处理方法 | |||
| * | |||
| @@ -21,4 +31,11 @@ public interface IExcelVerifyHandler { | |||
| public ExcelVerifyHanlderResult verifyHandler(Object obj, String name, | |||
| Object value); | |||
| /** | |||
| * 获取需要处理的字段,导入和导出统一处理了, 减少书写的字段 | |||
| * | |||
| * @return | |||
| */ | |||
| public void setNeedVerifyFields(String[] arr); | |||
| } | |||
| @@ -1,12 +1,14 @@ | |||
| package org.jeecgframework.poi.word.entity; | |||
| /** | |||
| * word导出,图片设置和图片信息 | |||
| * | |||
| * @author JueYue | |||
| * @date 2013-11-17 | |||
| * @version 1.0 | |||
| */ | |||
| public class WordImageEntity { | |||
| public static String URL = "url"; | |||
| public static String Data = "data"; | |||
| /** | |||
| @@ -17,13 +19,30 @@ public class WordImageEntity { | |||
| * 图片宽度 | |||
| */ | |||
| private int width; | |||
| //图片高度 | |||
| // 图片高度 | |||
| private int height; | |||
| //图片地址 | |||
| // 图片地址 | |||
| private String url; | |||
| //图片信息 | |||
| // 图片信息 | |||
| private byte[] data; | |||
| public WordImageEntity() { | |||
| } | |||
| public WordImageEntity(String url, int width, int height) { | |||
| this.url = url; | |||
| this.width = width; | |||
| this.height = height; | |||
| } | |||
| public WordImageEntity(byte[] data, int width, int height) { | |||
| this.data = data; | |||
| this.width = width; | |||
| this.height = height; | |||
| this.type = Data; | |||
| } | |||
| public String getType() { | |||
| return type; | |||
| } | |||
| @@ -0,0 +1,69 @@ | |||
| package org.jeecgframework.poi.word.entity.params; | |||
| import java.util.List; | |||
| import org.jeecgframework.poi.excel.entity.ExcelBaseParams; | |||
| import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | |||
| /** | |||
| * Excel 导出对象 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午10:21:13 | |||
| */ | |||
| public class ExcelListEntity extends ExcelBaseParams { | |||
| public ExcelListEntity() { | |||
| } | |||
| public ExcelListEntity(List<?> list, Class<?> clazz) { | |||
| this.list = list; | |||
| this.clazz = clazz; | |||
| } | |||
| public ExcelListEntity(List<?> list, Class<?> clazz, | |||
| IExcelDataHandler dataHanlder) { | |||
| this.list = list; | |||
| this.clazz = clazz; | |||
| setDataHanlder(dataHanlder); | |||
| } | |||
| /** | |||
| * 数据源 | |||
| */ | |||
| private List<?> list; | |||
| /** | |||
| * 实体类对象 | |||
| */ | |||
| private Class<?> clazz; | |||
| /** | |||
| * 过滤的属性 | |||
| */ | |||
| private String[] exclusions; | |||
| public List<?> getList() { | |||
| return list; | |||
| } | |||
| public void setList(List<?> list) { | |||
| this.list = list; | |||
| } | |||
| public Class<?> getClazz() { | |||
| return clazz; | |||
| } | |||
| public void setClazz(Class<?> clazz) { | |||
| this.clazz = clazz; | |||
| } | |||
| public String[] getExclusions() { | |||
| return exclusions; | |||
| } | |||
| public void setExclusions(String[] exclusions) { | |||
| this.exclusions = exclusions; | |||
| } | |||
| } | |||
| @@ -0,0 +1,78 @@ | |||
| package org.jeecgframework.poi.word.entity.params; | |||
| /** | |||
| * Excel 对象导出结构 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年7月26日 下午11:14:48 | |||
| */ | |||
| public class ListParamEntity { | |||
| // 唯一值,在遍历中重复使用 | |||
| public static final String SINGLE = "single"; | |||
| // 属于数组类型 | |||
| public static final String LIST = "list"; | |||
| /** | |||
| * 属性名称 | |||
| */ | |||
| private String name; | |||
| /** | |||
| * 目标 | |||
| */ | |||
| private String target; | |||
| /** | |||
| * 当是唯一值的时候直接求出值 | |||
| */ | |||
| private Object value; | |||
| /** | |||
| * 数据类型,SINGLE || LIST | |||
| */ | |||
| private String type; | |||
| public ListParamEntity() { | |||
| } | |||
| public ListParamEntity(String name, String target) { | |||
| this.name = name; | |||
| this.target = target; | |||
| this.type = LIST; | |||
| } | |||
| public ListParamEntity(String name, Object value) { | |||
| this.name = name; | |||
| this.value = value; | |||
| this.type = LIST; | |||
| } | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| public String getTarget() { | |||
| return target; | |||
| } | |||
| public void setTarget(String target) { | |||
| this.target = target; | |||
| } | |||
| public String getType() { | |||
| return type; | |||
| } | |||
| public void setType(String type) { | |||
| this.type = type; | |||
| } | |||
| public Object getValue() { | |||
| return value; | |||
| } | |||
| public void setValue(Object value) { | |||
| this.value = value; | |||
| } | |||
| } | |||
| @@ -14,6 +14,9 @@ import org.apache.poi.xwpf.usermodel.XWPFTableRow; | |||
| import org.jeecgframework.poi.cache.WordCache; | |||
| import org.jeecgframework.poi.word.entity.JeecgXWPFDocument; | |||
| import org.jeecgframework.poi.word.entity.WordImageEntity; | |||
| import org.jeecgframework.poi.word.entity.params.ExcelListEntity; | |||
| import org.jeecgframework.poi.word.parse.excel.ExcelEntityParse; | |||
| import org.jeecgframework.poi.word.parse.excel.ExcelMapParse; | |||
| import org.jeecgframework.poi.word.util.ParseWordUtil; | |||
| /** | |||
| @@ -23,7 +26,7 @@ import org.jeecgframework.poi.word.util.ParseWordUtil; | |||
| * @date 2013-11-16 | |||
| * @version 1.0 | |||
| */ | |||
| @SuppressWarnings({"unchecked","rawtypes"}) | |||
| @SuppressWarnings({ "unchecked", "rawtypes" }) | |||
| public class ParseWord07 { | |||
| /** | |||
| @@ -34,28 +37,31 @@ public class ParseWord07 { | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public XWPFDocument parseWord(String url, Map<String, Object> map) | |||
| public XWPFDocument parseWord(String url, Map<String, Object> map) | |||
| throws Exception { | |||
| JeecgXWPFDocument doc = WordCache.getXWPFDocumen(url); | |||
| parseWordSetValue(doc, map); | |||
| return doc; | |||
| } | |||
| /** | |||
| * 按用户模板导出 | |||
| * @param document | |||
| * @param map | |||
| * 解析07版的Word并且进行赋值 | |||
| * | |||
| * @Author JueYue | |||
| * @date 2013-11-16 | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public void parseWord(XWPFDocument document, Map<String, Object> map) throws Exception { | |||
| parseWordSetValue((JeecgXWPFDocument)document, map); | |||
| public void parseWord(XWPFDocument document, Map<String, Object> map) | |||
| throws Exception { | |||
| parseWordSetValue((JeecgXWPFDocument) document, map); | |||
| } | |||
| private void parseWordSetValue(JeecgXWPFDocument doc, | |||
| private void parseWordSetValue(JeecgXWPFDocument doc, | |||
| Map<String, Object> map) throws Exception { | |||
| //第一步解析文档 | |||
| parseAllParagraphic(doc.getParagraphs(),map); | |||
| //第二步解析所有表格 | |||
| // 第一步解析文档 | |||
| parseAllParagraphic(doc.getParagraphs(), map); | |||
| // 第二步解析所有表格 | |||
| XWPFTable table; | |||
| Iterator<XWPFTable> itTable = doc.getTablesIterator(); | |||
| while (itTable.hasNext()) { | |||
| @@ -64,18 +70,19 @@ public class ParseWord07 { | |||
| parseThisTable(table, map); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 解析所有的文本 | |||
| *@Author JueYue | |||
| *@date 2013-11-17 | |||
| *@param paragraphs | |||
| *@param map | |||
| * | |||
| * @Author JueYue | |||
| * @date 2013-11-17 | |||
| * @param paragraphs | |||
| * @param map | |||
| */ | |||
| private void parseAllParagraphic(List<XWPFParagraph> paragraphs, | |||
| Map<String, Object> map) throws Exception { | |||
| private void parseAllParagraphic(List<XWPFParagraph> paragraphs, | |||
| Map<String, Object> map) throws Exception { | |||
| XWPFParagraph paragraph; | |||
| for (int i = 0; i < paragraphs.size(); i++) { | |||
| paragraph = paragraphs.get(i); | |||
| @@ -84,7 +91,7 @@ public class ParseWord07 { | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| @@ -95,92 +102,59 @@ public class ParseWord07 { | |||
| * @param table | |||
| * @param map | |||
| */ | |||
| private void parseThisTable(XWPFTable table, Map<String, Object> map) throws Exception { | |||
| private void parseThisTable(XWPFTable table, Map<String, Object> map) | |||
| throws Exception { | |||
| XWPFTableRow row; | |||
| List<XWPFTableCell> cells; | |||
| Object listobj; | |||
| for (int i = 0; i < table.getNumberOfRows(); i++) { | |||
| row = table.getRow(i); | |||
| cells = row.getTableCells(); | |||
| if(cells.size() == 1){ | |||
| listobj = checkThisTableIsNeedIterator(cells.get(0),map); | |||
| if(listobj==null){ | |||
| parseThisRow(cells,map); | |||
| }else{ | |||
| table.removeRow(i);//删除这一行 | |||
| parseNextRowAndAddRow(table,i,(List) listobj); | |||
| } | |||
| }else{ | |||
| parseThisRow(cells,map); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 解析下一行,并且生成更多的行 | |||
| *@Author JueYue | |||
| *@date 2013-11-18 | |||
| *@param table | |||
| *@param listobj2 | |||
| */ | |||
| private void parseNextRowAndAddRow(XWPFTable table,int index, List<Object> list) throws Exception { | |||
| XWPFTableRow currentRow = table.getRow(index); | |||
| String[] params = parseCurrentRowGetParams(currentRow); | |||
| table.removeRow(index);//移除这一行 | |||
| int cellIndex = 0;//创建完成对象一行好像多了一个cell | |||
| for(Object obj :list){ | |||
| currentRow = table.createRow(); | |||
| for(cellIndex = 0;cellIndex<currentRow.getTableCells().size();cellIndex++){ | |||
| currentRow.getTableCells().get(cellIndex).setText( | |||
| ParseWordUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0).toString()); | |||
| ExcelEntityParse excelEntityParse = new ExcelEntityParse(); | |||
| for (int i = 0; i < table.getNumberOfRows(); i++) { | |||
| row = table.getRow(i); | |||
| cells = row.getTableCells(); | |||
| if (cells.size() == 1) { | |||
| listobj = checkThisTableIsNeedIterator(cells.get(0), map); | |||
| if (listobj == null) { | |||
| parseThisRow(cells, map); | |||
| } else if (listobj instanceof ExcelListEntity) { | |||
| table.removeRow(i);// 删除这一行 | |||
| excelEntityParse.parseNextRowAndAddRow(table, i, | |||
| (ExcelListEntity) listobj); | |||
| } else { | |||
| table.removeRow(i);// 删除这一行 | |||
| ExcelMapParse.parseNextRowAndAddRow(table, i, | |||
| (List) listobj); | |||
| } | |||
| } else { | |||
| parseThisRow(cells, map); | |||
| } | |||
| for (;cellIndex<params.length;cellIndex++) { | |||
| currentRow.createCell().setText( | |||
| ParseWordUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0).toString()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 解析参数行,获取参数列表 | |||
| *@Author JueYue | |||
| *@date 2013-11-18 | |||
| *@param currentRow | |||
| *@return | |||
| */ | |||
| private String[] parseCurrentRowGetParams(XWPFTableRow currentRow) { | |||
| List<XWPFTableCell> cells = currentRow.getTableCells(); | |||
| String[] params = new String[cells.size()]; | |||
| String text; | |||
| for (int i=0;i<cells.size();i++) { | |||
| text = cells.get(i).getText(); | |||
| params[i] = text==null?"":text.trim().replace("{{","").replace("}}",""); | |||
| } | |||
| return params; | |||
| } | |||
| private void parseThisRow(List<XWPFTableCell> cells, | |||
| Map<String, Object> map) throws Exception { | |||
| private void parseThisRow(List<XWPFTableCell> cells, Map<String, Object> map) | |||
| throws Exception { | |||
| for (XWPFTableCell cell : cells) { | |||
| parseAllParagraphic(cell.getParagraphs(),map); | |||
| } | |||
| parseAllParagraphic(cell.getParagraphs(), map); | |||
| } | |||
| } | |||
| /** | |||
| *判断是不是迭代输出 | |||
| *@Author JueYue | |||
| *@date 2013-11-18 | |||
| *@return | |||
| * @throws Exception | |||
| * 判断是不是迭代输出 | |||
| * | |||
| * @Author JueYue | |||
| * @date 2013-11-18 | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| private Object checkThisTableIsNeedIterator(XWPFTableCell cell | |||
| , Map<String, Object> map) throws Exception { | |||
| private Object checkThisTableIsNeedIterator(XWPFTableCell cell, | |||
| Map<String, Object> map) throws Exception { | |||
| String text = cell.getText().trim(); | |||
| //判断是不是迭代输出 | |||
| if(text.startsWith("{{")&&text.endsWith("}}")&&text.indexOf("in ")!=-1){ | |||
| return ParseWordUtil.getRealValue(text.replace("in ", "").trim(),map); | |||
| // 判断是不是迭代输出 | |||
| if (text.startsWith("{{") && text.endsWith("}}") | |||
| && text.indexOf("in ") != -1) { | |||
| /*text = text.replace("{{", "").replace("}}", "") | |||
| .replaceAll("\\s{1,}", " ").trim();*/ | |||
| return ParseWordUtil.getRealValue(text.replace("in ", "").trim(), | |||
| map); | |||
| } | |||
| return null; | |||
| } | |||
| @@ -193,8 +167,8 @@ public class ParseWord07 { | |||
| * @param paragraph | |||
| * @param map | |||
| */ | |||
| private void parseThisParagraph(XWPFParagraph paragraph, | |||
| Map<String, Object> map) throws Exception { | |||
| private void parseThisParagraph(XWPFParagraph paragraph, | |||
| Map<String, Object> map) throws Exception { | |||
| XWPFRun run; | |||
| XWPFRun currentRun = null;// 拿到的第一个run,用来set值,可以保存格式 | |||
| String currentText = "";// 存放当前的text | |||
| @@ -225,7 +199,7 @@ public class ParseWord07 { | |||
| currentText = text; | |||
| isfinde = true; | |||
| currentRun = run; | |||
| }else{ | |||
| } else { | |||
| currentText = ""; | |||
| } | |||
| if (currentText.indexOf("}}") != -1) { | |||
| @@ -243,16 +217,16 @@ public class ParseWord07 { | |||
| * @Author JueYue | |||
| * @date 2013-11-16 | |||
| */ | |||
| private void changeValues(XWPFParagraph paragraph, | |||
| XWPFRun currentRun, String currentText, List<Integer> runIndex, | |||
| Map<String, Object> map) throws Exception { | |||
| private void changeValues(XWPFParagraph paragraph, XWPFRun currentRun, | |||
| String currentText, List<Integer> runIndex, Map<String, Object> map) | |||
| throws Exception { | |||
| Object obj = ParseWordUtil.getRealValue(currentText, map); | |||
| if(obj instanceof WordImageEntity){//如果是图片就设置为图片 | |||
| if (obj instanceof WordImageEntity) {// 如果是图片就设置为图片 | |||
| currentRun.setText("", 0); | |||
| addAnImage((WordImageEntity)obj,currentRun); | |||
| }else{ | |||
| addAnImage((WordImageEntity) obj, currentRun); | |||
| } else { | |||
| currentText = obj.toString(); | |||
| currentRun.setText(currentText,0); | |||
| currentRun.setText(currentText, 0); | |||
| } | |||
| for (int k = 0; k < runIndex.size(); k++) { | |||
| paragraph.getRuns().get(runIndex.get(k)).setText("", 0); | |||
| @@ -262,28 +236,38 @@ public class ParseWord07 { | |||
| /** | |||
| * 添加图片 | |||
| *@Author JueYue | |||
| *@date 2013-11-20 | |||
| *@param obj | |||
| *@param currentRun | |||
| * @throws Exception | |||
| * | |||
| * @Author JueYue | |||
| * @date 2013-11-20 | |||
| * @param obj | |||
| * @param currentRun | |||
| * @throws Exception | |||
| */ | |||
| private void addAnImage(WordImageEntity obj, XWPFRun currentRun) throws Exception { | |||
| Object [] isAndType = ParseWordUtil.getIsAndType(obj); | |||
| private void addAnImage(WordImageEntity obj, XWPFRun currentRun) | |||
| throws Exception { | |||
| Object[] isAndType = ParseWordUtil.getIsAndType(obj); | |||
| String picId; | |||
| try { | |||
| picId = currentRun.getParagraph().getDocument().addPictureData( | |||
| (byte[]) isAndType[0], | |||
| (Integer) isAndType[1]); | |||
| ((JeecgXWPFDocument) currentRun.getParagraph().getDocument()).createPicture( | |||
| currentRun,picId, | |||
| currentRun.getParagraph().getDocument().getNextPicNameNumber((Integer) isAndType[1]), | |||
| obj.getWidth(),obj.getHeight()); | |||
| picId = currentRun | |||
| .getParagraph() | |||
| .getDocument() | |||
| .addPictureData((byte[]) isAndType[0], | |||
| (Integer) isAndType[1]); | |||
| ((JeecgXWPFDocument) currentRun.getParagraph().getDocument()) | |||
| .createPicture( | |||
| currentRun, | |||
| picId, | |||
| currentRun | |||
| .getParagraph() | |||
| .getDocument() | |||
| .getNextPicNameNumber( | |||
| (Integer) isAndType[1]), | |||
| obj.getWidth(), obj.getHeight()); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,208 @@ | |||
| package org.jeecgframework.poi.word.parse.excel; | |||
| import java.lang.reflect.Field; | |||
| import java.util.ArrayList; | |||
| import java.util.Collection; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang.StringUtils; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTable; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTableCell; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTableRow; | |||
| import org.jeecgframework.poi.excel.annotation.ExcelTarget; | |||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
| import org.jeecgframework.poi.excel.export.base.ExportBase; | |||
| import org.jeecgframework.poi.exception.word.WordExportException; | |||
| import org.jeecgframework.poi.exception.word.enmus.WordExportEnum; | |||
| import org.jeecgframework.poi.util.POIPublicUtil; | |||
| import org.jeecgframework.poi.word.entity.params.ExcelListEntity; | |||
| /** | |||
| * 解析实体类对象 复用注解 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午10:30:57 | |||
| */ | |||
| public class ExcelEntityParse extends ExportBase { | |||
| /** | |||
| * 解析上一行并生成更多行 | |||
| * | |||
| * @param table | |||
| * @param i | |||
| * @param listobj | |||
| */ | |||
| public void parseNextRowAndAddRow(XWPFTable table, int index, | |||
| ExcelListEntity entity) { | |||
| checkExcelParams(entity); | |||
| // 获取表头数据 | |||
| Map<String, Integer> titlemap = getTitleMap(table, index); | |||
| try { | |||
| // 得到所有字段 | |||
| Field fileds[] = POIPublicUtil.getClassFields(entity.getClazz()); | |||
| ExcelTarget etarget = entity.getClazz().getAnnotation( | |||
| ExcelTarget.class); | |||
| String targetId = null; | |||
| if (etarget != null) { | |||
| targetId = etarget.value(); | |||
| } | |||
| // 获取实体对象的导出数据 | |||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||
| getAllExcelField(null, targetId, fileds, excelParams, | |||
| entity.getClazz(), null); | |||
| // 根据表头进行筛选排序 | |||
| sortAndFilterExportField(excelParams, titlemap); | |||
| short rowHeight = getRowHeight(excelParams); | |||
| Iterator<?> its = entity.getList().iterator(); | |||
| while (its.hasNext()) { | |||
| Object t = its.next(); | |||
| index += createCells(index, t, excelParams, table, rowHeight); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| private int createCells(int index, Object t, | |||
| List<ExcelExportEntity> excelParams, XWPFTable table, | |||
| short rowHeight) throws Exception { | |||
| ExcelExportEntity entity; | |||
| XWPFTableRow row = table.createRow(); | |||
| row.setHeight(rowHeight); | |||
| int maxHeight = 1, cellNum = 0; | |||
| for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| if (entity.getList() != null) { | |||
| Collection<?> list = (Collection<?>) entity.getMethod().invoke( | |||
| t, new Object[] {}); | |||
| int listC = 0; | |||
| for (Object obj : list) { | |||
| createListCells(index + listC, cellNum, obj, | |||
| entity.getList(), table); | |||
| listC++; | |||
| } | |||
| cellNum += entity.getList().size(); | |||
| if (list != null && list.size() > maxHeight) { | |||
| maxHeight = list.size(); | |||
| } | |||
| } else { | |||
| Object value = getCellValue(entity, t); | |||
| if (entity.getType() == 1) { | |||
| setCellValue(row, value, cellNum++); | |||
| } | |||
| } | |||
| } | |||
| // 合并需要合并的单元格 | |||
| cellNum = 0; | |||
| for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| if (entity.getList() != null) { | |||
| cellNum += entity.getList().size(); | |||
| } else if (entity.isNeedMerge()) { | |||
| table.setCellMargins(index, index + maxHeight - 1, cellNum, | |||
| cellNum); | |||
| cellNum++; | |||
| } | |||
| } | |||
| return maxHeight; | |||
| } | |||
| /** | |||
| * 创建List之后的各个Cells | |||
| * | |||
| * @param styles | |||
| */ | |||
| public void createListCells(int index, int cellNum, Object obj, | |||
| List<ExcelExportEntity> excelParams, XWPFTable table) | |||
| throws Exception { | |||
| ExcelExportEntity entity; | |||
| XWPFTableRow row; | |||
| if (table.getRow(index) == null) { | |||
| row = table.createRow(); | |||
| row.setHeight(getRowHeight(excelParams)); | |||
| } else { | |||
| row = table.getRow(index); | |||
| } | |||
| for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| Object value = getCellValue(entity, obj); | |||
| if (entity.getType() == 1) { | |||
| setCellValue(row, value, cellNum++); | |||
| } | |||
| } | |||
| } | |||
| private void setCellValue(XWPFTableRow row, Object value, int cellNum) { | |||
| if (row.getCell(cellNum++) != null) { | |||
| row.getCell(cellNum - 1).setText( | |||
| value == null ? "" : value.toString()); | |||
| } else { | |||
| row.createCell().setText(value == null ? "" : value.toString()); | |||
| } | |||
| } | |||
| /** | |||
| * 对导出序列进行排序和塞选 | |||
| * | |||
| * @param excelParams | |||
| * @param titlemap | |||
| * @return | |||
| */ | |||
| private void sortAndFilterExportField(List<ExcelExportEntity> excelParams, | |||
| Map<String, Integer> titlemap) { | |||
| for (int i = excelParams.size() - 1; i >= 0; i--) { | |||
| if (excelParams.get(i).getList() != null | |||
| && excelParams.get(i).getList().size() > 0) { | |||
| sortAndFilterExportField(excelParams.get(i).getList(), titlemap); | |||
| if (excelParams.get(i).getList().size() == 0) { | |||
| excelParams.remove(i); | |||
| } else { | |||
| excelParams.get(i).setOrderNum(i); | |||
| } | |||
| } else { | |||
| if (titlemap.containsKey(excelParams.get(i).getName())) { | |||
| excelParams.get(i).setOrderNum(i); | |||
| } else { | |||
| excelParams.remove(i); | |||
| } | |||
| } | |||
| } | |||
| sortAllParams(excelParams); | |||
| } | |||
| /** | |||
| * 获取表头数据 | |||
| * | |||
| * @param table | |||
| * @param index | |||
| * @return | |||
| */ | |||
| private Map<String, Integer> getTitleMap(XWPFTable table, int index) { | |||
| if (index == 0) { | |||
| throw new WordExportException(WordExportEnum.EXCEL_NO_HEAD); | |||
| } | |||
| List<XWPFTableCell> cells = table.getRow(index - 1).getTableCells(); | |||
| Map<String, Integer> map = new HashMap<String, Integer>(cells.size()); | |||
| String text; | |||
| for (int i = 0; i < cells.size(); i++) { | |||
| text = cells.get(i).getText(); | |||
| if (StringUtils.isEmpty(text)) { | |||
| throw new WordExportException( | |||
| WordExportEnum.EXCEL_HEAD_HAVA_NULL); | |||
| } | |||
| map.put(text, i); | |||
| } | |||
| return map; | |||
| } | |||
| private static void checkExcelParams(ExcelListEntity entity) { | |||
| if (entity.getList() == null || entity.getClazz() == null) { | |||
| throw new WordExportException(WordExportEnum.EXCEL_PARAMS_ERROR); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,71 @@ | |||
| package org.jeecgframework.poi.word.parse.excel; | |||
| import java.util.List; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTable; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTableCell; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTableRow; | |||
| import org.jeecgframework.poi.word.util.ParseWordUtil; | |||
| /** | |||
| * 处理和生成Map 类型的数据变成表格 | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午10:28:46 | |||
| */ | |||
| public final class ExcelMapParse { | |||
| /** | |||
| * 解析下一行,并且生成更多的行 | |||
| * | |||
| * @Author JueYue | |||
| * @date 2013-11-18 | |||
| * @param table | |||
| * @param listobj2 | |||
| */ | |||
| public static void parseNextRowAndAddRow(XWPFTable table, int index, | |||
| List<Object> list) throws Exception { | |||
| XWPFTableRow currentRow = table.getRow(index); | |||
| String[] params = parseCurrentRowGetParams(currentRow); | |||
| table.removeRow(index);// 移除这一行 | |||
| int cellIndex = 0;// 创建完成对象一行好像多了一个cell | |||
| for (Object obj : list) { | |||
| currentRow = table.createRow(); | |||
| for (cellIndex = 0; cellIndex < currentRow.getTableCells().size(); cellIndex++) { | |||
| currentRow | |||
| .getTableCells() | |||
| .get(cellIndex) | |||
| .setText( | |||
| ParseWordUtil.getValueDoWhile(obj, | |||
| params[cellIndex].split("\\."), 0) | |||
| .toString()); | |||
| } | |||
| for (; cellIndex < params.length; cellIndex++) { | |||
| currentRow.createCell().setText( | |||
| ParseWordUtil.getValueDoWhile(obj, | |||
| params[cellIndex].split("\\."), 0).toString()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 解析参数行,获取参数列表 | |||
| * | |||
| * @Author JueYue | |||
| * @date 2013-11-18 | |||
| * @param currentRow | |||
| * @return | |||
| */ | |||
| private static String[] parseCurrentRowGetParams(XWPFTableRow currentRow) { | |||
| List<XWPFTableCell> cells = currentRow.getTableCells(); | |||
| String[] params = new String[cells.size()]; | |||
| String text; | |||
| for (int i = 0; i < cells.size(); i++) { | |||
| text = cells.get(i).getText(); | |||
| params[i] = text == null ? "" : text.trim().replace("{{", "") | |||
| .replace("}}", ""); | |||
| } | |||
| return params; | |||
| } | |||
| } | |||
| @@ -12,10 +12,12 @@ import javax.imageio.ImageIO; | |||
| import org.apache.poi.xwpf.usermodel.XWPFDocument; | |||
| import org.jeecgframework.poi.util.POIPublicUtil; | |||
| import org.jeecgframework.poi.word.entity.WordImageEntity; | |||
| import org.jeecgframework.poi.word.entity.params.ExcelListEntity; | |||
| /** | |||
| * 解析公告类 | |||
| * Excel 实体注解,暂时不支持图片 | |||
| * @author JueYue | |||
| * @date 2014-7-24 | |||
| * @version 1.1 | |||
| @@ -37,7 +39,7 @@ public class ParseWordUtil { | |||
| currentText.indexOf("}}")); | |||
| Object obj = getParamsValue(params.trim(),map); | |||
| //判断图片或者是集合 | |||
| if(obj instanceof WordImageEntity||obj instanceof List){ | |||
| if(obj instanceof WordImageEntity||obj instanceof List ||obj instanceof ExcelListEntity){ | |||
| return obj; | |||
| }else{ | |||
| currentText = currentText.replace("{{" + params + "}}", | |||
| @@ -21,5 +21,11 @@ | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry kind="src" output="target/test-classes" path="src/test/java"> | |||
| <attributes> | |||
| <attribute name="optional" value="true"/> | |||
| <attribute name="maven.pomderived" value="true"/> | |||
| </attributes> | |||
| </classpathentry> | |||
| <classpathentry kind="output" path="target/classes"/> | |||
| </classpath> | |||
| @@ -4,7 +4,7 @@ | |||
| <parent> | |||
| <groupId>org.jeecgframework</groupId> | |||
| <artifactId>easypoi</artifactId> | |||
| <version>2.0.1</version> | |||
| <version>2.0.2</version> | |||
| </parent> | |||
| <artifactId>easypoi-test</artifactId> | |||
| <dependencies> | |||
| @@ -0,0 +1,13 @@ | |||
| package org.jeecgframework.poi; | |||
| public class UtilTest { | |||
| public static void main(String[] args) { | |||
| String text = " {{ p in pList}}"; | |||
| text = text.replace("{{", "").replace("}}", "").replaceAll("\\s{1,}", " ").trim(); | |||
| System.out.println(text); | |||
| System.out.println(text.length()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,119 @@ | |||
| package org.jeecgframework.poi.word; | |||
| import static org.junit.Assert.*; | |||
| import java.io.FileOutputStream; | |||
| 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.poi.xwpf.usermodel.XWPFDocument; | |||
| import org.jeecgframework.poi.entity.CourseEntity; | |||
| import org.jeecgframework.poi.entity.StudentEntity; | |||
| import org.jeecgframework.poi.entity.TeacherEntity; | |||
| import org.jeecgframework.poi.word.entity.Person; | |||
| import org.jeecgframework.poi.word.entity.WordImageEntity; | |||
| import org.jeecgframework.poi.word.entity.params.ExcelListEntity; | |||
| import org.junit.Before; | |||
| import org.junit.Test; | |||
| /** | |||
| * 注解导出测试 | |||
| * | |||
| * @author JueYue | |||
| * @date 2014年8月9日 下午11:36:33 | |||
| */ | |||
| public class WordExportUtilAnnExcelTest { | |||
| private static SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd"); | |||
| List<CourseEntity> list = new ArrayList<CourseEntity>(); | |||
| CourseEntity courseEntity; | |||
| @Before | |||
| public void testBefore() { | |||
| courseEntity = new CourseEntity(); | |||
| courseEntity.setId("1131"); | |||
| courseEntity.setName("小白"); | |||
| TeacherEntity teacherEntity = new TeacherEntity(); | |||
| teacherEntity.setId("12131231"); | |||
| teacherEntity.setName("你们"); | |||
| courseEntity.setTeacher(teacherEntity); | |||
| teacherEntity = new TeacherEntity(); | |||
| teacherEntity.setId("121312314312421131"); | |||
| teacherEntity.setName("老王"); | |||
| courseEntity.setShuxueteacher(teacherEntity); | |||
| StudentEntity studentEntity = new StudentEntity(); | |||
| studentEntity.setId("11231"); | |||
| studentEntity.setName("撒旦法司法局"); | |||
| studentEntity.setBirthday(new Date()); | |||
| studentEntity.setSex(1); | |||
| List<StudentEntity> studentList = new ArrayList<StudentEntity>(); | |||
| studentList.add(studentEntity); | |||
| studentList.add(studentEntity); | |||
| courseEntity.setStudents(studentList); | |||
| for (int i = 0; i < 3; i++) { | |||
| list.add(courseEntity); | |||
| } | |||
| } | |||
| /** | |||
| * 简单导出没有图片和Excel | |||
| */ | |||
| //@Test | |||
| public void SimpleWordExport() { | |||
| Map<String, Object> map = new HashMap<String, Object>(); | |||
| map.put("department", "Jeecg"); | |||
| map.put("person", "JueYue"); | |||
| map.put("auditPerson", "JueYue"); | |||
| map.put("time", format.format(new Date())); | |||
| List<Person> list = new ArrayList<Person>(); | |||
| Person p = new Person(); | |||
| p.setName("小明"); | |||
| p.setTel("18711111111"); | |||
| p.setEmail("18711111111@139.com"); | |||
| list.add(p); | |||
| p = new Person(); | |||
| p.setName("小红"); | |||
| p.setTel("18711111112"); | |||
| p.setEmail("18711111112@139.com"); | |||
| list.add(p); | |||
| map.put("pList", new ExcelListEntity(list, Person.class)); | |||
| try { | |||
| XWPFDocument doc = WordExportUtil.exportWord07( | |||
| "org/jeecgframework/poi/word/doc/SimpleExcel.docx", map); | |||
| FileOutputStream fos = new FileOutputStream("d:/simpleExcel.docx"); | |||
| doc.write(fos); | |||
| fos.close(); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| @Test | |||
| public void WordExport() { | |||
| Map<String, Object> map = new HashMap<String, Object>(); | |||
| map.put("department", "Jeecg"); | |||
| map.put("person", "JueYue"); | |||
| map.put("auditPerson", "JueYue"); | |||
| map.put("time", format.format(new Date())); | |||
| map.put("cs", new ExcelListEntity(list, CourseEntity.class)); | |||
| try { | |||
| XWPFDocument doc = WordExportUtil.exportWord07( | |||
| "org/jeecgframework/poi/word/doc/Excel.docx", map); | |||
| FileOutputStream fos = new FileOutputStream("d:/Excel.docx"); | |||
| doc.write(fos); | |||
| fos.close(); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,79 @@ | |||
| package org.jeecgframework.poi.word; | |||
| import static org.junit.Assert.*; | |||
| import java.io.FileOutputStream; | |||
| 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.poi.xwpf.usermodel.XWPFDocument; | |||
| import org.jeecgframework.poi.word.entity.Person; | |||
| import org.jeecgframework.poi.word.entity.WordImageEntity; | |||
| import org.junit.Test; | |||
| public class WordExportUtilBaseExcelTest { | |||
| private static SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd"); | |||
| /** | |||
| * 简单导出没有图片和Excel | |||
| */ | |||
| @Test | |||
| public void SimpleWordExport() { | |||
| Map<String, Object> map = new HashMap<String, Object>(); | |||
| map.put("department", "Jeecg"); | |||
| map.put("person", "JueYue"); | |||
| map.put("auditPerson", "JueYue"); | |||
| map.put("time", format.format(new Date())); | |||
| List<Person> list = new ArrayList<Person>(); | |||
| Person p = new Person(); | |||
| p.setName("小明"); | |||
| p.setTel("18711111111"); | |||
| p.setEmail("18711111111@139.com"); | |||
| list.add(p); | |||
| p = new Person(); | |||
| p.setName("小红"); | |||
| p.setTel("18711111112"); | |||
| p.setEmail("18711111112@139.com"); | |||
| list.add(p); | |||
| map.put("pList", list); | |||
| try { | |||
| XWPFDocument doc = WordExportUtil.exportWord07( | |||
| "org/jeecgframework/poi/word/doc/SimpleExcel.docx", map); | |||
| FileOutputStream fos = new FileOutputStream("d:/simpleExcel.docx"); | |||
| doc.write(fos); | |||
| fos.close(); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| /** | |||
| * 简单导出包含图片 | |||
| */ | |||
| //@Test | |||
| public void imageWordExport() { | |||
| Map<String, Object> map = new HashMap<String, Object>(); | |||
| map.put("department", "Jeecg"); | |||
| map.put("person", "JueYue"); | |||
| map.put("time", format.format(new Date())); | |||
| WordImageEntity image = new WordImageEntity(); | |||
| image.setHeight(200); | |||
| image.setWidth(500); | |||
| image.setUrl("org/jeecgframework/poi/word/img/testCode.png"); | |||
| image.setType(WordImageEntity.URL); | |||
| map.put("testCode", image); | |||
| try { | |||
| XWPFDocument doc = WordExportUtil.exportWord07( | |||
| "org/jeecgframework/poi/word/doc/Image.docx", map); | |||
| FileOutputStream fos = new FileOutputStream("d:/image.docx"); | |||
| doc.write(fos); | |||
| fos.close(); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,43 @@ | |||
| package org.jeecgframework.poi.word.entity; | |||
| import org.jeecgframework.poi.excel.annotation.Excel; | |||
| /** | |||
| * 测试人员类 | |||
| * @author JueYue | |||
| * @date 2014年7月26日 下午10:51:30 | |||
| */ | |||
| public class Person { | |||
| @Excel(name = "姓名") | |||
| private String name; | |||
| @Excel(name = "手机") | |||
| private String tel; | |||
| @Excel(name = "Email") | |||
| private String email; | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| public String getTel() { | |||
| return tel; | |||
| } | |||
| public void setTel(String tel) { | |||
| this.tel = tel; | |||
| } | |||
| public String getEmail() { | |||
| return email; | |||
| } | |||
| public void setEmail(String email) { | |||
| this.email = email; | |||
| } | |||
| } | |||
| @@ -4,7 +4,7 @@ | |||
| <parent> | |||
| <groupId>org.jeecgframework</groupId> | |||
| <artifactId>easypoi</artifactId> | |||
| <version>2.0.1</version> | |||
| <version>2.0.2</version> | |||
| </parent> | |||
| <artifactId>easypoi-web</artifactId> | |||
| @@ -3,7 +3,7 @@ | |||
| <modelVersion>4.0.0</modelVersion> | |||
| <groupId>org.jeecgframework</groupId> | |||
| <artifactId>easypoi</artifactId> | |||
| <version>2.0.1</version> | |||
| <version>2.0.2</version> | |||
| <packaging>pom</packaging> | |||
| <name>easypoi</name> | |||
| <modules> | |||
| @@ -122,7 +122,7 @@ | |||
| <dependency> | |||
| <groupId>org.jeecgframework</groupId> | |||
| <artifactId>easypoi-base</artifactId> | |||
| <version>2.0.1</version> | |||
| <version>2.0.2</version> | |||
| </dependency> | |||
| </dependencies> | |||
| </dependencyManagement> | |||