java-easyExcel导出-合并单元格

实现层:

public ResultDto statisticalBudgetDetailExport(HttpServletResponse response, ReimbursementFormDTO formDTO) {
        List<Map<String, Object>> mapValueList = (List<Map<String, Object>>) formDTO.getParamsMap();

        //获取所需数据
        List<Map<String, Object>> list = new ArrayList<>();
        for (Map<String, Object> mapValue : mapValueList) {
            Map<String, Object> map = new HashMap<>();

            map.put("thirdDept", "");
            
            list.add(map);
        }

        //写入数据
        String fileName = "导出";

        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");

            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .withTemplate(this.getClass().getClassLoader().getResourceAsStream("templates/statisticalBudgetDetailExport.xlsx"))
                    .registerWriteHandler(new ExcelFillCellMergeStrategy(1,new int[]{0,1}, list.size()))
                    .build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();

            // 直接写入数据
            excelWriter.fill(list, fillConfig, writeSheet);

            excelWriter.finish();
        } catch (Exception e) {
            return null;
        }
        return null;
    }

合并策略:

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 lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;

/**
 * 合并单元格
 */
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
    /**
     * 合并字段的下标
     */
    private int[] mergeColumnIndex;
    /**
     * 合并几行
     */
    private int mergeRowIndex;

    private int lastRow;

    int num = 0;

    public ExcelFillCellMergeStrategy() {
    }

    public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex, int lastRow) {
        this.mergeRowIndex = mergeRowIndex;
        this.mergeColumnIndex = mergeColumnIndex;
        this.lastRow = lastRow;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

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

    }


    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();

        if (curRowIndex > mergeRowIndex) {
            for (int i = 0; i < mergeColumnIndex.length; i++) {
                if (curColIndex == mergeColumnIndex[i]) {
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                    break;
                }
            }
        }

        //合并最后一行指定列
        if (curRowIndex == lastRow) {
            if (num == 0) {
                // 合并最后一行 1,2 列
                mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, 1);
            }
            num ++;
        }
    }

    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();

        // 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
        if (curData.equals(preData)) {
            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);
            }
        }
    }
    private void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
        Sheet sheet = writeSheetHolder.getSheet();
        CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + 1);
        sheet.addMergedRegion(cellRangeAddress);
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你可以使用 EasyExcel 库来导出合并单元格Excel 文件。下面是一个使用 EasyExcel 导出合并单元格的示例代码: ```java // 导入所需的包 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.merge.LoopMergeStrategy; import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy; public class ExcelExportDemo { public static void main(String[] args) { // 设置导出文件路径 String filePath = "path/to/exported/file.xlsx"; // 创建数据列表 List<List<Object>> data = new ArrayList<>(); // 添加数据 List<Object> rowData = new ArrayList<>(); rowData.add("A1"); rowData.add("B1"); rowData.add("C1"); data.add(rowData); // 创建合并策略,设置需要合并的单元格范围 LoopMergeStrategy mergeStrategy = new LoopMergeStrategy(0, 0); // 导出 Excel 文件 EasyExcel.write(filePath) .registerWriteHandler(mergeStrategy) .sheet("Sheet1") .doWrite(data); System.out.println("Excel exported successfully!"); } } ``` 上述代码中,我们首先导入了 EasyExcel 相关的包。然后,我们定义了一个 `ExcelExportDemo` 类,并在 `main` 方法中编写导出 Excel 文件的代码。 在这个示例中,我们创建了一个包含一行三列数据的列表,然后使用 `LoopMergeStrategy` 设置了需要合并的单元格范围为第一行的所有列。最后,我们调用 `EasyExcel.write` 方法来实际导出 Excel 文件,传入文件路径、合并策略和数据列表。 你可以根据需要进行修改和扩展,以满足具体的导出需求。希望以上信息对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值