|
|
@@ -48,6 +48,7 @@ import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; |
|
|
|
import org.jeecgframework.poi.excel.entity.params.MergeEntity;
|
|
|
|
import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants;
|
|
|
|
import org.jeecgframework.poi.excel.export.styler.IExcelExportStyler;
|
|
|
|
import org.jeecgframework.poi.util.PoiMergeCellUtil;
|
|
|
|
import org.jeecgframework.poi.util.PoiPublicUtil;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
@@ -59,8 +60,9 @@ import org.slf4j.LoggerFactory; |
|
|
|
* @date 2014年6月17日 下午6:15:13
|
|
|
|
*/
|
|
|
|
public abstract class ExcelExportBase extends ExportBase {
|
|
|
|
|
|
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelExportBase.class);
|
|
|
|
|
|
|
|
private static final Logger LOGGER = LoggerFactory
|
|
|
|
.getLogger(ExcelExportBase.class);
|
|
|
|
|
|
|
|
private int currentIndex = 0;
|
|
|
|
|
|
|
@@ -72,25 +74,6 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
|
|
|
|
private IExcelExportStyler excelExportStyler;
|
|
|
|
|
|
|
|
private boolean checkIsEqualByCellContents(MergeEntity mergeEntity, String text, Cell cell,
|
|
|
|
int[] delys, int rowNum) {
|
|
|
|
// 没有依赖关系
|
|
|
|
if (delys == null || delys.length == 0) {
|
|
|
|
return mergeEntity.getText().equals(text);
|
|
|
|
}
|
|
|
|
// 存在依赖关系
|
|
|
|
if (mergeEntity.getText().equals(text)) {
|
|
|
|
for (int i = 0; i < delys.length; i++) {
|
|
|
|
if (!getCellNotNullText(cell, delys[i], rowNum).equals(
|
|
|
|
mergeEntity.getRelyList().get(i))) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 创建 最主要的 Cells
|
|
|
|
*
|
|
|
@@ -110,7 +93,7 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
for (int k = indexKey, paramSize = excelParams.size(); k < paramSize; k++) {
|
|
|
|
entity = excelParams.get(k);
|
|
|
|
if (entity.getList() != null) {
|
|
|
|
Collection<?> list = getListCellValue(entity,t);
|
|
|
|
Collection<?> list = getListCellValue(entity, t);
|
|
|
|
int listC = 0;
|
|
|
|
for (Object obj : list) {
|
|
|
|
createListCells(patriarch, index + listC, cellNum, obj, entity.getList(),
|
|
|
@@ -194,7 +177,7 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
patriarch.createPicture(anchor,
|
|
|
|
row.getSheet().getWorkbook().addPicture(value, getImageType(value)));
|
|
|
|
} catch (IOException e) {
|
|
|
|
LOGGER.error(e.getMessage(),e);
|
|
|
|
LOGGER.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
byte[] value = (byte[]) (entity.getMethods() != null ? getFieldBySomeMethod(
|
|
|
@@ -248,16 +231,6 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private MergeEntity createMergeEntity(String text, int rowNum, Cell cell, int[] delys) {
|
|
|
|
MergeEntity mergeEntity = new MergeEntity(text, rowNum, rowNum);
|
|
|
|
List<String> list = new ArrayList<String>(delys.length);
|
|
|
|
mergeEntity.setRelyList(list);
|
|
|
|
for (int i = 0; i < delys.length; i++) {
|
|
|
|
list.add(getCellNotNullText(cell, delys[i], rowNum));
|
|
|
|
}
|
|
|
|
return mergeEntity;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 创建文本类型的Cell
|
|
|
|
*
|
|
|
@@ -326,22 +299,6 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取一个单元格的值,确保这个单元格必须有值,不然向上查询
|
|
|
|
*
|
|
|
|
* @param cell
|
|
|
|
* @param index
|
|
|
|
* @param rowNum
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private String getCellNotNullText(Cell cell, int index, int rowNum) {
|
|
|
|
String temp = cell.getRow().getCell(index).getStringCellValue();
|
|
|
|
while (StringUtils.isEmpty(temp)) {
|
|
|
|
temp = cell.getRow().getSheet().getRow(--rowNum).getCell(index).getStringCellValue();
|
|
|
|
}
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取导出报表的字段总长度
|
|
|
|
*
|
|
|
@@ -406,50 +363,6 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
return excelExportStyler.getStyles(needOne, entity);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 处理合并单元格
|
|
|
|
*
|
|
|
|
* @param index
|
|
|
|
* @param rowNum
|
|
|
|
* @param text
|
|
|
|
* @param mergeDataMap
|
|
|
|
* @param sheet
|
|
|
|
* @param cell
|
|
|
|
* @param delys
|
|
|
|
*/
|
|
|
|
private void hanlderMergeCells(Integer index, int rowNum, String text,
|
|
|
|
Map<Integer, MergeEntity> mergeDataMap, Sheet sheet, Cell cell,
|
|
|
|
int[] delys) {
|
|
|
|
if (mergeDataMap.containsKey(index)) {
|
|
|
|
if (checkIsEqualByCellContents(mergeDataMap.get(index), text, cell, delys, rowNum)) {
|
|
|
|
mergeDataMap.get(index).setEndRow(rowNum);
|
|
|
|
} else {
|
|
|
|
sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(),
|
|
|
|
mergeDataMap.get(index).getEndRow(), index, index));
|
|
|
|
mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 字符为空的情况下判断
|
|
|
|
*
|
|
|
|
* @param index
|
|
|
|
* @param mergeDataMap
|
|
|
|
* @param sheet
|
|
|
|
*/
|
|
|
|
private void mergeCellOrContinue(Integer index, Map<Integer, MergeEntity> mergeDataMap,
|
|
|
|
Sheet sheet) {
|
|
|
|
if (mergeDataMap.containsKey(index)
|
|
|
|
&& mergeDataMap.get(index).getEndRow() != mergeDataMap.get(index).getStartRow()) {
|
|
|
|
sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(),
|
|
|
|
mergeDataMap.get(index).getEndRow(), index, index));
|
|
|
|
mergeDataMap.remove(index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 合并单元格
|
|
|
|
*
|
|
|
@@ -459,36 +372,7 @@ public abstract class ExcelExportBase extends ExportBase { |
|
|
|
*/
|
|
|
|
public void mergeCells(Sheet sheet, List<ExcelExportEntity> excelParams, int titleHeight) {
|
|
|
|
Map<Integer, int[]> mergeMap = getMergeDataMap(excelParams);
|
|
|
|
Map<Integer, MergeEntity> mergeDataMap = new HashMap<Integer, MergeEntity>();
|
|
|
|
if (mergeMap.size() == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Row row;
|
|
|
|
Set<Integer> sets = mergeMap.keySet();
|
|
|
|
String text;
|
|
|
|
for (int i = titleHeight; i <= sheet.getLastRowNum(); i++) {
|
|
|
|
row = sheet.getRow(i);
|
|
|
|
for (Integer index : sets) {
|
|
|
|
if (row.getCell(index) == null) {
|
|
|
|
mergeDataMap.get(index).setEndRow(i);
|
|
|
|
} else {
|
|
|
|
text = row.getCell(index).getStringCellValue();
|
|
|
|
if (StringUtils.isNotEmpty(text)) {
|
|
|
|
hanlderMergeCells(index, i, text, mergeDataMap, sheet, row.getCell(index),
|
|
|
|
mergeMap.get(index));
|
|
|
|
} else {
|
|
|
|
mergeCellOrContinue(index, mergeDataMap, sheet);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (mergeDataMap.size() > 0) {
|
|
|
|
for (Integer index : mergeDataMap.keySet()) {
|
|
|
|
sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(),
|
|
|
|
mergeDataMap.get(index).getEndRow(), index, index));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PoiMergeCellUtil.mergeCells(sheet, mergeMap, titleHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setCellWith(List<ExcelExportEntity> excelParams, Sheet sheet) {
|
|
|
|