|
|
|
@@ -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<Integer, Double> statistics = new HashMap<Integer, Double>();
|
|
|
|
private Map<Integer, Double> statistics = new HashMap<Integer, Double>();
|
|
|
|
|
|
|
|
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<ExcelExportEntity> 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<ExcelExportEntity> 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<ExcelExportEntity> excelParams, int titleHeight) {
|
|
|
|
Map<Integer, int[]> mergeMap = getMergeDataMap(excelParams);
|
|
|
|
|