@@ -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 | |||
*/ | |||