|
@@ -1,2 +1,90 @@
|
|
|
-package com.fdkankan.sale.util;public class ExcelFillCellMergeStrategy {
|
|
|
+package com.fdkankan.sale.util;
|
|
|
+
|
|
|
+import com.alibaba.excel.metadata.Head;
|
|
|
+import com.alibaba.excel.metadata.data.WriteCellData;
|
|
|
+import com.alibaba.excel.write.handler.CellWriteHandler;
|
|
|
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
|
|
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
|
|
+import org.apache.poi.ss.usermodel.Cell;
|
|
|
+import org.apache.poi.ss.usermodel.CellType;
|
|
|
+import org.apache.poi.ss.usermodel.Sheet;
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class ExcelFillCellMergeStrategy implements CellWriteHandler {
|
|
|
+ /** 需要进行单元格合并的列数组 **/
|
|
|
+ private int[] mergeColumnIndex;
|
|
|
+ /** 单元格合并从第几行开始 **/
|
|
|
+ private int[] mergeRowIndex;
|
|
|
+ public ExcelFillCellMergeStrategy() {}
|
|
|
+ public ExcelFillCellMergeStrategy(int[] mergeRowIndex, int[] mergeColumnIndex) {
|
|
|
+ this.mergeRowIndex = mergeRowIndex;
|
|
|
+ this.mergeColumnIndex = mergeColumnIndex;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
|
|
|
+ List<WriteCellData<?>> list, Cell cell, Head head, Integer integer, Boolean isHead) {
|
|
|
+ int curRowIndex = cell.getRowIndex();
|
|
|
+ int curColIndex = cell.getColumnIndex();
|
|
|
+ int length = mergeRowIndex.length;
|
|
|
+ //判断是否合并行,
|
|
|
+ for (int k = 0; k < length; k++) {
|
|
|
+ //2个数为一组,一组做一次合并。
|
|
|
+ if(k!=0 && k%2!=0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //每组数开始合并
|
|
|
+ if (curRowIndex >= mergeRowIndex[k] && curRowIndex <mergeRowIndex[k+1]) {
|
|
|
+ for (int i = 0; i < mergeColumnIndex.length; i++) {
|
|
|
+ if (curColIndex == mergeColumnIndex[i]) {
|
|
|
+ mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 当前单元格向上合并
|
|
|
+ *
|
|
|
+ * @param writeSheetHolder
|
|
|
+ * @param cell
|
|
|
+ * 当前单元格
|
|
|
+ * @param curRowIndex
|
|
|
+ * 当前行
|
|
|
+ * @param curColIndex
|
|
|
+ * 当前列
|
|
|
+ */
|
|
|
+ private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
|
|
|
+ Object curData =
|
|
|
+ cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
|
|
|
+ Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
|
|
|
+ Object preData =
|
|
|
+ preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
|
|
|
+ // 将当前单元格数据与上一个单元格数据比较
|
|
|
+ Boolean dataBool = preData.equals(curData);
|
|
|
+ if (true) {
|
|
|
+ Sheet sheet = writeSheetHolder.getSheet();
|
|
|
+ List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
|
|
|
+ boolean isMerged = false;
|
|
|
+ for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
|
|
|
+ CellRangeAddress cellRangeAddr = mergeRegions.get(i);
|
|
|
+ // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
|
|
|
+ if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
|
|
|
+ sheet.removeMergedRegion(i);
|
|
|
+ cellRangeAddr.setLastRow(curRowIndex);
|
|
|
+ sheet.addMergedRegion(cellRangeAddr);
|
|
|
+ isMerged = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 若上一个单元格未被合并,则新增合并单元
|
|
|
+ if (!isMerged) {
|
|
|
+ CellRangeAddress cellRangeAddress =
|
|
|
+ new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
|
|
|
+ sheet.addMergedRegion(cellRangeAddress);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|