IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java导出Excel统计报表 合并单元格 -> 正文阅读

[Java知识库]Java导出Excel统计报表 合并单元格

前言

Apache POI是一种流行的API,允许程序员使用Java程序创建,修改和显示MS Office文件。 它是由Apache Software Foundation开发和分发的开源库,用于使用Java程序设计或修改Microsoft Office文件。 它包含将用户输入数据或文件解码为MS Office文档的类和方法。

HSSF - 用于读取和写入MS-Excel文件的xls格式

示例

在这里插入图片描述

类似上面的需要合并表头的报表在日常的开发中也是经常遇到,这里总结下关于类似的报表开发整理。
对于这种的报表看起来很麻烦,但其实掌握了技巧开发起来也是很简单的。下面的代码仅供参考,有些字段为了脱敏都以数字显示了,见谅。

 // 创建sheet
        Sheet sheet = wb.createSheet("当月");
        //表头字体
        Font headerFont = wb.createFont();
        headerFont.setFontName("宋体");
        headerFont.setFontHeightInPoints((short) 18);
        headerFont.setBold(true);
        headerFont.setColor(Font.COLOR_NORMAL);
        //正文字体
        Font contextFont = wb.createFont();
        contextFont.setFontName("宋体");
        contextFont.setFontHeightInPoints((short) 12);
        headerFont.setBold(true);
        //表头样式,左右上下居中
        CellStyle headerStyle = wb.createCellStyle();
        headerStyle.setFont(headerFont);
        // 左右居中
        headerStyle.setAlignment(HorizontalAlignment.CENTER);
        // 上下居中
        headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        headerStyle.setLocked(true);
        // 自动换行
        headerStyle.setWrapText(false);
        //单元格样式,左右上下居中 边框
        CellStyle commonStyle = wb.createCellStyle();
        commonStyle.setFont(contextFont);
        // 左右居中
        commonStyle.setAlignment(HorizontalAlignment.CENTER);
        // 上下居中
        commonStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        commonStyle.setLocked(true);
        // 自动换行
        commonStyle.setWrapText(false);
        //单元格样式,左右上下居中 边框
        CellStyle commonWrapStyle = wb.createCellStyle();
        commonWrapStyle.setFont(contextFont);
        //单元格样式,竖向 边框
        CellStyle verticalStyle = wb.createCellStyle();
        verticalStyle.setFont(contextFont);
        CellStyle commonStyleNoBorder = wb.createCellStyle();
        commonStyleNoBorder.setFont(contextFont);
        commonStyleNoBorder.setLocked(true);
        // 自动换行
        commonStyleNoBorder.setWrapText(false);
        CellStyle alignLeftStyle = wb.createCellStyle();
        alignLeftStyle.setFont(contextFont);
        alignLeftStyle.setLocked(true);
        // 自动换行
        alignLeftStyle.setWrapText(false);
        //单元格样式,左对齐 无边框
        CellStyle alignLeftNoBorderStyle = wb.createCellStyle();
        alignLeftNoBorderStyle.setFont(contextFont);
        alignLeftNoBorderStyle.setLocked(true);
        // 自动换行
        alignLeftNoBorderStyle.setWrapText(false);
        //单元格样式,右对齐
        CellStyle alignRightStyle = wb.createCellStyle();
        alignRightStyle.setFont(contextFont);
        alignRightStyle.setLocked(true);
        // 自动换行
        alignRightStyle.setWrapText(false);
        // 行号
        int rowNum = 0;
        //设置列宽
        for (int i = 0; i < 11; i++) {
            sheet.setColumnWidth(i, 3000);
        }

        //第一行
        Row r0 = sheet.createRow(rowNum++);
        r0.setHeight((short) 800);
        Cell c00 = r0.createCell(0);
        c00.setCellValue("表二:");
        c00.setCellStyle(alignLeftNoBorderStyle);
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
        //第二行城市对象综合统计表
        Row r1= sheet.createRow(rowNum++);
        r1.setHeight((short) 800);
        Cell r10 = r1.createCell(0);
        r10.setCellValue("城市对象管理情况统计表");
        r10.setCellStyle(headerStyle);
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 8));
        //第三行
        Row r2 = sheet.createRow(rowNum++);
        r2.setHeight((short) 800);
        Cell r20 = r2.createCell(0);
        r20.setCellValue("填表单位:XXX街道");
        r20.setCellStyle(alignLeftNoBorderStyle);
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 4));
        //第四行
        Row r3 = sheet.createRow(rowNum++);
        r3.setHeight((short) 700);
        String[] rowSecond = {"地  区", "对象情况1", "","对象情况2","" ,"调增情况3","","情况4",""};

        for (int i = 0; i < rowSecond.length; i++) {
            Cell tempCell = r3.createCell(i);
            tempCell.setCellValue(rowSecond[i]);
            tempCell.setCellStyle(commonStyle);
        }
        //第5行
        Row r4 = sheet.createRow(rowNum++);
        String[] rowSecond5 = {"1", "2", "3","4","5","6","7","8"};
        for (int i = 0; i < rowSecond5.length; i++) {
            Cell tempCell = r4.createCell(i+1);
            tempCell.setCellValue(rowSecond5[i]);
            tempCell.setCellStyle(commonStyle);
        }
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(3, 4, 0, 0));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 1, 2));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 3, 4));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 5, 6));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 7, 8));
        //查询数据
        List<Map<String, Object>> dataList = XXX.list(XXX);
        //统计合计数据
        Map<String,Object> mapTotal = new HashMap<>();
        for (Map<String, Object> map : dataList) {
            Row tempRow = sheet.createRow(rowNum++);
            //列表数据
            Cell tempCell0 = tempRow.createCell(0);
            String sqmc = (String) map.get("XXX");
            tempCell0.setCellValue(sqmc);
            tempCell0.setCellStyle(commonStyle);
        }
        //导出
  response.setContentType("application/vnd.ms-excel");
        // 文件名
        String fileName = "报表名称.xls";
        response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");
        OutputStream stream = response.getOutputStream();
        try {
            if (null != wb && null != stream) {
                wb.write(stream);
                stream.close();
            }
        } catch (Exception e) {
            log.error("excel文档导出错误-异常信息:", e);
        }  

注意事项

【1】POI操作的行和列都是从0位置开始的
【2】所有的复杂表头无非是合并单元格,这里都可以通过下面的API实现

int addMergedRegion(CellRangeAddress region)
添加合并的单元格区域

在这里插入图片描述
创建新的单元格范围。索引是从零开始的。
参数:
firstRow—第一行的索引
lastRow—最后一行(含)的索引必须等于或大于第一行
firstCol—第一列的索引
lastCol—最后一列(包括)的索引必须等于或大于firstCol

示例

   sheet.addMergedRegion(new CellRangeAddress(3, 3, 1, 2));

合并第四行第1列和第2列
在这里插入图片描述
【3】对于空的单元格,直接在数组或者列表中给个空值就可以了。对于下面的图片中第5行的[本月人次]这种如果是数组直接在创建列的时候指定起始位置为1就可以了,注意不要影响合并的位置,而且合并的单元格不要有冲突否则会抛出异常,注意些就可以了.
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:22:51  更:2021-10-11 17:23:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:28:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码