excel文件合并单元格

/**
     * 导出合并单元格的excel文件
     * @param dataList              数据列表
     * @param tableName             文件名称
     * @param sheetName             sheet名称
     * @param mergeColumnsIndex     需要合并单元格的列号
     * @param mergeRowIndex         开始合并单元格的行号
     */
    public static <T> void downloadMergeCellExcel(HttpServletResponse response, List<LandAllTableRow> dataList, Class rowClass,
                                                  String tableName, String sheetName, Collection<String> includeColumnFiledNames,
                                                  List<Integer> mergeColumnsIndex, int mergeRowIndex) throws IOException {
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode(tableName, "UTF-8");

        Map<Integer, List<LandAllTableRow>> collectByLandId = dataList.stream().collect(Collectors.groupingBy(LandAllTableRow::getId));
        //每个landId对应几条企业信息
        Map<Integer, Integer> landRows = new HashMap<>();
        Map<String, Integer> companyRows = new HashMap<>();

        for (Integer landId : collectByLandId.keySet()) {
            List<LandAllTableRow> companys = collectByLandId.get(landId);
            Map<String, List<LandAllTableRow>> collectByOrgCode = companys.stream().collect(Collectors.groupingBy(LandAllTableRow::getOrganizationCode));
            int companySize = 0;
            for (String orgCode : collectByOrgCode.keySet()) {
                companyRows.put(orgCode, collectByOrgCode.get(orgCode).size());
                companySize += collectByOrgCode.get(orgCode).size();
            }
            landRows.put(landId, companySize);
        }
        try {
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            EasyExcel.write(response.getOutputStream(), rowClass)
                    .registerWriteHandler(new ExcelFillCellMergeStrategy(mergeColumnsIndex, mergeRowIndex, landRows, companyRows))
                    .sheet(sheetName)
                    .includeColumnFiledNames(includeColumnFiledNames)
                    .doWrite(dataList);

        }  catch (IOException e) {
            e.printStackTrace();
        }
    }
package com.popsmart.data.common;

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.*;

public class ExcelFillCellMergeStrategy implements CellWriteHandler {

    private List<Integer> mergeColumnIndex;
    private int mergeRowIndex;

    private Map<Integer, Integer> landRows;
    private Map<String, Integer> companyRows;

    public ExcelFillCellMergeStrategy(List<Integer> mergeColumnIndex, int mergeRowIndex, Map<Integer, Integer> landRows, Map<String, Integer> companyRows) {
        this.mergeColumnIndex = mergeColumnIndex;
        this.mergeRowIndex = mergeRowIndex;
        this.landRows = landRows;
        this.companyRows = companyRows;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {

        //当前行
        int curRowIndex = cell.getRowIndex();
        //当前列
        int curColIndex = cell.getColumnIndex();
        Row row = cell.getSheet().getRow(curRowIndex);

        int landIdIndex = 0;
        int organizationCodeIndex = 6;

        if (curRowIndex > mergeRowIndex) {

            //当前列不需要合并
            if (!mergeColumnIndex.contains(curColIndex)) {
                return;
            }

            Integer landIdValue = (int) row.getCell(landIdIndex).getNumericCellValue();
            int landSize = landRows.get(landIdValue);
            //当前行不需要合并
            if (landSize < 2) {
                return;
            }

            Integer lastLandIdValue = null;
            String lastOrgCode = null;
            if (curRowIndex > 1) {
                Row preRow = cell.getSheet().getRow(curRowIndex - 1);
                lastLandIdValue = (int) preRow.getCell(landIdIndex).getNumericCellValue();
                if (curColIndex >= organizationCodeIndex) {
                    lastOrgCode = preRow.getCell(organizationCodeIndex).getStringCellValue();
                }
            }

            if (curColIndex < organizationCodeIndex) {
                if (landIdValue.equals(lastLandIdValue)) {
                    return;
                }
                mergeCell(writeSheetHolder, curRowIndex, curRowIndex + landSize - 1, curColIndex);
            } else {
                String organizationCodeValue = row.getCell(organizationCodeIndex).getStringCellValue();
                if (organizationCodeValue.equals(lastOrgCode)) {
                    return;
                }

                int companySize = companyRows.get(organizationCodeValue);
                if (companySize > 2) {
                    mergeCell(writeSheetHolder, curRowIndex, curRowIndex + companySize - 1, curColIndex);
                }
            }
        }
    }


    /**
     * @param curRowIndex 当前行
     * @param lastRow     合并到第几行
     * @param curColIndex 当前列
     */
    private void mergeCell(WriteSheetHolder writeSheetHolder,
                           int curRowIndex,
                           int lastRow,
                           int curColIndex) {

        Sheet sheet = writeSheetHolder.getSheet();
        CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, lastRow, curColIndex, curColIndex);
        sheet.addMergedRegion(cellRangeAddress);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值