POI-HSSFWorkbook合并单元格

1.背景

在实际开发中导出Excel报表数据是很常见的功能

这篇文章重点讲解一下如何合并单元格

2.实现代码

导出样式

这里只是给出合并单元格的思路,具体样式和字体需要自己设置

 

行数据模型

public class ExcelObject {
    // 序号
    private Integer num;
    // 部门
    private String departmentName;
    // 小组
    private String groupName;
    // 小组2
    private String subGroupName;
    // 事务 3行
    private List<String> task;
    // 具体事项 5行
    private List<String> taskDeatil;
}

导出代码demo

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Copyright (C) XXXXXXXXXXX科技股份技有限公司
 * @Author: lidongping
 * @Date: 2021-08-20 10:23
 * @Description: <p>
 * 合并单元格的方法:
 * 指定 4 个参数,起始行,结束行,起始列,结束列。然后这个区域将被合并。
 * CellRangeAddress region01 = new CellRangeAddress(i * 5 + 2, i * 5 + 6, 0, 0);
 * sheet.addMergedRegion(region01);
 * </p>
 */
public class TestExcel01 {
    public static void main(String[] args) throws IOException {
        // 定义excel表格
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFCellStyle style = workbook.createCellStyle();
        HSSFSheet sheet = workbook.createSheet("周明细");
        CellRangeAddress regionx = new CellRangeAddress(0, 0, 0, 5);
        sheet.addMergedRegion(regionx);
        // 表头数据
        List<String> title = new ArrayList<String>();
        title.add("序号");
        title.add("部门");
        title.add("小组");
        title.add("小组II");
        title.add("事务"); // 3行
        title.add("具体事项"); // 5行
        // 第一行 标题
        HSSFRow row0 = sheet.createRow(0);
        HSSFCell cell_00 = row0.createCell(0);
        cell_00.setCellValue("周计划");
        cell_00.setCellStyle(style);

        // 第二行 表头设置
        HSSFRow row1 = sheet.createRow(1);
        for (int i = 0; i < title.size(); i++) {
            String s = title.get(i);
            HSSFCell cell = row1.createCell(i);
            cell.setCellValue(s);
        }
        // 表行数据 第三行开头
        List<ExcelObject> dataList = createData();
        int rowNum = 2;
        for (int i = 0; i < dataList.size(); i++) {
            // 创建行
            ExcelObject excelObject = dataList.get(i);
            Integer rowNumTaskDeatil = excelObject.getTaskDeatil().size();
            for (int j = 0; j < rowNumTaskDeatil; j++) {
                HSSFRow row = sheet.createRow(rowNum);
                // 填充列数据
                HSSFCell cell0 = row.createCell(0);
                HSSFCell cell1 = row.createCell(1);
                HSSFCell cell2 = row.createCell(2);
                HSSFCell cell3 = row.createCell(3);
                HSSFCell cellTAsk4 = row.createCell(4);
                HSSFCell cellTAskDetail5 = row.createCell(5);
                if (j == 0) {
                    cell0.setCellValue(excelObject.getNum());
                    cell1.setCellValue(excelObject.getDepartmentName());
                    cell2.setCellValue(excelObject.getGroupName());
                    cell3.setCellValue(excelObject.getSubGroupName());
                }
                //事务设置  创建多行用于合并使用
                if (j < excelObject.getTask().size()) {
                    cellTAsk4.setCellValue(excelObject.getTask().get(j));
                }
                // 设置事项明细
                cellTAskDetail5.setCellValue(excelObject.getTaskDeatil().get(j));
                rowNum = rowNum + 1;
            }
            // 合并 序号
            CellRangeAddress region01 = new CellRangeAddress(i * 5 + 2, i * 5 + 6, 0, 0);
            sheet.addMergedRegion(region01);
            // 合并 部门
            CellRangeAddress region02 = new CellRangeAddress(i * 5 + 2, i * 5 + 6, 1, 1);
            sheet.addMergedRegion(region02);
            // 合并 小组
            CellRangeAddress region03 = new CellRangeAddress(i * 5 + 2, i * 5 + 6, 2, 2);
            sheet.addMergedRegion(region03);
            // 合并 小组2
            CellRangeAddress region04 = new CellRangeAddress(i * 5 + 2, i * 5 + 6, 3, 3);
            sheet.addMergedRegion(region04);

            // 合并事务
            CellRangeAddress region05 = new CellRangeAddress(i * 5 + 4, i * 5 + 6, 4, 4);
            sheet.addMergedRegion(region05);
        }
        // 文件输出
        String fileName = "F:\\excelTest\\周计划测试-" + System.currentTimeMillis() + ".xls";
        File file = new File(fileName);
        FileOutputStream fout = new FileOutputStream(file);
        workbook.write(fout);
        fout.close();
        System.out.println("导出完成fileName=" + fileName);
    }

    /**
     * 模拟数据 10行
     *
     * @return
     */
    private static List<ExcelObject> createData() {
        List<ExcelObject> dataList = new ArrayList<ExcelObject>();
        for (int i = 0; i < 10; i++) {
            int num = i + 1;
            ExcelObject rowList = new ExcelObject();
            rowList.setNum(num);
            rowList.setDepartmentName("部门-" + num);
            rowList.setGroupName("小组-" + num);
            rowList.setSubGroupName("小组II-" + num);
            rowList.setTask(createData03(num));
            rowList.setTaskDeatil(createData05(num));
            dataList.add(rowList);
        }
        return dataList;
    }

    /**
     * 创建三个子项,用于事务
     */
    private static List<String> createData03(Integer num) {
        List<String> list = new ArrayList<String>(3);
        for (int i = 1; i <= 3; i++) {
            list.add(num + "-事务子项-" + i);
        }
        return list;
    }

    /**
     * 创建5个子项,用于具体事项
     */
    private static List<String> createData05(Integer num) {
        List<String> list = new ArrayList<String>(3);
        for (int i = 1; i <= 5; i++) {
            list.add(num + "-具体事子项-" + i);
        }
        return list;
    }
}

3.完美

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用HSSFWorkbook进行合并单元格后,出现了没有边框的问题。可以通过以下步骤解决这个问题: 1. 首先,创建一个需要合并单元格的样式。使用`wb.createCellStyle()`创建一个样式对象,然后设置垂直居中和水平居中对齐,使用`boderStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER)`和`boderStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER)`。接着设置边框样式,可以使用`boderStyle.setBorderTop(HSSFBorderFormatting.BORDER_THICK)`来设置顶部边框为粗线。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [POI-HSSFWorkbook合并单元格边框及文字居中问题](https://blog.csdn.net/qq_28108079/article/details/80804944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [HSSF合并单元格设置边框只有部分边框生效问题](https://blog.csdn.net/weixin_44864748/article/details/122543730)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值