diff --git a/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/ExcelEntity.java b/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/ExcelEntity.java index 03dddfa..a811c02 100644 --- a/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/ExcelEntity.java +++ b/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/ExcelEntity.java @@ -41,7 +41,7 @@ public @interface ExcelEntity { public String name() default ""; /** - * 如果现实则这个Excel的表头会变成两行,同时改Excel内部数据不参与总排序,排序用下面这个来代替,内部再排序 + * 如果等于true,name必须有值, Excel的表头会变成两行,同时改Excel内部数据不参与总排序,排序用下面这个来代替,内部再排序 * @return */ public boolean show() default false; diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportServer.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportServer.java index 8653f14..9f1179b 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportServer.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportServer.java @@ -19,6 +19,7 @@ import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; 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.PoiPublicUtil; /** @@ -115,7 +116,7 @@ public class ExcelBatchExportServer extends ExcelExportServer { // 创建表格样式 setExcelExportStyler((IExcelExportStyler) entity.getStyle() .getConstructor(Workbook.class).newInstance(workbook)); - patriarch = sheet.createDrawingPatriarch(); + patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet); List excelParams = new ArrayList(); if (entity.isAddIndex()) { excelParams.add(indexExcelEntity(entity)); diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelExportServer.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelExportServer.java index 186ef6c..9d2fb53 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelExportServer.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelExportServer.java @@ -38,6 +38,7 @@ import cn.afterturn.easypoi.excel.export.base.ExcelExportBase; 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.PoiPublicUtil; /** @@ -161,7 +162,7 @@ public class ExcelExportServer extends ExcelExportBase { // 创建表格样式 setExcelExportStyler((IExcelExportStyler) entity.getStyle() .getConstructor(Workbook.class).newInstance(workbook)); - Drawing patriarch = sheet.createDrawingPatriarch(); + Drawing patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet); List excelParams = new ArrayList(); if (entity.isAddIndex()) { excelParams.add(indexExcelEntity(entity)); diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/base/ExcelExportBase.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/base/ExcelExportBase.java index 4a2e300..37fb584 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/base/ExcelExportBase.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/base/ExcelExportBase.java @@ -1,27 +1,18 @@ /** * 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 - * 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. + * 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.text.DecimalFormat; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFRichTextString; @@ -37,45 +28,43 @@ 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 + * + * @author JueYue 2014年6月17日 下午6:15:13 */ @SuppressWarnings("unchecked") public abstract class ExcelExportBase extends ExportBase { - private int currentIndex = 0; + private int currentIndex = 0; - protected ExcelType type = ExcelType.HSSF; + protected ExcelType type = ExcelType.HSSF; - private Map statistics = new HashMap(); + private Map statistics = new HashMap(); private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); - protected IExcelExportStyler excelExportStyler; + protected IExcelExportStyler excelExportStyler; /** * 创建 最主要的 Cells - * @param patriarch - * @param index - * @param t - * @param excelParams - * @param sheet - * @param workbook - * @param rowHeight - * @return - * @throws Exception */ public int createCells(Drawing patriarch, int index, Object t, List excelParams, Sheet sheet, Workbook workbook, @@ -94,7 +83,7 @@ public abstract class ExcelExportBase extends ExportBase { if (list != null && list.size() > 0) { for (Object obj : list) { createListCells(patriarch, index + listC, cellNum, obj, entity.getList(), - sheet, workbook); + sheet, workbook); listC++; } } @@ -103,31 +92,31 @@ public abstract class ExcelExportBase extends ExportBase { maxHeight = list.size(); } } else { - Object value = getCellValue(entity, t); - + 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); + 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)); + .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); + 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)); + .setHyperlink(dataHanlder.getHyperlink( + row.getSheet().getWorkbook().getCreationHelper(), t, + entity.getName(), value)); } } else { createImageCell(patriarch, entity, row, cellNum++, - value == null ? "" : value.toString(), t); + value == null ? "" : value.toString(), t); } } } @@ -143,7 +132,7 @@ public abstract class ExcelExportBase extends ExportBase { sheet.getRow(i).getCell(cellNum).setCellStyle(getStyles(false, entity)); } sheet.addMergedRegion( - new CellRangeAddress(index, index + maxHeight - 1, cellNum, cellNum)); + new CellRangeAddress(index, index + maxHeight - 1, cellNum, cellNum)); cellNum++; } } @@ -153,50 +142,52 @@ public abstract class ExcelExportBase extends ExportBase { /** * 图片类型的Cell - * - * @param patriarch - * @param entity - * @param row - * @param i - * @param imagePath - * @param obj - * @throws Exception */ public void createImageCell(Drawing patriarch, ExcelExportEntity entity, Row row, int i, String imagePath, Object obj) throws Exception { - row.setHeight((short) (50 * entity.getHeight())); - row.createCell(i); + 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) i, row.getRowNum(), (short) (i + 1), - row.getRowNum() + 1); + 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) i, row.getRowNum(), (short) (i + 1), - row.getRowNum() + 1); + anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), + cell.getRow().getRowNum() + 1); } - - byte[] value = null; - if (entity.getExportImageType() == 1) { - if (StringUtils.isNotEmpty(imagePath)) { - value = ImageCache.getImage(imagePath); - } - } else { - value = (byte[]) (entity.getMethods() != null - ? getFieldBySomeMethod(entity.getMethods(), obj) - : entity.getMethod().invoke(obj, new Object[] {})); + if (StringUtils.isNotEmpty(imagePath)) { + data = ImageCache.getImage(imagePath); } - if (value != null) { - patriarch.createPicture(anchor, - row.getSheet().getWorkbook().addPicture(value, getImageType(value))); + 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)) { + 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); + index % 2 == 0 ? getStyles(false, null) : getStyles(true, null), null); currentIndex = currentIndex + 1; return 1; } @@ -205,14 +196,6 @@ public abstract class ExcelExportBase extends ExportBase { /** * 创建List之后的各个Cells - * @param patriarch - * @param index - * @param cellNum - * @param obj - * @param excelParams - * @param sheet - * @param workbook - * @throws Exception */ public void createListCells(Drawing patriarch, int index, int cellNum, Object obj, List excelParams, Sheet sheet, @@ -230,38 +213,32 @@ public abstract class ExcelExportBase extends ExportBase { 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); + 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)); + .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); + 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)); + .setHyperlink(dataHanlder.getHyperlink( + row.getSheet().getWorkbook().getCreationHelper(), obj, entity.getName(), + value)); } } else { createImageCell(patriarch, entity, row, cellNum++, - value == null ? "" : value.toString(), obj); + value == null ? "" : value.toString(), obj); } } } /** * 创建文本类型的Cell - * - * @param row - * @param index - * @param text - * @param style - * @param entity */ public void createStringCell(Row row, int index, String text, CellStyle style, ExcelExportEntity entity) { @@ -286,12 +263,6 @@ public abstract class ExcelExportBase extends ExportBase { /** * 创建数字类型的Cell - * - * @param row - * @param index - * @param text - * @param style - * @param entity */ public void createDoubleCell(Row row, int index, String text, CellStyle style, ExcelExportEntity entity) { @@ -308,8 +279,6 @@ public abstract class ExcelExportBase extends ExportBase { /** * 创建统计行 - * @param styles - * @param sheet */ public void addStatisticsRow(CellStyle styles, Sheet sheet) { if (statistics.size() > 0) { @@ -326,9 +295,6 @@ public abstract class ExcelExportBase extends ExportBase { /** * 合计统计信息 - * @param index - * @param text - * @param entity */ private void addStatisticsData(Integer index, String text, ExcelExportEntity entity) { if (entity != null && entity.isStatistics()) { @@ -346,11 +312,8 @@ public abstract class ExcelExportBase extends ExportBase { /** * 获取图片类型,设置图片插入类型 - * - * @param value - * @return - * @author JueYue - * 2013年11月25日 + * + * @author JueYue 2013年11月25日 */ public int getImageType(byte[] value) { String type = PoiPublicUtil.getFileExtendName(value); @@ -359,7 +322,7 @@ public abstract class ExcelExportBase extends ExportBase { } else if (type.equalsIgnoreCase("PNG")) { return Workbook.PICTURE_TYPE_PNG; } - + return Workbook.PICTURE_TYPE_JPEG; } @@ -387,9 +350,6 @@ public abstract class ExcelExportBase extends ExportBase { /** * 获取样式 - * @param entity - * @param needOne - * @return */ public CellStyle getStyles(boolean needOne, ExcelExportEntity entity) { return excelExportStyler.getStyles(needOne, entity); @@ -397,10 +357,6 @@ public abstract class ExcelExportBase extends ExportBase { /** * 合并单元格 - * - * @param sheet - * @param excelParams - * @param titleHeight */ public void mergeCells(Sheet sheet, List excelParams, int titleHeight) { Map mergeMap = getMergeDataMap(excelParams); diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java index b62e012..f7b11c6 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java @@ -41,6 +41,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.afterturn.easypoi.cache.ExcelCache; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.afterturn.easypoi.excel.annotation.ExcelTarget; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; @@ -52,6 +53,7 @@ import cn.afterturn.easypoi.excel.export.template.TemplateSumHanlder.TemplateSum import cn.afterturn.easypoi.excel.html.helper.MergedRegionHelper; 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.PoiPublicUtil; import cn.afterturn.easypoi.util.PoiSheetUtility; @@ -98,7 +100,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { } // 获取表头数据 Map titlemap = getTitleMap(sheet); - Drawing patriarch = sheet.createDrawingPatriarch(); + Drawing patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet); // 得到所有字段 Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); @@ -400,19 +402,17 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { isNumber = true; oldString = oldString.replaceFirst(NUMBER_SYMBOL, ""); } - while (oldString.indexOf(START_STR) != -1) { - params = oldString.substring(oldString.indexOf(START_STR) + 2, - oldString.indexOf(END_STR)); - - oldString = oldString.replace(START_STR + params + END_STR, - eval(params, map).toString()); - } + Object obj = PoiPublicUtil.getRealValue(oldString, map); //如何是数值 类型,就按照数值类型进行设置 - if (isNumber && StringUtils.isNotBlank(oldString)) { - cell.setCellValue(Double.parseDouble(oldString)); + if (obj instanceof ImageEntity) {// 如果是图片就设置为图片 + ImageEntity img = (ImageEntity)obj; + cell.setCellValue(""); + createImageCell(cell,img.getHeight(),img.getUrl(),img.getData()); + }else if (isNumber && StringUtils.isNotBlank(obj.toString())) { + cell.setCellValue(Double.parseDouble(obj.toString())); cell.setCellType(Cell.CELL_TYPE_NUMERIC); } else { - cell.setCellValue(oldString); + cell.setCellValue(obj.toString()); } } //判断foreach 这种方法 diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/graph/builder/ExcelChartBuildService.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/graph/builder/ExcelChartBuildService.java index 34b2134..6d49b6a 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/graph/builder/ExcelChartBuildService.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/graph/builder/ExcelChartBuildService.java @@ -135,7 +135,7 @@ public class ExcelChartBuildService { int drawStart=0; int drawEnd=20; - Drawing drawing = tragetSheet.createDrawingPatriarch(); + Drawing drawing = PoiExcelGraphDataUtil.getDrawingPatriarch(tragetSheet); for(int i=0;i runIndex, Map map) throws Exception { Object obj = PoiPublicUtil.getRealValue(currentText, map); - if (obj instanceof WordImageEntity) {// 如果是图片就设置为图片 + if (obj instanceof ImageEntity) {// 如果是图片就设置为图片 currentRun.setText("", 0); - addAnImage((WordImageEntity) obj, currentRun); + addAnImage((ImageEntity) obj, currentRun); } else { currentText = obj.toString(); PoiPublicUtil.setWordText(currentRun, currentText);