| @@ -55,7 +55,7 @@ public @interface Excel { | |||
| /** | |||
| * 导出时在excel中每个列的高度 单位为字符,一个汉字=2个字符 | |||
| * 优先选择@ExcelEntity中的 height | |||
| * 优先选择@ExportParams中的 height | |||
| */ | |||
| @Deprecated | |||
| public double height() default 10; | |||
| @@ -91,6 +91,13 @@ public @interface Excel { | |||
| */ | |||
| public String name(); | |||
| /** | |||
| * 导出时,表头双行显示,聚合,排序以最小的值参与总体排序再内部排序 | |||
| * 导出排序跟定义了annotation的字段的顺序有关 可以使用a_id,b_id来确实是否使用 | |||
| * 优先弱与 @ExcelEntity 的name和show属性 | |||
| */ | |||
| public String groupName() default ""; | |||
| /** | |||
| * 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row) | |||
| */ | |||
| @@ -42,14 +42,9 @@ public @interface ExcelEntity { | |||
| /** | |||
| * 如果等于true,name必须有值, Excel的表头会变成两行,同时改Excel内部数据不参与总排序,排序用下面这个来代替,内部再排序 | |||
| * 排序取当中最小值排序 | |||
| * @return | |||
| */ | |||
| public boolean show() default false; | |||
| /** | |||
| * 展示到第几个同样可以使用a_id,b_id | |||
| * | |||
| */ | |||
| public String orderNum() default "0"; | |||
| } | |||
| @@ -34,14 +34,4 @@ public @interface ExcelTarget { | |||
| */ | |||
| public String value(); | |||
| /** | |||
| * 导出时在excel中每个列的高度 单位为字符,一个汉字=2个字符 | |||
| * 全局设置,优先使用 | |||
| */ | |||
| public double height() default 10; | |||
| /** | |||
| * 导出时在excel中每个列的高度 单位为字符,一个汉字=2个字符 | |||
| * 全局设置,优先使用 | |||
| */ | |||
| public short fontSize() default 11; | |||
| } | |||
| @@ -75,18 +75,21 @@ public class ExcelExportUtil { | |||
| */ | |||
| public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass, | |||
| Collection<?> dataSet) { | |||
| Workbook workbook; | |||
| if (ExcelType.HSSF.equals(entity.getType())) { | |||
| workbook = new HSSFWorkbook(); | |||
| } else if (dataSet.size() < 10000) { | |||
| workbook = new XSSFWorkbook(); | |||
| } else { | |||
| workbook = new SXSSFWorkbook(); | |||
| } | |||
| Workbook workbook = getWorkbook(entity.getType(),dataSet.size()); | |||
| new ExcelExportServer().createSheet(workbook, entity, pojoClass, dataSet); | |||
| return workbook; | |||
| } | |||
| private static Workbook getWorkbook(ExcelType type, int size) { | |||
| if (ExcelType.HSSF.equals(type)) { | |||
| return new HSSFWorkbook(); | |||
| } else if (size < 100000) { | |||
| return new XSSFWorkbook(); | |||
| } else { | |||
| return new SXSSFWorkbook(); | |||
| } | |||
| } | |||
| /** | |||
| * 根据Map创建对应的Excel | |||
| * @param entity | |||
| @@ -98,14 +101,7 @@ public class ExcelExportUtil { | |||
| */ | |||
| public static Workbook exportExcel(ExportParams entity, List<ExcelExportEntity> entityList, | |||
| Collection<? extends Map<?, ?>> dataSet) { | |||
| Workbook workbook; | |||
| if (ExcelType.HSSF.equals(entity.getType())) { | |||
| workbook = new HSSFWorkbook(); | |||
| } else if (dataSet.size() < 10000) { | |||
| workbook = new XSSFWorkbook(); | |||
| } else { | |||
| workbook = new SXSSFWorkbook(); | |||
| } | |||
| Workbook workbook = getWorkbook(entity.getType(),dataSet.size());; | |||
| new ExcelExportServer().createSheetForMap(workbook, entity, entityList, dataSet); | |||
| return workbook; | |||
| } | |||
| @@ -119,12 +115,7 @@ public class ExcelExportUtil { | |||
| * @return | |||
| */ | |||
| public static Workbook exportExcel(List<Map<String, Object>> list, ExcelType type) { | |||
| Workbook workbook; | |||
| if (ExcelType.HSSF.equals(type)) { | |||
| workbook = new HSSFWorkbook(); | |||
| } else { | |||
| workbook = new XSSFWorkbook(); | |||
| } | |||
| Workbook workbook = getWorkbook(type,0); | |||
| for (Map<String, Object> map : list) { | |||
| ExcelExportServer server = new ExcelExportServer(); | |||
| server.createSheet(workbook, (ExportParams) map.get("title"), | |||
| @@ -101,6 +101,12 @@ public class ExportParams extends ExcelBaseParams { | |||
| */ | |||
| private int maxNum = 0; | |||
| /** | |||
| * 导出时在excel中每个列的高度 单位为字符,一个汉字=2个字符 | |||
| * 全局设置,优先使用 | |||
| */ | |||
| public short height = 0; | |||
| public ExportParams() { | |||
| } | |||
| @@ -258,4 +264,12 @@ public class ExportParams extends ExcelBaseParams { | |||
| this.maxNum = maxNum; | |||
| } | |||
| public short getHeight() { | |||
| return (short) (height * 50); | |||
| } | |||
| public void setHeight(short height) { | |||
| this.height = height; | |||
| } | |||
| } | |||
| @@ -30,6 +30,10 @@ public class ExcelBaseEntity { | |||
| * 对应name | |||
| */ | |||
| protected String name; | |||
| /** | |||
| * 对应groupName | |||
| */ | |||
| protected String groupName; | |||
| /** | |||
| * 对应type | |||
| */ | |||
| @@ -117,6 +121,15 @@ public class ExcelBaseEntity { | |||
| return hyperlink; | |||
| } | |||
| public String getGroupName() { | |||
| return groupName; | |||
| } | |||
| public void setGroupName(String groupName) { | |||
| this.groupName = groupName; | |||
| } | |||
| public void setHyperlink(boolean hyperlink) { | |||
| this.hyperlink = hyperlink; | |||
| } | |||
| @@ -72,7 +72,7 @@ public class ExcelBatchExportServer extends ExcelExportServer { | |||
| ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
| String targetId = etarget == null ? null : etarget.value(); | |||
| getAllExcelField(entity.getExclusions(), targetId, fileds, excelParams, pojoClass, | |||
| null); | |||
| null, null); | |||
| sortAllParams(excelParams); | |||
| try { | |||
| sheet = workbook.createSheet(entity.getSheetName()); | |||
| @@ -81,8 +81,7 @@ public class ExcelBatchExportServer extends ExcelExportServer { | |||
| sheet = workbook.createSheet(); | |||
| } | |||
| } catch (Exception e) { | |||
| LOGGER.error(e.getMessage(), e); | |||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause()); | |||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||
| } | |||
| } | |||
| @@ -1,13 +1,13 @@ | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| @@ -34,7 +34,7 @@ import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||
| import cn.afterturn.easypoi.excel.entity.ExportParams; | |||
| import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.export.base.ExcelExportBase; | |||
| import cn.afterturn.easypoi.excel.export.base.ExportBaseServer; | |||
| import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelExportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||
| @@ -43,20 +43,19 @@ import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| /** | |||
| * Excel导出服务 | |||
| * | |||
| * @author JueYue | |||
| * 2014年6月17日 下午5:30:54 | |||
| * | |||
| * @author JueYue 2014年6月17日 下午5:30:54 | |||
| */ | |||
| public class ExcelExportServer extends ExcelExportBase { | |||
| public class ExcelExportServer extends ExportBaseServer { | |||
| // 最大行数,超过自动多Sheet | |||
| private int MAX_NUM = 60000; | |||
| private int MAX_NUM = 60000; | |||
| protected int createHeaderAndTitle(ExportParams entity, Sheet sheet, Workbook workbook, | |||
| List<ExcelExportEntity> excelParams) { | |||
| int rows = 0, feildWidth = getFieldLength(excelParams); | |||
| List<ExcelExportEntity> excelParams) { | |||
| int rows = 0, fieldLength = getFieldLength(excelParams); | |||
| if (entity.getTitle() != null) { | |||
| rows += createHeaderRow(entity, sheet, workbook, feildWidth); | |||
| rows += createHeaderRow(entity, sheet, workbook, fieldLength); | |||
| } | |||
| rows += createTitleRow(entity, sheet, workbook, rows, excelParams); | |||
| sheet.createFreezePane(0, rows, 0, rows); | |||
| @@ -65,35 +64,30 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| /** | |||
| * 创建 表头改变 | |||
| * | |||
| * @param entity | |||
| * @param sheet | |||
| * @param workbook | |||
| * @param feildWidth | |||
| */ | |||
| public int createHeaderRow(ExportParams entity, Sheet sheet, Workbook workbook, | |||
| int feildWidth) { | |||
| int fieldWidth) { | |||
| Row row = sheet.createRow(0); | |||
| row.setHeight(entity.getTitleHeight()); | |||
| createStringCell(row, 0, entity.getTitle(), | |||
| getExcelExportStyler().getHeaderStyle(entity.getHeaderColor()), null); | |||
| for (int i = 1; i <= feildWidth; i++) { | |||
| createStringCell(row, i, "", | |||
| getExcelExportStyler().getHeaderStyle(entity.getHeaderColor()), null); | |||
| for (int i = 1; i <= fieldWidth; i++) { | |||
| createStringCell(row, i, "", | |||
| getExcelExportStyler().getHeaderStyle(entity.getHeaderColor()), null); | |||
| } | |||
| sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, feildWidth)); | |||
| sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fieldWidth)); | |||
| if (entity.getSecondTitle() != null) { | |||
| row = sheet.createRow(1); | |||
| row.setHeight(entity.getSecondTitleHeight()); | |||
| CellStyle style = workbook.createCellStyle(); | |||
| style.setAlignment(CellStyle.ALIGN_RIGHT); | |||
| createStringCell(row, 0, entity.getSecondTitle(), style, null); | |||
| for (int i = 1; i <= feildWidth; i++) { | |||
| for (int i = 1; i <= fieldWidth; i++) { | |||
| createStringCell(row, i, "", | |||
| getExcelExportStyler().getHeaderStyle(entity.getHeaderColor()), null); | |||
| getExcelExportStyler().getHeaderStyle(entity.getHeaderColor()), null); | |||
| } | |||
| sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, feildWidth)); | |||
| sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, fieldWidth)); | |||
| return 2; | |||
| } | |||
| return 1; | |||
| @@ -104,7 +98,7 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug("Excel export start ,class is {}", pojoClass); | |||
| LOGGER.debug("Excel version is {}", | |||
| entity.getType().equals(ExcelType.HSSF) ? "03" : "07"); | |||
| entity.getType().equals(ExcelType.HSSF) ? "03" : "07"); | |||
| } | |||
| if (workbook == null || entity == null || pojoClass == null || dataSet == null) { | |||
| throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); | |||
| @@ -112,11 +106,11 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| try { | |||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||
| // 得到所有字段 | |||
| Field fileds[] = PoiPublicUtil.getClassFields(pojoClass); | |||
| Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||
| ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
| String targetId = etarget == null ? null : etarget.value(); | |||
| getAllExcelField(entity.getExclusions(), targetId, fileds, excelParams, pojoClass, | |||
| null); | |||
| null, null); | |||
| //获取所有参数后,后面的逻辑判断就一致了 | |||
| createSheetForMap(workbook, entity, excelParams, dataSet); | |||
| } catch (Exception e) { | |||
| @@ -129,7 +123,7 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| List<ExcelExportEntity> entityList, Collection<?> dataSet) { | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug("Excel version is {}", | |||
| entity.getType().equals(ExcelType.HSSF) ? "03" : "07"); | |||
| entity.getType().equals(ExcelType.HSSF) ? "03" : "07"); | |||
| } | |||
| if (workbook == null || entity == null || entityList == null || dataSet == null) { | |||
| throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); | |||
| @@ -138,8 +132,8 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| if (type.equals(ExcelType.XSSF)) { | |||
| MAX_NUM = 1000000; | |||
| } | |||
| if( entity.getMaxNum() >0) { | |||
| MAX_NUM = entity.getMaxNum(); | |||
| if (entity.getMaxNum() > 0) { | |||
| MAX_NUM = entity.getMaxNum(); | |||
| } | |||
| Sheet sheet = null; | |||
| try { | |||
| @@ -148,12 +142,12 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| // 重复遍历,出现了重名现象,创建非指定的名称Sheet | |||
| sheet = workbook.createSheet(); | |||
| } | |||
| insertDataToSheet(workbook, entity, entityList, dataSet,sheet); | |||
| insertDataToSheet(workbook, entity, entityList, dataSet, sheet); | |||
| } | |||
| protected void insertDataToSheet(Workbook workbook, ExportParams entity, | |||
| List<ExcelExportEntity> entityList, Collection<?> dataSet, | |||
| Sheet sheet) { | |||
| List<ExcelExportEntity> entityList, Collection<?> dataSet, | |||
| Sheet sheet) { | |||
| try { | |||
| dataHanlder = entity.getDataHanlder(); | |||
| if (dataHanlder != null && dataHanlder.getNeedHandlerFields() != null) { | |||
| @@ -161,7 +155,7 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| } | |||
| // 创建表格样式 | |||
| setExcelExportStyler((IExcelExportStyler) entity.getStyle() | |||
| .getConstructor(Workbook.class).newInstance(workbook)); | |||
| .getConstructor(Workbook.class).newInstance(workbook)); | |||
| Drawing patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet); | |||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||
| if (entity.isAddIndex()) { | |||
| @@ -170,10 +164,10 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| excelParams.addAll(entityList); | |||
| sortAllParams(excelParams); | |||
| int index = entity.isCreateHeadRows() | |||
| ? createHeaderAndTitle(entity, sheet, workbook, excelParams) : 0; | |||
| ? createHeaderAndTitle(entity, sheet, workbook, excelParams) : 0; | |||
| int titleHeight = index; | |||
| setCellWith(excelParams, sheet); | |||
| short rowHeight = getRowHeight(excelParams); | |||
| short rowHeight = entity.getHeight() > 0? entity.getHeight() : getRowHeight(excelParams); | |||
| setCurrentIndex(1); | |||
| Iterator<?> its = dataSet.iterator(); | |||
| List<Object> tempList = new ArrayList<Object>(); | |||
| @@ -195,6 +189,10 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| its.next(); | |||
| its.remove(); | |||
| } | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug("List data more than max ,data size is {}", | |||
| dataSet.size()); | |||
| } | |||
| // 发现还有剩余list 继续循环创建Sheet | |||
| if (dataSet.size() > 0) { | |||
| createSheetForMap(workbook, entity, entityList, dataSet); | |||
| @@ -211,9 +209,6 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| /** | |||
| * 创建表头 | |||
| * | |||
| * @param title | |||
| * @param index | |||
| */ | |||
| private int createTitleRow(ExportParams title, Sheet sheet, Workbook workbook, int index, | |||
| List<ExcelExportEntity> excelParams) { | |||
| @@ -226,30 +221,41 @@ public class ExcelExportServer extends ExcelExportBase { | |||
| listRow.setHeight((short) 450); | |||
| } | |||
| int cellIndex = 0; | |||
| int groupCellLength = 0; | |||
| CellStyle titleStyle = getExcelExportStyler().getTitleStyle(title.getColor()); | |||
| for (int i = 0, exportFieldTitleSize = excelParams.size(); i < exportFieldTitleSize; i++) { | |||
| ExcelExportEntity entity = excelParams.get(i); | |||
| if (StringUtils.isNotBlank(entity.getName())) { | |||
| if (StringUtils.isNotBlank(entity.getGroupName())) { | |||
| createStringCell(row, cellIndex, entity.getGroupName(), titleStyle, entity); | |||
| createStringCell(listRow, cellIndex, entity.getName(), titleStyle, entity); | |||
| groupCellLength++; | |||
| } else if (StringUtils.isNotBlank(entity.getName())) { | |||
| if(groupCellLength > 0){ | |||
| sheet.addMergedRegion(new CellRangeAddress(index, index, cellIndex, cellIndex - groupCellLength)); | |||
| groupCellLength = 0; | |||
| } | |||
| createStringCell(row, cellIndex, entity.getName(), titleStyle, entity); | |||
| } | |||
| if (entity.getList() != null) { | |||
| List<ExcelExportEntity> sTitel = entity.getList(); | |||
| if (StringUtils.isNotBlank(entity.getName())) { | |||
| sheet.addMergedRegion(new CellRangeAddress(index, index, cellIndex, | |||
| cellIndex + sTitel.size() - 1)); | |||
| sheet.addMergedRegion(new CellRangeAddress(index, index, cellIndex, cellIndex + sTitel.size() - 1)); | |||
| } | |||
| for (int j = 0, size = sTitel.size(); j < size; j++) { | |||
| createStringCell(rows == 2 ? listRow : row, cellIndex, sTitel.get(j).getName(), | |||
| titleStyle, entity); | |||
| titleStyle, entity); | |||
| cellIndex++; | |||
| } | |||
| cellIndex--; | |||
| } else if (rows == 2) { | |||
| } else if (rows == 2 && StringUtils.isBlank(entity.getGroupName())) { | |||
| createStringCell(listRow, cellIndex, "", titleStyle, entity); | |||
| sheet.addMergedRegion(new CellRangeAddress(index, index + 1, cellIndex, cellIndex)); | |||
| } | |||
| cellIndex++; | |||
| } | |||
| if(groupCellLength > 0){ | |||
| sheet.addMergedRegion(new CellRangeAddress(index, index, cellIndex - groupCellLength, cellIndex - 1)); | |||
| } | |||
| return rows; | |||
| } | |||
| @@ -1,394 +1,407 @@ | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except | |||
| * in compliance with the License. You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software distributed under the License | |||
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express | |||
| * or implied. See the License for the specific language governing permissions and limitations under | |||
| * the License. | |||
| */ | |||
| package cn.afterturn.easypoi.excel.export.base; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.poi.hssf.usermodel.HSSFClientAnchor; | |||
| import org.apache.poi.hssf.usermodel.HSSFRichTextString; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.CellStyle; | |||
| import org.apache.poi.ss.usermodel.ClientAnchor; | |||
| import org.apache.poi.ss.usermodel.Drawing; | |||
| import org.apache.poi.ss.usermodel.RichTextString; | |||
| 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.apache.poi.xssf.usermodel.XSSFClientAnchor; | |||
| import org.apache.poi.xssf.usermodel.XSSFRichTextString; | |||
| import java.text.DecimalFormat; | |||
| import java.util.Collection; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Set; | |||
| import cn.afterturn.easypoi.cache.ImageCache; | |||
| import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.vo.BaseEntityTypeConstants; | |||
| import cn.afterturn.easypoi.excel.entity.vo.PoiBaseConstants; | |||
| import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; | |||
| import cn.afterturn.easypoi.util.PoiExcelGraphDataUtil; | |||
| import cn.afterturn.easypoi.util.PoiMergeCellUtil; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| /** | |||
| * 提供POI基础操作服务 | |||
| * | |||
| * @author JueYue 2014年6月17日 下午6:15:13 | |||
| */ | |||
| @SuppressWarnings("unchecked") | |||
| public abstract class ExcelExportBase extends ExportBase { | |||
| private int currentIndex = 0; | |||
| protected ExcelType type = ExcelType.HSSF; | |||
| private Map<Integer, Double> statistics = new HashMap<Integer, Double>(); | |||
| private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); | |||
| protected IExcelExportStyler excelExportStyler; | |||
| /** | |||
| * 创建 最主要的 Cells | |||
| */ | |||
| public int createCells(Drawing patriarch, int index, Object t, | |||
| List<ExcelExportEntity> excelParams, Sheet sheet, Workbook workbook, | |||
| short rowHeight) throws Exception { | |||
| ExcelExportEntity entity; | |||
| Row row = sheet.createRow(index); | |||
| row.setHeight(rowHeight); | |||
| int maxHeight = 1, cellNum = 0; | |||
| int indexKey = createIndexCell(row, index, excelParams.get(0)); | |||
| cellNum += indexKey; | |||
| for (int k = indexKey, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| if (entity.getList() != null) { | |||
| Collection<?> list = getListCellValue(entity, t); | |||
| int listC = 0; | |||
| if (list != null && list.size() > 0) { | |||
| for (Object obj : list) { | |||
| createListCells(patriarch, index + listC, cellNum, obj, entity.getList(), | |||
| sheet, workbook); | |||
| listC++; | |||
| } | |||
| } | |||
| cellNum += entity.getList().size(); | |||
| if (list != null && list.size() > maxHeight) { | |||
| maxHeight = list.size(); | |||
| } | |||
| } else { | |||
| Object value = getCellValue(entity, t); | |||
| if (entity.getType() == BaseEntityTypeConstants.StringType) { | |||
| createStringCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), | |||
| entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), t, | |||
| entity.getName(), value)); | |||
| } | |||
| } else if (entity.getType() == BaseEntityTypeConstants.DoubleType) { | |||
| createDoubleCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), | |||
| entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), t, | |||
| entity.getName(), value)); | |||
| } | |||
| } else { | |||
| createImageCell(patriarch, entity, row, cellNum++, | |||
| value == null ? "" : value.toString(), t); | |||
| } | |||
| } | |||
| } | |||
| // 合并需要合并的单元格 | |||
| cellNum = 0; | |||
| for (int k = indexKey, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| if (entity.getList() != null) { | |||
| cellNum += entity.getList().size(); | |||
| } else if (entity.isNeedMerge() && maxHeight > 1) { | |||
| for (int i = index + 1; i < index + maxHeight; i++) { | |||
| sheet.getRow(i).createCell(cellNum); | |||
| sheet.getRow(i).getCell(cellNum).setCellStyle(getStyles(false, entity)); | |||
| } | |||
| sheet.addMergedRegion( | |||
| new CellRangeAddress(index, index + maxHeight - 1, cellNum, cellNum)); | |||
| cellNum++; | |||
| } | |||
| } | |||
| return maxHeight; | |||
| } | |||
| /** | |||
| * 图片类型的Cell | |||
| */ | |||
| public void createImageCell(Drawing patriarch, ExcelExportEntity entity, Row row, int i, | |||
| String imagePath, Object obj) throws Exception { | |||
| Cell cell = row.createCell(i); | |||
| byte[] value = null; | |||
| if (entity.getExportImageType() != 1) { | |||
| value = (byte[]) (entity.getMethods() != null | |||
| ? getFieldBySomeMethod(entity.getMethods(), obj) | |||
| : entity.getMethod().invoke(obj, new Object[]{})); | |||
| } | |||
| createImageCell(cell, 50 * entity.getHeight(), entity.getExportImageType() == 1 ? imagePath : null, value); | |||
| } | |||
| /** | |||
| * 图片类型的Cell | |||
| */ | |||
| public void createImageCell(Cell cell, double height, | |||
| String imagePath, byte[] data) throws Exception { | |||
| if (height > cell.getRow().getHeight()) { | |||
| cell.getRow().setHeight((short) height); | |||
| } | |||
| ClientAnchor anchor; | |||
| if (type.equals(ExcelType.HSSF)) { | |||
| anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), | |||
| cell.getRow().getRowNum() + 1); | |||
| } else { | |||
| anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), | |||
| cell.getRow().getRowNum() + 1); | |||
| } | |||
| if (StringUtils.isNotEmpty(imagePath)) { | |||
| data = ImageCache.getImage(imagePath); | |||
| } | |||
| if (data != null) { | |||
| PoiExcelGraphDataUtil.getDrawingPatriarch(cell.getSheet()).createPicture(anchor, | |||
| cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); | |||
| } | |||
| } | |||
| private int createIndexCell(Row row, int index, ExcelExportEntity excelExportEntity) { | |||
| if (excelExportEntity.getName() != null && excelExportEntity.getName().equals("序号") && excelExportEntity.getFormat() != null | |||
| && excelExportEntity.getFormat().equals(PoiBaseConstants.IS_ADD_INDEX)) { | |||
| createStringCell(row, 0, currentIndex + "", | |||
| index % 2 == 0 ? getStyles(false, null) : getStyles(true, null), null); | |||
| currentIndex = currentIndex + 1; | |||
| return 1; | |||
| } | |||
| return 0; | |||
| } | |||
| /** | |||
| * 创建List之后的各个Cells | |||
| */ | |||
| public void createListCells(Drawing patriarch, int index, int cellNum, Object obj, | |||
| List<ExcelExportEntity> excelParams, Sheet sheet, | |||
| Workbook workbook) throws Exception { | |||
| ExcelExportEntity entity; | |||
| Row row; | |||
| if (sheet.getRow(index) == null) { | |||
| row = sheet.createRow(index); | |||
| row.setHeight(getRowHeight(excelParams)); | |||
| } else { | |||
| row = sheet.getRow(index); | |||
| } | |||
| for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| Object value = getCellValue(entity, obj); | |||
| if (entity.getType() == BaseEntityTypeConstants.StringType) { | |||
| createStringCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| row.getRowNum() % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), | |||
| entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), obj, entity.getName(), | |||
| value)); | |||
| } | |||
| } else if (entity.getType() == BaseEntityTypeConstants.DoubleType) { | |||
| createDoubleCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), obj, entity.getName(), | |||
| value)); | |||
| } | |||
| } else { | |||
| createImageCell(patriarch, entity, row, cellNum++, | |||
| value == null ? "" : value.toString(), obj); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 创建文本类型的Cell | |||
| */ | |||
| public void createStringCell(Row row, int index, String text, CellStyle style, | |||
| ExcelExportEntity entity) { | |||
| Cell cell = row.createCell(index); | |||
| if (style != null && style.getDataFormat() > 0 && style.getDataFormat() < 12) { | |||
| cell.setCellValue(Double.parseDouble(text)); | |||
| cell.setCellType(Cell.CELL_TYPE_NUMERIC); | |||
| } else { | |||
| RichTextString Rtext; | |||
| if (type.equals(ExcelType.HSSF)) { | |||
| Rtext = new HSSFRichTextString(text); | |||
| } else { | |||
| Rtext = new XSSFRichTextString(text); | |||
| } | |||
| cell.setCellValue(Rtext); | |||
| } | |||
| if (style != null) { | |||
| cell.setCellStyle(style); | |||
| } | |||
| addStatisticsData(index, text, entity); | |||
| } | |||
| /** | |||
| * 创建数字类型的Cell | |||
| */ | |||
| public void createDoubleCell(Row row, int index, String text, CellStyle style, | |||
| ExcelExportEntity entity) { | |||
| Cell cell = row.createCell(index); | |||
| if (text != null && text.length() > 0) { | |||
| cell.setCellValue(Double.parseDouble(text)); | |||
| } | |||
| cell.setCellType(Cell.CELL_TYPE_NUMERIC); | |||
| if (style != null) { | |||
| cell.setCellStyle(style); | |||
| } | |||
| addStatisticsData(index, text, entity); | |||
| } | |||
| /** | |||
| * 创建统计行 | |||
| */ | |||
| public void addStatisticsRow(CellStyle styles, Sheet sheet) { | |||
| if (statistics.size() > 0) { | |||
| Row row = sheet.createRow(sheet.getLastRowNum() + 1); | |||
| Set<Integer> keys = statistics.keySet(); | |||
| createStringCell(row, 0, "合计", styles, null); | |||
| for (Integer key : keys) { | |||
| createStringCell(row, key, DOUBLE_FORMAT.format(statistics.get(key)), styles, null); | |||
| } | |||
| statistics.clear(); | |||
| } | |||
| } | |||
| /** | |||
| * 合计统计信息 | |||
| */ | |||
| private void addStatisticsData(Integer index, String text, ExcelExportEntity entity) { | |||
| if (entity != null && entity.isStatistics()) { | |||
| Double temp = 0D; | |||
| if (!statistics.containsKey(index)) { | |||
| statistics.put(index, temp); | |||
| } | |||
| try { | |||
| temp = Double.valueOf(text); | |||
| } catch (NumberFormatException e) { | |||
| } | |||
| statistics.put(index, statistics.get(index) + temp); | |||
| } | |||
| } | |||
| /** | |||
| * 获取图片类型,设置图片插入类型 | |||
| * | |||
| * @author JueYue 2013年11月25日 | |||
| */ | |||
| public int getImageType(byte[] value) { | |||
| String type = PoiPublicUtil.getFileExtendName(value); | |||
| if (type.equalsIgnoreCase("JPG")) { | |||
| return Workbook.PICTURE_TYPE_JPEG; | |||
| } else if (type.equalsIgnoreCase("PNG")) { | |||
| return Workbook.PICTURE_TYPE_PNG; | |||
| } | |||
| return Workbook.PICTURE_TYPE_JPEG; | |||
| } | |||
| private Map<Integer, int[]> getMergeDataMap(List<ExcelExportEntity> excelParams) { | |||
| Map<Integer, int[]> mergeMap = new HashMap<Integer, int[]>(); | |||
| // 设置参数顺序,为之后合并单元格做准备 | |||
| int i = 0; | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| if (entity.isMergeVertical()) { | |||
| mergeMap.put(i, entity.getMergeRely()); | |||
| } | |||
| if (entity.getList() != null) { | |||
| for (ExcelExportEntity inner : entity.getList()) { | |||
| if (inner.isMergeVertical()) { | |||
| mergeMap.put(i, inner.getMergeRely()); | |||
| } | |||
| i++; | |||
| } | |||
| } else { | |||
| i++; | |||
| } | |||
| } | |||
| return mergeMap; | |||
| } | |||
| /** | |||
| * 获取样式 | |||
| */ | |||
| public CellStyle getStyles(boolean needOne, ExcelExportEntity entity) { | |||
| return excelExportStyler.getStyles(needOne, entity); | |||
| } | |||
| /** | |||
| * 合并单元格 | |||
| */ | |||
| public void mergeCells(Sheet sheet, List<ExcelExportEntity> excelParams, int titleHeight) { | |||
| Map<Integer, int[]> mergeMap = getMergeDataMap(excelParams); | |||
| PoiMergeCellUtil.mergeCells(sheet, mergeMap, titleHeight); | |||
| } | |||
| public void setCellWith(List<ExcelExportEntity> excelParams, Sheet sheet) { | |||
| int index = 0; | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| if (excelParams.get(i).getList() != null) { | |||
| List<ExcelExportEntity> list = excelParams.get(i).getList(); | |||
| for (int j = 0; j < list.size(); j++) { | |||
| sheet.setColumnWidth(index, (int) (256 * list.get(j).getWidth())); | |||
| index++; | |||
| } | |||
| } else { | |||
| sheet.setColumnWidth(index, (int) (256 * excelParams.get(i).getWidth())); | |||
| index++; | |||
| } | |||
| } | |||
| } | |||
| public void setCurrentIndex(int currentIndex) { | |||
| this.currentIndex = currentIndex; | |||
| } | |||
| public void setExcelExportStyler(IExcelExportStyler excelExportStyler) { | |||
| this.excelExportStyler = excelExportStyler; | |||
| } | |||
| public IExcelExportStyler getExcelExportStyler() { | |||
| return excelExportStyler; | |||
| } | |||
| } | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except | |||
| * in compliance with the License. You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software distributed under the License | |||
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express | |||
| * or implied. See the License for the specific language governing permissions and limitations under | |||
| * the License. | |||
| */ | |||
| package cn.afterturn.easypoi.excel.export.base; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | |||
| import org.apache.poi.hssf.usermodel.HSSFClientAnchor; | |||
| import org.apache.poi.hssf.usermodel.HSSFRichTextString; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.CellStyle; | |||
| import org.apache.poi.ss.usermodel.ClientAnchor; | |||
| import org.apache.poi.ss.usermodel.Drawing; | |||
| import org.apache.poi.ss.usermodel.RichTextString; | |||
| 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.apache.poi.xssf.usermodel.XSSFClientAnchor; | |||
| import org.apache.poi.xssf.usermodel.XSSFRichTextString; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import java.text.DecimalFormat; | |||
| import java.util.Collection; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Set; | |||
| import cn.afterturn.easypoi.cache.ImageCache; | |||
| import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.vo.BaseEntityTypeConstants; | |||
| import cn.afterturn.easypoi.excel.entity.vo.PoiBaseConstants; | |||
| import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelExportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||
| import cn.afterturn.easypoi.util.PoiExcelGraphDataUtil; | |||
| import cn.afterturn.easypoi.util.PoiMergeCellUtil; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| /** | |||
| * 提供POI基础操作服务 | |||
| * | |||
| * @author JueYue 2014年6月17日 下午6:15:13 | |||
| */ | |||
| @SuppressWarnings("unchecked") | |||
| public abstract class ExportBaseServer extends ExportCommonServer { | |||
| private int currentIndex = 0; | |||
| protected ExcelType type = ExcelType.HSSF; | |||
| private Map<Integer, Double> statistics = new HashMap<Integer, Double>(); | |||
| private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); | |||
| protected IExcelExportStyler excelExportStyler; | |||
| /** | |||
| * 创建 最主要的 Cells | |||
| */ | |||
| public int createCells(Drawing patriarch, int index, Object t, | |||
| List<ExcelExportEntity> excelParams, Sheet sheet, Workbook workbook, | |||
| short rowHeight) { | |||
| try { | |||
| ExcelExportEntity entity; | |||
| Row row = sheet.createRow(index); | |||
| row.setHeight(rowHeight); | |||
| int maxHeight = 1, cellNum = 0; | |||
| int indexKey = createIndexCell(row, index, excelParams.get(0)); | |||
| cellNum += indexKey; | |||
| for (int k = indexKey, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| if (entity.getList() != null) { | |||
| Collection<?> list = getListCellValue(entity, t); | |||
| int listC = 0; | |||
| if (list != null && list.size() > 0) { | |||
| for (Object obj : list) { | |||
| createListCells(patriarch, index + listC, cellNum, obj, entity.getList(), | |||
| sheet, workbook, rowHeight); | |||
| listC++; | |||
| } | |||
| } | |||
| cellNum += entity.getList().size(); | |||
| if (list != null && list.size() > maxHeight) { | |||
| maxHeight = list.size(); | |||
| } | |||
| } else { | |||
| Object value = getCellValue(entity, t); | |||
| if (entity.getType() == BaseEntityTypeConstants.StringType) { | |||
| createStringCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), | |||
| entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), t, | |||
| entity.getName(), value)); | |||
| } | |||
| } else if (entity.getType() == BaseEntityTypeConstants.DoubleType) { | |||
| createDoubleCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), | |||
| entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1).setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), t, | |||
| entity.getName(), value)); | |||
| } | |||
| } else { | |||
| createImageCell(patriarch, entity, row, cellNum++, | |||
| value == null ? "" : value.toString(), t); | |||
| } | |||
| } | |||
| } | |||
| // 合并需要合并的单元格 | |||
| cellNum = 0; | |||
| for (int k = indexKey, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| if (entity.getList() != null) { | |||
| cellNum += entity.getList().size(); | |||
| } else if (entity.isNeedMerge() && maxHeight > 1) { | |||
| for (int i = index + 1; i < index + maxHeight; i++) { | |||
| sheet.getRow(i).createCell(cellNum); | |||
| sheet.getRow(i).getCell(cellNum).setCellStyle(getStyles(false, entity)); | |||
| } | |||
| sheet.addMergedRegion( | |||
| new CellRangeAddress(index, index + maxHeight - 1, cellNum, cellNum)); | |||
| cellNum++; | |||
| } | |||
| } | |||
| return maxHeight; | |||
| } catch (Exception e) { | |||
| LOGGER.error("excel cell export error ,data is :{}", ReflectionToStringBuilder.toString(t)); | |||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||
| } | |||
| } | |||
| /** | |||
| * 图片类型的Cell | |||
| */ | |||
| public void createImageCell(Drawing patriarch, ExcelExportEntity entity, Row row, int i, | |||
| String imagePath, Object obj) throws Exception { | |||
| Cell cell = row.createCell(i); | |||
| byte[] value = null; | |||
| if (entity.getExportImageType() != 1) { | |||
| value = (byte[]) (entity.getMethods() != null | |||
| ? getFieldBySomeMethod(entity.getMethods(), obj) | |||
| : entity.getMethod().invoke(obj, new Object[]{})); | |||
| } | |||
| createImageCell(cell, 50 * entity.getHeight(), entity.getExportImageType() == 1 ? imagePath : null, value); | |||
| } | |||
| /** | |||
| * 图片类型的Cell | |||
| */ | |||
| public void createImageCell(Cell cell, double height, | |||
| String imagePath, byte[] data) throws Exception { | |||
| if (height > cell.getRow().getHeight()) { | |||
| cell.getRow().setHeight((short) height); | |||
| } | |||
| ClientAnchor anchor; | |||
| if (type.equals(ExcelType.HSSF)) { | |||
| anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), | |||
| cell.getRow().getRowNum() + 1); | |||
| } else { | |||
| anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), | |||
| cell.getRow().getRowNum() + 1); | |||
| } | |||
| if (StringUtils.isNotEmpty(imagePath)) { | |||
| data = ImageCache.getImage(imagePath); | |||
| } | |||
| if (data != null) { | |||
| PoiExcelGraphDataUtil.getDrawingPatriarch(cell.getSheet()).createPicture(anchor, | |||
| cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); | |||
| } | |||
| } | |||
| private int createIndexCell(Row row, int index, ExcelExportEntity excelExportEntity) { | |||
| if (excelExportEntity.getName() != null && excelExportEntity.getName().equals("序号") && excelExportEntity.getFormat() != null | |||
| && excelExportEntity.getFormat().equals(PoiBaseConstants.IS_ADD_INDEX)) { | |||
| createStringCell(row, 0, currentIndex + "", | |||
| index % 2 == 0 ? getStyles(false, null) : getStyles(true, null), null); | |||
| currentIndex = currentIndex + 1; | |||
| return 1; | |||
| } | |||
| return 0; | |||
| } | |||
| /** | |||
| * 创建List之后的各个Cells | |||
| */ | |||
| public void createListCells(Drawing patriarch, int index, int cellNum, Object obj, | |||
| List<ExcelExportEntity> excelParams, Sheet sheet, | |||
| Workbook workbook, short rowHeight) throws Exception { | |||
| ExcelExportEntity entity; | |||
| Row row; | |||
| if (sheet.getRow(index) == null) { | |||
| row = sheet.createRow(index); | |||
| row.setHeight(rowHeight); | |||
| } else { | |||
| row = sheet.getRow(index); | |||
| row.setHeight(rowHeight); | |||
| } | |||
| for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | |||
| entity = excelParams.get(k); | |||
| Object value = getCellValue(entity, obj); | |||
| if (entity.getType() == BaseEntityTypeConstants.StringType) { | |||
| createStringCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| row.getRowNum() % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), | |||
| entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), obj, entity.getName(), | |||
| value)); | |||
| } | |||
| } else if (entity.getType() == BaseEntityTypeConstants.DoubleType) { | |||
| createDoubleCell(row, cellNum++, value == null ? "" : value.toString(), | |||
| index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), entity); | |||
| if (entity.isHyperlink()) { | |||
| row.getCell(cellNum - 1) | |||
| .setHyperlink(dataHanlder.getHyperlink( | |||
| row.getSheet().getWorkbook().getCreationHelper(), obj, entity.getName(), | |||
| value)); | |||
| } | |||
| } else { | |||
| createImageCell(patriarch, entity, row, cellNum++, | |||
| value == null ? "" : value.toString(), obj); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 创建文本类型的Cell | |||
| */ | |||
| public void createStringCell(Row row, int index, String text, CellStyle style, | |||
| ExcelExportEntity entity) { | |||
| Cell cell = row.createCell(index); | |||
| if (style != null && style.getDataFormat() > 0 && style.getDataFormat() < 12) { | |||
| cell.setCellValue(Double.parseDouble(text)); | |||
| cell.setCellType(Cell.CELL_TYPE_NUMERIC); | |||
| } else { | |||
| RichTextString Rtext; | |||
| if (type.equals(ExcelType.HSSF)) { | |||
| Rtext = new HSSFRichTextString(text); | |||
| } else { | |||
| Rtext = new XSSFRichTextString(text); | |||
| } | |||
| cell.setCellValue(Rtext); | |||
| } | |||
| if (style != null) { | |||
| cell.setCellStyle(style); | |||
| } | |||
| addStatisticsData(index, text, entity); | |||
| } | |||
| /** | |||
| * 创建数字类型的Cell | |||
| */ | |||
| public void createDoubleCell(Row row, int index, String text, CellStyle style, | |||
| ExcelExportEntity entity) { | |||
| Cell cell = row.createCell(index); | |||
| if (text != null && text.length() > 0) { | |||
| cell.setCellValue(Double.parseDouble(text)); | |||
| } | |||
| cell.setCellType(Cell.CELL_TYPE_NUMERIC); | |||
| if (style != null) { | |||
| cell.setCellStyle(style); | |||
| } | |||
| addStatisticsData(index, text, entity); | |||
| } | |||
| /** | |||
| * 创建统计行 | |||
| */ | |||
| public void addStatisticsRow(CellStyle styles, Sheet sheet) { | |||
| if (statistics.size() > 0) { | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug("add statistics data ,size is {}", statistics.size()); | |||
| } | |||
| Row row = sheet.createRow(sheet.getLastRowNum() + 1); | |||
| Set<Integer> keys = statistics.keySet(); | |||
| createStringCell(row, 0, "合计", styles, null); | |||
| for (Integer key : keys) { | |||
| createStringCell(row, key, DOUBLE_FORMAT.format(statistics.get(key)), styles, null); | |||
| } | |||
| statistics.clear(); | |||
| } | |||
| } | |||
| /** | |||
| * 合计统计信息 | |||
| */ | |||
| private void addStatisticsData(Integer index, String text, ExcelExportEntity entity) { | |||
| if (entity != null && entity.isStatistics()) { | |||
| Double temp = 0D; | |||
| if (!statistics.containsKey(index)) { | |||
| statistics.put(index, temp); | |||
| } | |||
| try { | |||
| temp = Double.valueOf(text); | |||
| } catch (NumberFormatException e) { | |||
| } | |||
| statistics.put(index, statistics.get(index) + temp); | |||
| } | |||
| } | |||
| /** | |||
| * 获取图片类型,设置图片插入类型 | |||
| * | |||
| * @author JueYue 2013年11月25日 | |||
| */ | |||
| public int getImageType(byte[] value) { | |||
| String type = PoiPublicUtil.getFileExtendName(value); | |||
| if (type.equalsIgnoreCase("JPG")) { | |||
| return Workbook.PICTURE_TYPE_JPEG; | |||
| } else if (type.equalsIgnoreCase("PNG")) { | |||
| return Workbook.PICTURE_TYPE_PNG; | |||
| } | |||
| return Workbook.PICTURE_TYPE_JPEG; | |||
| } | |||
| private Map<Integer, int[]> getMergeDataMap(List<ExcelExportEntity> excelParams) { | |||
| Map<Integer, int[]> mergeMap = new HashMap<Integer, int[]>(); | |||
| // 设置参数顺序,为之后合并单元格做准备 | |||
| int i = 0; | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| if (entity.isMergeVertical()) { | |||
| mergeMap.put(i, entity.getMergeRely()); | |||
| } | |||
| if (entity.getList() != null) { | |||
| for (ExcelExportEntity inner : entity.getList()) { | |||
| if (inner.isMergeVertical()) { | |||
| mergeMap.put(i, inner.getMergeRely()); | |||
| } | |||
| i++; | |||
| } | |||
| } else { | |||
| i++; | |||
| } | |||
| } | |||
| return mergeMap; | |||
| } | |||
| /** | |||
| * 获取样式 | |||
| */ | |||
| public CellStyle getStyles(boolean needOne, ExcelExportEntity entity) { | |||
| return excelExportStyler.getStyles(needOne, entity); | |||
| } | |||
| /** | |||
| * 合并单元格 | |||
| */ | |||
| public void mergeCells(Sheet sheet, List<ExcelExportEntity> excelParams, int titleHeight) { | |||
| Map<Integer, int[]> mergeMap = getMergeDataMap(excelParams); | |||
| PoiMergeCellUtil.mergeCells(sheet, mergeMap, titleHeight); | |||
| } | |||
| public void setCellWith(List<ExcelExportEntity> excelParams, Sheet sheet) { | |||
| int index = 0; | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| if (excelParams.get(i).getList() != null) { | |||
| List<ExcelExportEntity> list = excelParams.get(i).getList(); | |||
| for (int j = 0; j < list.size(); j++) { | |||
| sheet.setColumnWidth(index, (int) (256 * list.get(j).getWidth())); | |||
| index++; | |||
| } | |||
| } else { | |||
| sheet.setColumnWidth(index, (int) (256 * excelParams.get(i).getWidth())); | |||
| index++; | |||
| } | |||
| } | |||
| } | |||
| public void setCurrentIndex(int currentIndex) { | |||
| this.currentIndex = currentIndex; | |||
| } | |||
| public void setExcelExportStyler(IExcelExportStyler excelExportStyler) { | |||
| this.excelExportStyler = excelExportStyler; | |||
| } | |||
| public IExcelExportStyler getExcelExportStyler() { | |||
| return excelExportStyler; | |||
| } | |||
| } | |||
| @@ -1,377 +1,381 @@ | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| package cn.afterturn.easypoi.excel.export.base; | |||
| import java.lang.reflect.Field; | |||
| import java.lang.reflect.Method; | |||
| import java.lang.reflect.ParameterizedType; | |||
| import java.text.DecimalFormat; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.Collection; | |||
| import java.util.Collections; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.math.NumberUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import cn.afterturn.easypoi.excel.annotation.Excel; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelCollection; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelEntity; | |||
| import cn.afterturn.easypoi.excel.entity.ExportParams; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.vo.PoiBaseConstants; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataHandler; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
| /** | |||
| * 导出基础处理,不涉及POI,只涉及对象,保证复用性 | |||
| * | |||
| * @author JueYue | |||
| * 2014年8月9日 下午11:01:32 | |||
| */ | |||
| @SuppressWarnings("rawtypes") | |||
| public class ExportBase { | |||
| protected static final Logger LOGGER = LoggerFactory | |||
| .getLogger(ExportBase.class); | |||
| protected IExcelDataHandler dataHanlder; | |||
| protected List<String> needHanlderList; | |||
| /** | |||
| * 创建导出实体对象 | |||
| * | |||
| * @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; | |||
| } | |||
| private Object dateFormatValue(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; | |||
| } else if (value instanceof java.sql.Date){ | |||
| temp = new Date(((java.sql.Date)value).getTime()); | |||
| } else if (value instanceof java.sql.Time){ | |||
| temp = new Date(((java.sql.Time)value).getTime()); | |||
| } else if (value instanceof java.sql.Timestamp){ | |||
| temp = new Date(((java.sql.Timestamp)value).getTime()); | |||
| } | |||
| if (temp != null) { | |||
| SimpleDateFormat format = new SimpleDateFormat(entity.getFormat()); | |||
| value = format.format(temp); | |||
| } | |||
| return value; | |||
| } | |||
| private Object numFormatValue(Object value, ExcelExportEntity entity) { | |||
| if(value == null){ | |||
| return null; | |||
| } | |||
| if(!NumberUtils.isNumber(value.toString())){ | |||
| LOGGER.error("data want num format ,but is not num, value is:"+value); | |||
| return null; | |||
| } | |||
| Double d = Double.parseDouble(value.toString()); | |||
| DecimalFormat df = new DecimalFormat(entity.getNumFormat()); | |||
| return df.format(d); | |||
| } | |||
| /** | |||
| * 获取需要导出的全部字段 | |||
| * | |||
| * @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; | |||
| } | |||
| // 首先判断Excel 可能一下特殊数据用户回自定义处理 | |||
| if (field.getAnnotation(Excel.class) != null) { | |||
| Excel excel = field.getAnnotation(Excel.class); | |||
| String name=PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null); | |||
| if(StringUtils.isNotBlank(name)){ | |||
| excelParams.add(createExcelExportEntity(field, targetId, pojoClass, getMethods)); | |||
| } | |||
| } else 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(PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null)); | |||
| excelEntity.setOrderNum(Integer | |||
| .valueOf(PoiPublicUtil.getValueByTargetId(excel.orderNum(), targetId, "0"))); | |||
| excelEntity | |||
| .setMethod(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||
| excelEntity.setList(list); | |||
| excelParams.add(excelEntity); | |||
| } else { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| if (getMethods != null) { | |||
| newMethods.addAll(getMethods); | |||
| } | |||
| newMethods.add(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||
| ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | |||
| getAllExcelField(exclusions, | |||
| StringUtils.isNotEmpty(excel.id()) ? excel.id() : targetId, | |||
| PoiPublicUtil.getClassFields(field.getType()), excelParams, field.getType(), | |||
| newMethods); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 获取填如这个cell的值,提供一些附加功能 | |||
| * | |||
| * @param entity | |||
| * @param obj | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| @SuppressWarnings("unchecked") | |||
| public Object getCellValue(ExcelExportEntity entity, Object obj) throws Exception { | |||
| Object value; | |||
| if (obj instanceof Map) { | |||
| value = ((Map<?, ?>) obj).get(entity.getKey()); | |||
| } else { | |||
| value = entity.getMethods() != null ? getFieldBySomeMethod(entity.getMethods(), obj) | |||
| : entity.getMethod().invoke(obj, new Object[] {}); | |||
| } | |||
| if (StringUtils.isNotEmpty(entity.getFormat())) { | |||
| value = dateFormatValue(value, entity); | |||
| } | |||
| if (entity.getReplace() != null && entity.getReplace().length > 0) { | |||
| value = replaceValue(entity.getReplace(), String.valueOf(value)); | |||
| } | |||
| if (StringUtils.isNotEmpty(entity.getNumFormat())) { | |||
| value = numFormatValue(value, entity); | |||
| } | |||
| if (needHanlderList != null && needHanlderList.contains(entity.getName())) { | |||
| value = dataHanlder.exportHandler(obj, entity.getName(), value); | |||
| } | |||
| if (StringUtils.isNotEmpty(entity.getSuffix()) && value != null) { | |||
| value = value + entity.getSuffix(); | |||
| } | |||
| return value == null ? "" : value.toString(); | |||
| } | |||
| /** | |||
| * 获取集合的值 | |||
| * @param entity | |||
| * @param obj | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public Collection<?> getListCellValue(ExcelExportEntity entity, Object obj) throws Exception { | |||
| Object value; | |||
| if (obj instanceof Map) { | |||
| value = ((Map<?, ?>) obj).get(entity.getKey()); | |||
| } else { | |||
| value = (Collection<?>) entity.getMethod().invoke(obj, new Object[] {}); | |||
| } | |||
| return (Collection<?>) value; | |||
| } | |||
| /** | |||
| * 注解到导出对象的转换 | |||
| * | |||
| * @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(PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null)); | |||
| 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( | |||
| Integer.valueOf(PoiPublicUtil.getValueByTargetId(excel.orderNum(), targetId, "0"))); | |||
| excelEntity.setWrap(excel.isWrap()); | |||
| excelEntity.setExportImageType(excel.imageType()); | |||
| excelEntity.setSuffix(excel.suffix()); | |||
| excelEntity.setDatabaseFormat(excel.databaseFormat()); | |||
| excelEntity.setFormat( | |||
| StringUtils.isNotEmpty(excel.exportFormat()) ? excel.exportFormat() : excel.format()); | |||
| excelEntity.setStatistics(excel.isStatistics()); | |||
| excelEntity.setHyperlink(excel.isHyperlink()); | |||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||
| excelEntity.setNumFormat(excel.numFormat()); | |||
| } | |||
| /** | |||
| * 多个反射获取值 | |||
| * | |||
| * @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; | |||
| } | |||
| /** | |||
| * 根据注解获取行高 | |||
| * | |||
| * @param excelParams | |||
| * @return | |||
| */ | |||
| public short getRowHeight(List<ExcelExportEntity> excelParams) { | |||
| double 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); | |||
| } | |||
| 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; | |||
| } | |||
| /** | |||
| * 对字段根据用户设置排序 | |||
| */ | |||
| public void sortAllParams(List<ExcelExportEntity> excelParams) { | |||
| Collections.sort(excelParams); | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| if (entity.getList() != null) { | |||
| Collections.sort(entity.getList()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 添加Index列 | |||
| * @param entity | |||
| * @return | |||
| */ | |||
| public ExcelExportEntity indexExcelEntity(ExportParams entity) { | |||
| ExcelExportEntity exportEntity = new ExcelExportEntity(); | |||
| exportEntity.setOrderNum(0); | |||
| exportEntity.setName(entity.getIndexName()); | |||
| exportEntity.setWidth(10); | |||
| exportEntity.setFormat(PoiBaseConstants.IS_ADD_INDEX); | |||
| return exportEntity; | |||
| } | |||
| /** | |||
| * 获取导出报表的字段总长度 | |||
| * | |||
| * @param excelParams | |||
| * @return | |||
| */ | |||
| public int getFieldLength(List<ExcelExportEntity> excelParams) { | |||
| int length = -1;// 从0开始计算单元格的 | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| length += entity.getList() != null ? entity.getList().size() : 1; | |||
| } | |||
| return length; | |||
| } | |||
| /** | |||
| * 判断表头是只有一行还是两行 | |||
| * | |||
| * @param excelParams | |||
| * @return | |||
| */ | |||
| public int getRowNums(List<ExcelExportEntity> excelParams) { | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| if (excelParams.get(i).getList() != null | |||
| && StringUtils.isNotBlank(excelParams.get(i).getName())) { | |||
| return 2; | |||
| } | |||
| } | |||
| return 1; | |||
| } | |||
| } | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| package cn.afterturn.easypoi.excel.export.base; | |||
| import java.lang.reflect.Field; | |||
| import java.lang.reflect.Method; | |||
| import java.lang.reflect.ParameterizedType; | |||
| import java.text.DecimalFormat; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.Collection; | |||
| import java.util.Collections; | |||
| import java.util.Date; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Set; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | |||
| import org.apache.commons.lang3.math.NumberUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import cn.afterturn.easypoi.excel.annotation.Excel; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelCollection; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelEntity; | |||
| import cn.afterturn.easypoi.excel.entity.ExportParams; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.vo.PoiBaseConstants; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelExportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataHandler; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
| /** | |||
| * 导出基础处理,不涉及POI,只涉及对象,保证复用性 | |||
| * | |||
| * @author JueYue 2014年8月9日 下午11:01:32 | |||
| */ | |||
| @SuppressWarnings("rawtypes") | |||
| public class ExportCommonServer { | |||
| protected static final Logger LOGGER = LoggerFactory.getLogger(ExportCommonServer.class); | |||
| protected IExcelDataHandler dataHanlder; | |||
| protected List<String> needHanlderList; | |||
| /** | |||
| * 创建导出实体对象 | |||
| */ | |||
| private ExcelExportEntity createExcelExportEntity(Field field, String targetId, | |||
| Class<?> pojoClass, | |||
| List<Method> getMethods, ExcelEntity excelGroup) throws Exception { | |||
| Excel excel = field.getAnnotation(Excel.class); | |||
| ExcelExportEntity excelEntity = new ExcelExportEntity(); | |||
| excelEntity.setType(excel.type()); | |||
| getExcelField(targetId, field, excelEntity, excel, pojoClass, excelGroup); | |||
| if (getMethods != null) { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| newMethods.addAll(getMethods); | |||
| newMethods.add(excelEntity.getMethod()); | |||
| excelEntity.setMethods(newMethods); | |||
| } | |||
| return excelEntity; | |||
| } | |||
| private Object dateFormatValue(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; | |||
| } else if (value instanceof java.sql.Date) { | |||
| temp = new Date(((java.sql.Date) value).getTime()); | |||
| } else if (value instanceof java.sql.Time) { | |||
| temp = new Date(((java.sql.Time) value).getTime()); | |||
| } else if (value instanceof java.sql.Timestamp) { | |||
| temp = new Date(((java.sql.Timestamp) value).getTime()); | |||
| } | |||
| if (temp != null) { | |||
| SimpleDateFormat format = new SimpleDateFormat(entity.getFormat()); | |||
| value = format.format(temp); | |||
| } | |||
| return value; | |||
| } | |||
| private Object numFormatValue(Object value, ExcelExportEntity entity) { | |||
| if (value == null) { | |||
| return null; | |||
| } | |||
| if (!NumberUtils.isNumber(value.toString())) { | |||
| LOGGER.error("data want num format ,but is not num, value is:" + value); | |||
| return null; | |||
| } | |||
| Double d = Double.parseDouble(value.toString()); | |||
| DecimalFormat df = new DecimalFormat(entity.getNumFormat()); | |||
| return df.format(d); | |||
| } | |||
| /** | |||
| * 获取需要导出的全部字段 | |||
| * | |||
| * @param targetId 目标ID | |||
| */ | |||
| public void getAllExcelField(String[] exclusions, String targetId, Field[] fields, | |||
| List<ExcelExportEntity> excelParams, Class<?> pojoClass, | |||
| List<Method> getMethods, ExcelEntity excelGroup) 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; | |||
| } | |||
| // 首先判断Excel 可能一下特殊数据用户回自定义处理 | |||
| if (field.getAnnotation(Excel.class) != null) { | |||
| Excel excel = field.getAnnotation(Excel.class); | |||
| String name = PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null); | |||
| if (StringUtils.isNotBlank(name)) { | |||
| excelParams.add(createExcelExportEntity(field, targetId, pojoClass, getMethods, excelGroup)); | |||
| } | |||
| } else 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, null); | |||
| excelEntity = new ExcelExportEntity(); | |||
| excelEntity.setName(PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null)); | |||
| excelEntity.setOrderNum(Integer | |||
| .valueOf(PoiPublicUtil.getValueByTargetId(excel.orderNum(), targetId, "0"))); | |||
| excelEntity | |||
| .setMethod(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||
| excelEntity.setList(list); | |||
| excelParams.add(excelEntity); | |||
| } else { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| if (getMethods != null) { | |||
| newMethods.addAll(getMethods); | |||
| } | |||
| newMethods.add(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||
| ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | |||
| if (excel.show() && StringUtils.isEmpty(excel.name())) { | |||
| throw new ExcelExportException("if use ExcelEntity ,name mus has value ,data: " + ReflectionToStringBuilder.toString(excel), ExcelExportEnum.PARAMETER_ERROR); | |||
| } | |||
| getAllExcelField(exclusions, | |||
| StringUtils.isNotEmpty(excel.id()) ? excel.id() : targetId, | |||
| PoiPublicUtil.getClassFields(field.getType()), excelParams, field.getType(), | |||
| newMethods, excel.show() ? excel : null); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 获取填如这个cell的值,提供一些附加功能 | |||
| */ | |||
| @SuppressWarnings("unchecked") | |||
| public Object getCellValue(ExcelExportEntity entity, Object obj) throws Exception { | |||
| Object value; | |||
| if (obj instanceof Map) { | |||
| value = ((Map<?, ?>) obj).get(entity.getKey()); | |||
| } else { | |||
| value = entity.getMethods() != null ? getFieldBySomeMethod(entity.getMethods(), obj) | |||
| : entity.getMethod().invoke(obj, new Object[]{}); | |||
| } | |||
| if (StringUtils.isNotEmpty(entity.getFormat())) { | |||
| value = dateFormatValue(value, entity); | |||
| } | |||
| if (entity.getReplace() != null && entity.getReplace().length > 0) { | |||
| value = replaceValue(entity.getReplace(), String.valueOf(value)); | |||
| } | |||
| if (StringUtils.isNotEmpty(entity.getNumFormat())) { | |||
| value = numFormatValue(value, entity); | |||
| } | |||
| if (needHanlderList != null && needHanlderList.contains(entity.getName())) { | |||
| value = dataHanlder.exportHandler(obj, entity.getName(), value); | |||
| } | |||
| if (StringUtils.isNotEmpty(entity.getSuffix()) && value != null) { | |||
| value = value + entity.getSuffix(); | |||
| } | |||
| return value == null ? "" : value.toString(); | |||
| } | |||
| /** | |||
| * 获取集合的值 | |||
| */ | |||
| public Collection<?> getListCellValue(ExcelExportEntity entity, Object obj) throws Exception { | |||
| Object value; | |||
| if (obj instanceof Map) { | |||
| value = ((Map<?, ?>) obj).get(entity.getKey()); | |||
| } else { | |||
| value = (Collection<?>) entity.getMethod().invoke(obj, new Object[]{}); | |||
| } | |||
| return (Collection<?>) value; | |||
| } | |||
| /** | |||
| * 注解到导出对象的转换 | |||
| */ | |||
| private void getExcelField(String targetId, Field field, ExcelExportEntity excelEntity, | |||
| Excel excel, Class<?> pojoClass, ExcelEntity excelGroup) throws Exception { | |||
| excelEntity.setName(PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null)); | |||
| 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( | |||
| Integer.valueOf(PoiPublicUtil.getValueByTargetId(excel.orderNum(), targetId, "0"))); | |||
| excelEntity.setWrap(excel.isWrap()); | |||
| excelEntity.setExportImageType(excel.imageType()); | |||
| excelEntity.setSuffix(excel.suffix()); | |||
| excelEntity.setDatabaseFormat(excel.databaseFormat()); | |||
| excelEntity.setFormat( | |||
| StringUtils.isNotEmpty(excel.exportFormat()) ? excel.exportFormat() : excel.format()); | |||
| excelEntity.setStatistics(excel.isStatistics()); | |||
| excelEntity.setHyperlink(excel.isHyperlink()); | |||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||
| excelEntity.setNumFormat(excel.numFormat()); | |||
| if (excelGroup != null) { | |||
| excelEntity.setGroupName(PoiPublicUtil.getValueByTargetId(excelGroup.name(), targetId, null)); | |||
| } else { | |||
| excelEntity.setGroupName(excel.groupName()); | |||
| } | |||
| } | |||
| /** | |||
| * 多个反射获取值 | |||
| */ | |||
| 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 short getRowHeight(List<ExcelExportEntity> excelParams) { | |||
| double 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); | |||
| } | |||
| 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; | |||
| } | |||
| /** | |||
| * 对字段根据用户设置排序 | |||
| */ | |||
| public void sortAllParams(List<ExcelExportEntity> excelParams) { | |||
| // 自然排序,group 内部排序,集合内部排序 | |||
| // 把有groupName的统一收集起来,内部先排序 | |||
| Map<String, List<ExcelExportEntity>> groupMap = new HashMap<String, List<ExcelExportEntity>>(); | |||
| for (int i = excelParams.size() - 1; i > -1; i--) { | |||
| // 集合内部排序 | |||
| if (excelParams.get(i).getList() != null) { | |||
| Collections.sort(excelParams.get(i).getList()); | |||
| } else if (StringUtils.isNoneEmpty(excelParams.get(i).getGroupName())) { | |||
| if (!groupMap.containsKey(excelParams.get(i).getGroupName())) { | |||
| groupMap.put(excelParams.get(i).getGroupName(), new ArrayList<ExcelExportEntity>()); | |||
| } | |||
| groupMap.get(excelParams.get(i).getGroupName()).add(excelParams.get(i)); | |||
| excelParams.remove(i); | |||
| } | |||
| } | |||
| Collections.sort(excelParams); | |||
| if (groupMap.size() > 0) { | |||
| // group 内部排序 | |||
| for (Iterator it = groupMap.entrySet().iterator(); it.hasNext(); ) { | |||
| Map.Entry<String, List<ExcelExportEntity>> entry = (Map.Entry) it.next(); | |||
| Collections.sort(entry.getValue()); | |||
| // 插入到excelParams当中 | |||
| boolean isInsert = false; | |||
| for (int i = 0; i < excelParams.size() - 1; i++) { | |||
| // 跳过groupName 的元素,防止破会内部结构 | |||
| if (StringUtils.isEmpty(excelParams.get(i).getGroupName()) && excelParams.get(i).getOrderNum() <= entry.getValue().get(0).getOrderNum() | |||
| && excelParams.get(i + 1).getOrderNum() > entry.getValue().get(0).getOrderNum()) { | |||
| excelParams.addAll(i + 1, entry.getValue()); | |||
| isInsert = true; | |||
| break; | |||
| } | |||
| } | |||
| //如果都比他小就插入到最后 | |||
| if (!isInsert) { | |||
| excelParams.addAll(entry.getValue()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 添加Index列 | |||
| */ | |||
| public ExcelExportEntity indexExcelEntity(ExportParams entity) { | |||
| ExcelExportEntity exportEntity = new ExcelExportEntity(); | |||
| //保证是第一排 | |||
| exportEntity.setOrderNum(Integer.MIN_VALUE); | |||
| exportEntity.setName(entity.getIndexName()); | |||
| exportEntity.setWidth(10); | |||
| exportEntity.setFormat(PoiBaseConstants.IS_ADD_INDEX); | |||
| return exportEntity; | |||
| } | |||
| /** | |||
| * 获取导出报表的字段总长度 | |||
| */ | |||
| public int getFieldLength(List<ExcelExportEntity> excelParams) { | |||
| int length = -1;// 从0开始计算单元格的 | |||
| for (ExcelExportEntity entity : excelParams) { | |||
| length += entity.getList() != null ? entity.getList().size() : 1; | |||
| } | |||
| return length; | |||
| } | |||
| /** | |||
| * 判断表头是只有一行还是两行 | |||
| */ | |||
| public int getRowNums(List<ExcelExportEntity> excelParams) { | |||
| for (int i = 0; i < excelParams.size(); i++) { | |||
| if (excelParams.get(i).getList() != null | |||
| && StringUtils.isNotBlank(excelParams.get(i).getName())) { | |||
| return 2; | |||
| } | |||
| if (StringUtils.isNoneEmpty(excelParams.get(i).getGroupName())) { | |||
| return 2; | |||
| } | |||
| } | |||
| return 1; | |||
| } | |||
| } | |||
| @@ -47,7 +47,7 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; | |||
| import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams; | |||
| import cn.afterturn.easypoi.excel.export.base.ExcelExportBase; | |||
| import cn.afterturn.easypoi.excel.export.base.ExportBaseServer; | |||
| import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; | |||
| import cn.afterturn.easypoi.excel.export.template.TemplateSumHanlder.TemplateSumEntity; | |||
| import cn.afterturn.easypoi.excel.html.helper.MergedRegionHelper; | |||
| @@ -64,7 +64,7 @@ import cn.afterturn.easypoi.util.PoiSheetUtility; | |||
| * 2013-10-17 | |||
| * @version 1.0 | |||
| */ | |||
| public final class ExcelExportOfTemplateUtil extends ExcelExportBase { | |||
| public final class ExcelExportOfTemplateUtil extends ExportBaseServer { | |||
| private static final Logger LOGGER = LoggerFactory | |||
| .getLogger(ExcelExportOfTemplateUtil.class); | |||
| @@ -110,7 +110,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { | |||
| } | |||
| // 获取实体对象的导出数据 | |||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||
| getAllExcelField(null, targetId, fileds, excelParams, pojoClass, null); | |||
| getAllExcelField(null, targetId, fileds, excelParams, pojoClass, null, null); | |||
| // 根据表头进行筛选排序 | |||
| sortAndFilterExportField(excelParams, titlemap); | |||
| short rowHeight = getRowHeight(excelParams); | |||
| @@ -41,7 +41,7 @@ import com.itextpdf.text.pdf.PdfWriter; | |||
| import cn.afterturn.easypoi.cache.ImageCache; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.export.base.ExportBase; | |||
| import cn.afterturn.easypoi.excel.export.base.ExportCommonServer; | |||
| import cn.afterturn.easypoi.pdf.entity.PdfExportParams; | |||
| import cn.afterturn.easypoi.pdf.styler.IPdfExportStyler; | |||
| import cn.afterturn.easypoi.pdf.styler.PdfExportStylerDefaultImpl; | |||
| @@ -52,7 +52,7 @@ import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| * @author JueYue | |||
| * 2015年10月6日 下午8:21:08 | |||
| */ | |||
| public class PdfExportServer extends ExportBase { | |||
| public class PdfExportServer extends ExportCommonServer { | |||
| private static final Logger LOGGER = LoggerFactory.getLogger(PdfExportServer.class); | |||
| @@ -91,7 +91,7 @@ public class PdfExportServer extends ExportBase { | |||
| ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
| String targetId = etarget == null ? null : etarget.value(); | |||
| getAllExcelField(entity.getExclusions(), targetId, fileds, excelParams, pojoClass, | |||
| null); | |||
| null, null); | |||
| createPdfByExportEntity(entity, excelParams, dataSet); | |||
| } catch (Exception e) { | |||
| LOGGER.error(e.getMessage(), e); | |||
| @@ -1,13 +1,13 @@ | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| @@ -24,6 +24,7 @@ import java.util.List; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTable; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTableCell; | |||
| import org.apache.poi.xwpf.usermodel.XWPFTableRow; | |||
| @@ -32,7 +33,9 @@ import org.slf4j.LoggerFactory; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||
| import cn.afterturn.easypoi.excel.export.base.ExportBase; | |||
| import cn.afterturn.easypoi.excel.export.base.ExportCommonServer; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelExportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||
| import cn.afterturn.easypoi.exception.word.WordExportException; | |||
| import cn.afterturn.easypoi.exception.word.enmus.WordExportEnum; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| @@ -40,11 +43,11 @@ import cn.afterturn.easypoi.word.entity.params.ExcelListEntity; | |||
| /** | |||
| * 解析实体类对象 复用注解 | |||
| * | |||
| * | |||
| * @author JueYue | |||
| * 2014年8月9日 下午10:30:57 | |||
| */ | |||
| public class ExcelEntityParse extends ExportBase { | |||
| public class ExcelEntityParse extends ExportCommonServer { | |||
| private static final Logger LOGGER = LoggerFactory.getLogger(ExcelEntityParse.class); | |||
| @@ -56,62 +59,66 @@ public class ExcelEntityParse extends ExportBase { | |||
| } | |||
| private int createCells(int index, Object t, List<ExcelExportEntity> excelParams, | |||
| XWPFTable table, short rowHeight) throws Exception { | |||
| ExcelExportEntity entity; | |||
| XWPFTableRow row = table.insertNewTableRow(index); | |||
| 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++); | |||
| XWPFTable table, short rowHeight) { | |||
| try { | |||
| ExcelExportEntity entity; | |||
| XWPFTableRow row = table.insertNewTableRow(index); | |||
| 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, rowHeight); | |||
| 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() && maxHeight > 1) { | |||
| table.setCellMargins(index, index + maxHeight - 1, cellNum, cellNum); | |||
| 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() && maxHeight > 1) { | |||
| table.setCellMargins(index, index + maxHeight - 1, cellNum, cellNum); | |||
| cellNum++; | |||
| } | |||
| } | |||
| return maxHeight; | |||
| } catch (Exception e) { | |||
| LOGGER.error("excel cell export error ,data is :{}", ReflectionToStringBuilder.toString(t)); | |||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||
| } | |||
| return maxHeight; | |||
| } | |||
| /** | |||
| * 创建List之后的各个Cells | |||
| * @param index | |||
| * @param cellNum | |||
| * @param obj | |||
| * @param excelParams | |||
| * @param table | |||
| * @param obj 当前对象 | |||
| * @param excelParams 列参数信息 | |||
| * @param table 当前表格 | |||
| * @param rowHeight 行高 | |||
| * @throws Exception | |||
| */ | |||
| public void createListCells(int index, int cellNum, Object obj, | |||
| List<ExcelExportEntity> excelParams, | |||
| XWPFTable table) throws Exception { | |||
| public void createListCells(int index, int cellNum, Object obj, List<ExcelExportEntity> excelParams, XWPFTable table, short rowHeight) throws Exception { | |||
| ExcelExportEntity entity; | |||
| XWPFTableRow row; | |||
| if (table.getRow(index) == null) { | |||
| row = table.createRow(); | |||
| row.setHeight(getRowHeight(excelParams)); | |||
| row.setHeight(rowHeight); | |||
| } else { | |||
| row = table.getRow(index); | |||
| } | |||
| @@ -126,7 +133,7 @@ public class ExcelEntityParse extends ExportBase { | |||
| /** | |||
| * 获取表头数据 | |||
| * | |||
| * | |||
| * @param table | |||
| * @param index | |||
| * @return | |||
| @@ -152,7 +159,7 @@ public class ExcelEntityParse extends ExportBase { | |||
| /** | |||
| * 解析上一行并生成更多行 | |||
| * | |||
| * | |||
| * @param table | |||
| * @param index | |||
| * @param entity | |||
| @@ -172,7 +179,7 @@ public class ExcelEntityParse extends ExportBase { | |||
| } | |||
| // 获取实体对象的导出数据 | |||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||
| getAllExcelField(null, targetId, fileds, excelParams, entity.getClazz(), null); | |||
| getAllExcelField(null, targetId, fileds, excelParams, entity.getClazz(), null, null); | |||
| // 根据表头进行筛选排序 | |||
| sortAndFilterExportField(excelParams, titlemap); | |||
| short rowHeight = getRowHeight(excelParams); | |||
| @@ -190,16 +197,16 @@ public class ExcelEntityParse extends ExportBase { | |||
| if (row.getCell(cellNum++) != null) { | |||
| row.getCell(cellNum - 1).setText(value == null ? "" : value.toString()); | |||
| PoiPublicUtil.setWordText(row.createCell().addParagraph().createRun(), | |||
| value == null ? "" : value.toString()); | |||
| value == null ? "" : value.toString()); | |||
| } else { | |||
| PoiPublicUtil.setWordText(row.createCell().addParagraph().createRun(), | |||
| value == null ? "" : value.toString()); | |||
| value == null ? "" : value.toString()); | |||
| } | |||
| } | |||
| /** | |||
| * 对导出序列进行排序和塞选 | |||
| * | |||
| * | |||
| * @param excelParams | |||
| * @param titlemap | |||
| */ | |||