java用POI合并相同的列

大致思路是将相同的列合并,但是我这个有一种特殊的需求要序号相同内容才能够合并, 话不多说 直接上代码。

1.利用poi自带的方法合并数据

 sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column, column));

部分源码展示:

    private int addMergedRegion(CellRangeAddress region, boolean validate) {
        if (region.getNumberOfCells() < 2) {
            throw new IllegalArgumentException("Merged region " + region.formatAsString() + " must contain 2 or more cells");
        } else {
            region.validate(SpreadsheetVersion.EXCEL2007);
            if (validate) {
                this.validateArrayFormulas(region);
                this.validateMergedRegions(region);
            }

            CTMergeCells ctMergeCells = this.worksheet.isSetMergeCells() ? this.worksheet.getMergeCells() : this.worksheet.addNewMergeCells();
            CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
            ctMergeCell.setRef(region.formatAsString());
            int numMergeRegions = ctMergeCells.sizeOfMergeCellArray();
            ctMergeCells.setCount((long)numMergeRegions);
            return numMergeRegions - 1;
        }
    }

2.编写相关代码


    /**
     * 动态创建表格
     * @param response 响应
     * @param dataAggregations 数据源
     * @param mergeColumns 需要合并的列
     * @param mergeRowMap
     * @param sheetName
     * @param fileName
     * @param masterHead
     */
    public static void exportMergeRecord(HttpServletResponse response,
                                  List<String[]> dataAggregations,
                                  List<Integer> mergeColumns,
                                  Map<String,Integer> mergeRowMap,
                                  String sheetName,
                                  String fileName,
                                  String[] masterHead) {
        //初始化表格
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet(sheetName);
        //设置样式
        XSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);//水平对齐

        XSSFRow sheetRow = sheet.createRow(0);
        for (int i = 0; i < masterHead.length ; i++) {
            XSSFCell xssfCell = sheetRow.createCell(i);
            xssfCell.setCellValue(masterHead[i]);
        }
        //需要合并的列
        boolean isMerge = false;
        if(mergeColumns != null && mergeColumns.size() != 0) {
            isMerge = true;
        }

        //需要合并的列
        int startIndex = sheet.getLastRowNum();
        String currentStr = "";
        if (CollectionUtils.isNotEmpty(dataAggregations)){
            for (int j = 0; j < dataAggregations.size(); j++) {
                String[] strings = dataAggregations.get(j);
                // 每行往下写最后一行加1
                XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
                int i = 0;
                //写入数据
                for (String str : strings) {
                    dataRow.createCell(i).setCellValue(ExcelUtils.process(str));
                    i++;
                }
                int mergeNum = 0;
                if (mergeRowMap!=null && mergeRowMap.containsKey(currentStr)){
                    mergeNum = mergeRowMap.get(currentStr);
                }
                int firstRow = j+startIndex+1-mergeNum;
                int lastRow = j+startIndex;
                //合并数据
                if (isMerge && !currentStr.equals(strings[0]) && mergeNum>1){
                    //开始行 结束行 开始列 结束列 int firstRow, int lastRow, int firstCol, int lastCol
                    for (Integer column : mergeColumns) {
                        sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column, column));
                    }
                }
                //更改序号值
                currentStr = strings[0];
                //如果是最后一一行 同样需要判断是否合并
                if (j==dataAggregations.size()-1){
                    if (mergeRowMap!=null && mergeRowMap.containsKey(currentStr)){
                        mergeNum = mergeRowMap.get(currentStr);
                        int lastRowNum = sheet.getLastRowNum();
                        firstRow =lastRowNum+1-mergeNum;
                        lastRow = lastRowNum;
                        if (mergeNum>1){
                            //开始行 结束行 开始列 结束列 int firstRow, int lastRow, int firstCol, int lastCol
                            for (Integer column : mergeColumns) {
                                sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column, column));
                            }
                        }
                    }
                }
            }
        }
        //设置列宽 网上代码一大堆 自行百度
        for (int i = 0; i < Arrays.asList(masterHead).size(); i++) {
            sheet.setColumnWidth(i, 4550);
        }
        try {
            ExcelUtils.excelExport(workbook,fileName,response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

这是相关代码,结合实际自行修改!!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下代码将相同进行单元格合并: ``` import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import java.util.HashMap; import java.util.Map; public class MergeCells { public static void main(String[] args) { Workbook workbook = WorkbookFactory.create(true); // 创建一个空的工作簿 Sheet sheet = workbook.createSheet(); // 创建一个新的工作表 // 模拟数据 String[][] data = { {"Name", "Age", "Gender"}, {"Tom", "18", "Male"}, {"Jerry", "18", "Female"}, {"Jack", "19", "Male"}, {"Lucy", "19", "Female"}, {"Mike", "20", "Male"}, {"Mary", "20", "Female"} }; // 将数据写入工作表 for (int i = 0; i < data.length; i++) { Row row = sheet.createRow(i); for (int j = 0; j < data[i].length; j++) { Cell cell = row.createCell(j); cell.setCellValue(data[i][j]); } } Map<String, Integer> map = new HashMap<>(); // 用于存储每的起始行号 // 遍历每行,将相同进行单元格合并 for (int i = 1; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { String key = j + "-" + data[i][j]; // 生成号和单元格内容的组合键 if (map.containsKey(key)) { int startRow = map.get(key); CellRangeAddress region = new CellRangeAddress(startRow, i, j, j); sheet.addMergedRegion(region); // 合并单元格 } else { map.put(key, i); // 记录当前的起始行号 } } } // 输出工作表 for (int i = 0; i < data.length; i++) { Row row = sheet.getRow(i); for (int j = 0; j < data[i].length; j++) { Cell cell = row.getCell(j); System.out.print(cell.getStringCellValue() + "\t"); } System.out.println(); } } } ``` 运行结果如下: ``` Name Age Gender Tom Male Jerry Female Jack Male Lucy Female Mike Male Mary Female ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值