Browse Source

修改会下移合并问题

4.1.3.A
jueyue 6 years ago
parent
commit
ddd77a6969
2 changed files with 25 additions and 46 deletions
  1. +3
    -8
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java
  2. +22
    -38
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/html/helper/MergedRegionHelper.java

+ 3
- 8
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java View File

@@ -147,14 +147,12 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
rowspan, colspan, mergedRegionHelper); rowspan, colspan, mergedRegionHelper);
rowIndex += rowspan - 1; rowIndex += rowspan - 1;
} }
//不论后面有没有数据,都应该执行的是插入操作
// && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()
//修复不论后面有没有数据,都应该执行的是插入操作
if (isShift && datas.size() * rowspan > 1 && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()) { if (isShift && datas.size() * rowspan > 1 && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()) {
cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan,
cell.getRow().getSheet().getLastRowNum(), (datas.size() - 1) * rowspan, true, true);
int lastRowNum = cell.getRow().getSheet().getLastRowNum();
cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan, lastRowNum, (datas.size() - 1) * rowspan, true, true);
mergedRegionHelper.shiftRows(cell.getSheet(), cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan); mergedRegionHelper.shiftRows(cell.getSheet(), cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan);
templateSumHandler.shiftRows(cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan); templateSumHandler.shiftRows(cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan);
} }
while (its.hasNext()) { while (its.hasNext()) {
Object t = its.next(); Object t = its.next();
@@ -402,9 +400,6 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
//修改需要处理的统计值 //修改需要处理的统计值
handlerSumCell(sheet); handlerSumCell(sheet);
//修复因为调用shiftRows而被破坏的合并单元格
mergedRegionHelper.mergeOtherCell(sheet);
} }
private void handlerSumCell(Sheet sheet) { private void handlerSumCell(Sheet sheet) {


+ 22
- 38
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/html/helper/MergedRegionHelper.java View File

@@ -1,26 +1,26 @@
package cn.afterturn.easypoi.excel.html.helper; package cn.afterturn.easypoi.excel.html.helper;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import cn.afterturn.easypoi.util.PoiCellUtil; import cn.afterturn.easypoi.util.PoiCellUtil;
import cn.afterturn.easypoi.util.PoiMergeCellUtil; import cn.afterturn.easypoi.util.PoiMergeCellUtil;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/** /**
* 合并单元格帮助类 * 合并单元格帮助类
* *
* @author JueYue * @author JueYue
* 2015年5月9日 下午2:13:35
* 2015年5月9日 下午2:13:35
*/ */
public class MergedRegionHelper { public class MergedRegionHelper {
private Map<String, Integer[]> mergedCache = new HashMap<String, Integer[]>(); private Map<String, Integer[]> mergedCache = new HashMap<String, Integer[]>();
private Set<String> notNeedCread = new HashSet<String>();
private Set<String> notNeedCache = new HashSet<String>();
public MergedRegionHelper(Sheet sheet) { public MergedRegionHelper(Sheet sheet) {
getAllMergedRegion(sheet); getAllMergedRegion(sheet);
@@ -29,7 +29,7 @@ public class MergedRegionHelper {
private void getAllMergedRegion(Sheet sheet) { private void getAllMergedRegion(Sheet sheet) {
int nums = sheet.getNumMergedRegions(); int nums = sheet.getNumMergedRegions();
for (int i = 0; i < nums; i++) { for (int i = 0; i < nums; i++) {
handerMergedString(sheet.getMergedRegion(i).formatAsString());
handlerMergedString(sheet.getMergedRegion(i), sheet.getMergedRegion(i).formatAsString());
} }
} }
@@ -38,7 +38,7 @@ public class MergedRegionHelper {
* *
* @param formatAsString * @param formatAsString
*/ */
private void handerMergedString(String formatAsString) {
private void handlerMergedString(CellRangeAddress cellRangeAddress, String formatAsString) {
String[] strArr = formatAsString.split(":"); String[] strArr = formatAsString.split(":");
if (strArr.length == 2) { if (strArr.length == 2) {
int startCol = strArr[0].charAt(0) - 65; int startCol = strArr[0].charAt(0) - 65;
@@ -46,7 +46,7 @@ public class MergedRegionHelper {
startCol = (startCol + 1) * 26 + (strArr[0].charAt(1) - 65); startCol = (startCol + 1) * 26 + (strArr[0].charAt(1) - 65);
} }
int startRol = Integer.valueOf(strArr[0].substring(strArr[0].charAt(1) >= 65 ? 2 : 1)); int startRol = Integer.valueOf(strArr[0].substring(strArr[0].charAt(1) >= 65 ? 2 : 1));
int endCol = strArr[1].charAt(0) - 65;
int endCol = strArr[1].charAt(0) - 65;
if (strArr[1].charAt(1) >= 65) { if (strArr[1].charAt(1) >= 65) {
endCol = (endCol + 1) * 26 + (strArr[1].charAt(1) - 65); endCol = (endCol + 1) * 26 + (strArr[1].charAt(1) - 65);
} }
@@ -55,10 +55,10 @@ public class MergedRegionHelper {
new Integer[]{endRol - startRol + 1, endCol - startCol + 1}); new Integer[]{endRol - startRol + 1, endCol - startCol + 1});
for (int i = startRol; i <= endRol; i++) { for (int i = startRol; i <= endRol; i++) {
for (int j = startCol; j <= endCol; j++) { for (int j = startCol; j <= endCol; j++) {
notNeedCread.add(i + "_" + j);
notNeedCache.add(i + "_" + j);
} }
} }
notNeedCread.remove(startRol + "_" + startCol);
notNeedCache.remove(startRol + "_" + startCol);
} }
} }
@@ -71,7 +71,7 @@ public class MergedRegionHelper {
* @return * @return
*/ */
public boolean isNeedCreate(int row, int col) { public boolean isNeedCreate(int row, int col) {
return !notNeedCread.contains(row + "_" + col);
return !notNeedCache.contains(row + "_" + col);
} }
/** /**
@@ -108,16 +108,18 @@ public class MergedRegionHelper {
for (String key : keys) { for (String key : keys) {
String[] temp = key.split("_"); String[] temp = key.split("_");
if (Integer.parseInt(temp[0]) >= rowIndex) { if (Integer.parseInt(temp[0]) >= rowIndex) {
Integer[] data = mergedCache.get(key);
String newKey = (Integer.parseInt(temp[0]) + size) + "_" + temp[1];
if(!mergedCache.containsKey(newKey)){
Integer[] data = mergedCache.get(key);
String newKey = (Integer.parseInt(temp[0]) + size) + "_" + temp[1];
if (!mergedCache.containsKey(newKey)) {
mergedCache.put(newKey, mergedCache.get(key)); mergedCache.put(newKey, mergedCache.get(key));
try { try {
// 还原合并单元格 // 还原合并单元格
PoiMergeCellUtil.addMergedRegion(sheet,
Integer.parseInt(temp[0]) + size - 1, Integer.parseInt(temp[0]) + data[0] + size - 2,
Integer.parseInt(temp[1]), Integer.parseInt(temp[1]) + data[1] - 1
);
if (!PoiCellUtil.isMergedRegion(sheet, Integer.parseInt(temp[0]) + size - 1, Integer.parseInt(temp[1]))) {
PoiMergeCellUtil.addMergedRegion(sheet,
Integer.parseInt(temp[0]) + size - 1, Integer.parseInt(temp[0]) + data[0] + size - 2,
Integer.parseInt(temp[1]), Integer.parseInt(temp[1]) + data[1] - 1
);
}
} catch (Exception e) { } catch (Exception e) {
} }
} }
@@ -125,22 +127,4 @@ public class MergedRegionHelper {
} }
} }
/**
* 把破坏的单元格合并(POI的shiftRows方法会把移动的行的合并单元格拆分)
* @return
*/
public void mergeOtherCell(Sheet sheet) {
Set<String> tempMergeKeySet = mergedCache.keySet();
for(String mergeKey : tempMergeKeySet) {
String[] row_col = mergeKey.split("_");
if(!PoiCellUtil.isMergedRegion(sheet, Integer.valueOf(row_col[0]) - 1, Integer.valueOf(row_col[1]))) {
Integer[] mergeCellValue = mergedCache.get(mergeKey);
sheet.addMergedRegion(new CellRangeAddress(Integer.valueOf(row_col[0]) - 1,
Integer.valueOf(row_col[0]) - 1 + mergeCellValue[0] - 1, Integer.valueOf(row_col[1]),
Integer.valueOf(row_col[1]) + mergeCellValue[1] - 1));
}
}
}
} }

Loading…
Cancel
Save