|
|
@@ -1,26 +1,26 @@ |
|
|
|
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.PoiMergeCellUtil;
|
|
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
|
|
|
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
|
|
|
|
* 2015年5月9日 下午2:13:35
|
|
|
|
* 2015年5月9日 下午2:13:35
|
|
|
|
*/
|
|
|
|
public class MergedRegionHelper {
|
|
|
|
|
|
|
|
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) {
|
|
|
|
getAllMergedRegion(sheet);
|
|
|
@@ -29,7 +29,7 @@ public class MergedRegionHelper { |
|
|
|
private void getAllMergedRegion(Sheet sheet) {
|
|
|
|
int nums = sheet.getNumMergedRegions();
|
|
|
|
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
|
|
|
|
*/
|
|
|
|
private void handerMergedString(String formatAsString) {
|
|
|
|
private void handlerMergedString(CellRangeAddress cellRangeAddress, String formatAsString) {
|
|
|
|
String[] strArr = formatAsString.split(":");
|
|
|
|
if (strArr.length == 2) {
|
|
|
|
int startCol = strArr[0].charAt(0) - 65;
|
|
|
@@ -46,7 +46,7 @@ public class MergedRegionHelper { |
|
|
|
startCol = (startCol + 1) * 26 + (strArr[0].charAt(1) - 65);
|
|
|
|
}
|
|
|
|
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) {
|
|
|
|
endCol = (endCol + 1) * 26 + (strArr[1].charAt(1) - 65);
|
|
|
|
}
|
|
|
@@ -55,10 +55,10 @@ public class MergedRegionHelper { |
|
|
|
new Integer[]{endRol - startRol + 1, endCol - startCol + 1});
|
|
|
|
for (int i = startRol; i <= endRol; i++) {
|
|
|
|
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
|
|
|
|
*/
|
|
|
|
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) {
|
|
|
|
String[] temp = key.split("_");
|
|
|
|
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));
|
|
|
|
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) {
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|