package cn.afterturn.easypoi.easy.excel.export.template;
/**
* @version v1.0
* @ProjectName: road
* @ClassName: ExcelExportOfTemplateUtil
* @Description: 4.4.0 版本进行修改
* @Author: xbx
* @Date: 2022/3/4 10:56
* addListDataToExcel(Cell, Map<String, Object>, String);
* foreachCol(Cell, Map<String, Object>, String);
* setForeachRowCellValue(boolean, Row, int, Object, List<ExcelForEachParams>, Map<String, Object>,int, int, MergedRegionHelper,int);
* setForEachLoopRowCellValue(Row, int, Collection, List<ExcelForEachParams>,ExcelForEachParams, Map<String, Object>,int, int,MergedRegionHelper, String);
* 徐本锡 mod by xbx 2022.03.07 list循环遍历的时候 存在合并单元格情况 导致格式错乱
*
* getLoopEachParams(List<ExcelForEachParams>, int, String) 徐本锡 mod by xbx 2022.03.07 解决一对多 row循环中,row元素中包含list并且合并单元格时,报空的错误
* * * 徐本锡 addListDataToExcel(Cell, Map<String, Object>, String); 《&INDEX& 表示循环中的序号,自动添加》 失效问题修改: 增加indexColumn.addConstValue(1); 2022-04-19
*/
import cn.afterturn.easypoi.cache.ExcelCache;
import cn.afterturn.easypoi.easy.excel.export.base.BaseExportService;
import cn.afterturn.easypoi.easy.util.Sd3eUtil;
import cn.afterturn.easypoi.entity.ImageEntity;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateSumEntity;
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.BaseExportService;
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
import cn.afterturn.easypoi.excel.export.template.TemplateSumHandler;
import cn.afterturn.easypoi.excel.html.helper.MergedRegionHelper;
import cn.afterturn.easypoi.exception.excel.ExcelExportException;
import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum;
import cn.afterturn.easypoi.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.util.*;
import static cn.afterturn.easypoi.excel.ExcelExportUtil.SHEET_NAME;
import static cn.afterturn.easypoi.util.PoiElUtil.*;
/**
* Excel 导出根据模板导出
*
* @author JueYue
* 2013-10-17
* @version 1.0
*/
public final class ExcelExportOfTemplateUtil extends BaseExportService {
private static final Logger LOGGER = LoggerFactory
.getLogger(ExcelExportOfTemplateUtil.class);
/**
* 缓存TEMP 的for each创建的cell ,跳过这个cell的模板语法查找,提高效率
*/
private Set<String> tempCreateCellSet = new HashSet<String>();
/**
* 模板参数,全局都用到
*/
private TemplateExportParams templateParams;
/**
* 单元格合并信息
*/
private MergedRegionHelper mergedRegionHelper;
private TemplateSumHandler templateSumHandler;
/**
* 往Sheet 填充正常数据,根据表头信息 使用导入的部分逻辑,坐对象映射
*
* @param sheet
* @param pojoClass
* @param dataSet
* @param workbook
*/
private void addDataToSheet(Class<?> pojoClass, Collection<?> dataSet, Sheet sheet,
Workbook workbook) throws Exception {
// 获取表头数据
Map<String, Integer> titlemap = getTitleMap(sheet);
Drawing patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet);
// 得到所有字段
Field[] fileds = PoiPublicUtil.getClassFields(pojoClass);
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class);
String targetId = null;
if (etarget != null) {
targetId = etarget.value();
}
// 获取实体对象的导出数据
List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>();
getAllExcelField(null, targetId, fileds, excelParams, pojoClass, null, null);
// 根据表头进行筛选排序
sortAndFilterExportField(excelParams, titlemap);
short rowHeight = getRowHeight(excelParams);
int index = templateParams.getHeadingRows() + templateParams.getHeadingStartRow(),
titleHeight = index;
int shiftRows = getShiftRows(dataSet, excelParams);
//下移数据,模拟插入
sheet.shiftRows(templateParams.getHeadingRows() + templateParams.getHeadingStartRow(),
sheet.getLastRowNum(), shiftRows, true, true);
mergedRegionHelper.shiftRows(sheet, templateParams.getHeadingRows() + templateParams.getHeadingStartRow(), shiftRows,
sheet.getLastRowNum() - templateParams.getHeadingRows() - templateParams.getHeadingStartRow());
templateSumHandler.shiftRows(templateParams.getHeadingRows() + templateParams.getHeadingStartRow(), shiftRows);
PoiExcelTempUtil.reset(sheet, templateParams.getHeadingRows() + templateParams.getHeadingStartRow(), sheet.getLastRowNum());
if (excelParams.size() == 0) {
return;
}
Iterator<?> its = dataSet.iterator();
while (its.hasNext()) {
Object t = its.next();
index += createCells(patriarch, index, t, excelParams, sheet, workbook, rowHeight, 0)[0];
}
// 合并同类项
mergeCells(sheet, excelParams, titleHeight);
}
/**
* 利用foreach循环输出数据
*
* @param cell
* @param map
* @param name
* @throws Exception
* 徐本锡 mod by xbx 2022.03.07 list循环遍历的时候 存在合并单元格情况 导致格式错乱
*/
private void addListDataToExcel(Cell cell, Map<String, Object> map,
String name) throws Exception {
//mod by xbx
// 每次利用foreach循环输出数据时,重新处理 mergedRegionHelper
// 原因:如果存在多个循环,前面循环时,下面的模板指令所在单元格的行号会发生变化,此时 mergedRegionHelper 中的缓存没有发生相应变化,需要重新获取一下 mergedRegionHelper
mergedRegionHelper = new MergedRegionHelper(cell.getSheet());
boolean isCreate = !name.contains(FOREACH_NOT_CREATE);
boolean isShift = name.contains(FOREACH_AND_SHIFT);
name = name.replace(FOREACH_NOT_CREATE, EMPTY).replace(FOREACH_AND_SHIFT, EMPTY)
.replace(FOREACH, EMPTY).replace(START_STR, EMPTY);
String[] keys = name.replaceAll("\\s{1,}", " ").trim().split(" ");
Collection<?> datas = (Collection<?>) PoiPublicUtil.getParamsValue(keys[0], map);
if (datas == null) {
return;
}
Object[] columnsInfo = getAllDataColumns(cell, name.replace(keys[0], EMPTY),
mergedRegionHelper);
Iterator<?> its = datas.iterator();
int rowspan = (Integer) columnsInfo[0], colspan = (Integer) columnsInfo[1];
@SuppressWarnings("unchecked")
List<ExcelForEachParams> columns = (List<ExcelForEachParams>) columnsInfo[2];
Row row = null;
int rowIndex = cell.getRow().getRowNum() + 1;
ExcelForEachParams indexColumn = getIndexColumn(columns);
//mod by xbx
// 定义循环开始行号
int startRowNum = cell.getRow().getRowNum();
// 处理当前行
if (its.hasNext()) {
Object t =
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本文解决三个问题 (1)模板导出图片不显示(实际上导出来了只是最小化显示了) (2)fe循环指令存在而合并单元格的时候格式错乱问题 (3)fe存在一对多关系的时候格式错乱问题 不想下载的可以参考博文 ,代码是一样的 https://blog.csdn.net/xubenxismile/article/details/123370375
资源详情
资源评论
资源推荐
收起资源包目录
esaypoi4.4.0优化代码.rar (8个子文件)
esaypoi4.4.0优化代码
模板
xbx.xlsx 21KB
xbx1.xlsx 21KB
代码
easypoi
EsaypoiTest.java 211B
util
Sd3eUtil.java 1KB
excel
ExcelExportUtil.java 7KB
export
base
BaseExportService.java 23KB
ExportTest.java 222B
template
ExcelExportOfTemplateUtil.java 59KB
共 8 条
- 1
十&年
- 粉丝: 2w+
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0