Poi实现复杂Excel导出,理解POI操作Excel思路!!!

news2024/12/25 0:56:40

前言

对于简单excel报表导出,有很多简单的工具如easypoi,而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景,而我们实际生产中面临的都是客户自定以的一个负责报表导出,这是利用原始的poi去操作,不仅思路上清晰而且实现起来并不复杂。

比如导出下面格式报表:

这个表格算是典型的各个复杂场景都包含,有表头占两行、有表头占三列、有两级表头。。。

easypoi可以实现,但我们需要在实体类注解控制,甚至表格在复杂一些就处理不了了。

下面我们使用poi实现这种类型表格导出,包括表格内各种样式、字体等,理论上学会这套任何复杂报表都能实现,牛~~~

思路

POI操作Excel文档核心五步,文档操作都离不开这五步。

1、创建workbook,XSSFWorkbook创建的是.xlsx后缀文件,HSSFWorkbook创建的是.xls后缀文件

XSSFWorkbook workbook = new XSSFWorkbook();

2、根据workboot创建sheet

XSSFSheet sheet = workbook.createSheet("用户信息");

3、根据sheet创建行

XSSFRow row = sheet.createRow(0);

4、根据行创建单元格

XSSFCell cell = row.createCell(0);

5、往单元格填充数据

cell.setCellValue("测试");

过上面五步,我们就往excel中第一行第一个单元格插入了“测试”数据,任何复杂操作都是基于上面过程实现。

代码

public void export(HttpServletResponse response) {
    // 创建workbook,XSSFWorkbook创建的是.xlsx后缀文件,HSSFWorkbook创建的是.xls后缀文件
    XSSFWorkbook workbook = new XSSFWorkbook();
    // 创建sheet,并命名
    XSSFSheet sheet = workbook.createSheet("用户信息");

    // 创建标题行,坐标从0开始
    XSSFRow row0 = sheet.createRow(0);
    // 创建0行中第一个单元格,坐标从0开始
    XSSFCell cell00 = row0.createCell(0);
    // 填充当前单元格数据
    cell00.setCellValue("用户信息表");
    // 表头行占6列,需要合并,参数介绍:开始行、结束行、开始列、结束列。
    // 通过设置当前参数,合并单元格,比如下面表示行合并0-0行,列合并0-5列
    CellRangeAddress cellAddresses0 = new CellRangeAddress(0, 0, 0, 5);
    sheet.addMergedRegion(cellAddresses0);

    // 创建第二行表头
    XSSFRow row1 = sheet.createRow(1);
    // 填充表头数据
    XSSFCell cell10 = row1.createCell(0);
    cell10.setCellValue("编号");
    XSSFCell cell11 = row1.createCell(1);
    cell11.setCellValue("姓名");
    XSSFCell cell12 = row1.createCell(2);
    cell12.setCellValue("年龄");
    XSSFCell cell13 = row1.createCell(3);
    cell13.setCellValue("兴趣");
    // 对第二行表头进行单元格合并
    CellRangeAddress cellAddresses1 = new CellRangeAddress(1, 2, 0, 0);
    sheet.addMergedRegion(cellAddresses1);
    CellRangeAddress cellAddresses2 = new CellRangeAddress(1, 2, 1, 1);
    sheet.addMergedRegion(cellAddresses2);
    CellRangeAddress cellAddresses3 = new CellRangeAddress(1, 2, 2, 2);
    sheet.addMergedRegion(cellAddresses3);
    CellRangeAddress cellAddresses4 = new CellRangeAddress(1, 1, 3, 5);
    sheet.addMergedRegion(cellAddresses4);

    // 创建第三行表头
    XSSFRow row2 = sheet.createRow(2);
    // 填充表头数据
    XSSFCell cell23 = row2.createCell(3);
    cell23.setCellValue("兴趣1");
    XSSFCell cell24 = row2.createCell(4);
    cell24.setCellValue("兴趣2");
    XSSFCell cell25 = row2.createCell(5);
    cell25.setCellValue("兴趣3");

    // 填充数据(根据具体业务)
    for (int i = 0; i < 10; i++) {
        // 创建数据行(数据行是从第四行开始)
        XSSFRow rowTemp = sheet.createRow(i + 3);
        // 按顺序往单元格填充数据
        XSSFCell cell0 = rowTemp.createCell(0);
        cell0.setCellValue(i);
        XSSFCell cell1 = rowTemp.createCell(1);
        cell1.setCellValue("z" + i);
        XSSFCell cell2 = rowTemp.createCell(2);
        cell2.setCellValue(18 + i);
        XSSFCell cell3 = rowTemp.createCell(3);
        cell3.setCellValue("兴趣" + i);
        XSSFCell cell4 = rowTemp.createCell(4);
        cell4.setCellValue("兴趣" + i);
        XSSFCell cell5 = rowTemp.createCell(5);
        cell5.setCellValue("兴趣" + i);
    }

    response.reset();
    try {
        ServletOutputStream outputStream = response.getOutputStream();
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-Type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户信息表.xlsx", "UTF-8"));
        workbook.write(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

导出后:

当然这还没有完全结束,实际生产中我们都是需要对表格格式去处理,比如我们需要把标题居中对齐,可以在基础上通过添加下面代码实现:

通过workboot创建样式=》设置当前样式类型(居中还是左对齐之类的)=》哪个单元格需要就设置哪个单元格

比如我们想要添加标题背景颜色,可以添加下面格式:

下面是一些常见的格式,总结给出:

    /**
     * 设置单元格样式
     *
     */
    public void setCellStyle(Workbook workbook){
        //设置单元格背景颜色
        Sheet sheet=workbook.getSheetAt(0);
        Row row=sheet.getRow(0);
        Cell cell=row.getCell(0);
        CellStyle style = workbook.createCellStyle();
        style.cloneStyleFrom(cell.getCellStyle());
        //设置背景颜色
        style.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //设置自动换行
        style.setWrapText(true);
 
        //设置字体样式
        Font font= row.getSheet().getWorkbook().createFont();
        //默认字体为宋体
        font.setFontName("宋体");
        //设置字体大小
        font.setFontHeight((short) 18);
        //设置字体颜色
        font.setColor(IndexedColors.BLUE_GREY.getIndex());
        //设置字体加粗
        font.setBold(true);
        //设置字体斜体
        font.setItalic(true);
        //设置字体下划线
        font.setUnderline(Font.U_SINGLE);
        //设置字体上标下标
        font.setTypeOffset(Font.SS_SUPER);
        //设置字体删除线
        font.setStrikeout(true);
        style.setFont(font);
 
        //边框样式
        //设置上边框线条类型
        style.setBorderTop(BorderStyle.THIN);
        //设置右边框线条类型
        style.setBorderRight(BorderStyle.THIN);
        //设置下边框线条类型
        style.setBorderBottom(BorderStyle.THIN);
        //设置左边框线条类型
        style.setBorderLeft(BorderStyle.THIN);
        //设置上边框线条颜色
        style.setTopBorderColor(IndexedColors.BLUE_GREY.getIndex());
        //设置右边框线条颜色
        style.setRightBorderColor(IndexedColors.BLUE_GREY.getIndex());
        //设置下边框线条颜色
        style.setBottomBorderColor(IndexedColors.BLUE_GREY.getIndex());
        //设置左边框线条颜色
        style.setLeftBorderColor(IndexedColors.BLUE_GREY.getIndex());
 
        //对齐方式
        //设置水平对齐方式
        style.setAlignment(HorizontalAlignment.CENTER);
        //设置垂直对齐方式
        style.setVerticalAlignment(VerticalAlignment.CENTER);
 
        //设置列宽行高
        //设置自适应列宽
        sheet.setDefaultColumnWidth(0);
        //自定义列宽
        sheet.setColumnWidth(0,10);
        //自定义行高
        row.setHeight((short)10);
 
        //冻结行和列
        sheet.createFreezePane(1, 1);
 
        //合并单元格
        CellRangeAddress cellRangeAddress = new CellRangeAddress(1, 1, 1, 2);
        sheet.addMergedRegionUnsafe(cellRangeAddress);
    }

总结,通过核心五步就可以实现创建excel并往对应单元格填充数据,中间通过合并或相应格式实现复杂表格设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心&#xff0c;体验不错&#xff0c;有小伙伴也对搭建自己的对话机器人比较兴趣&#xff0c;今天通过Python来简单介绍下&#xff0c;如何调用百川大模型的API来构建自己的小产品。 在开发环境中安装Python&#xff0c;如何安装&#xff1f;参照网…

(附源码)基于Springboot框架的网络投票系统 计算机毕设42855

基于springboot网络投票系统 摘 要 随着全球Internet的迅猛发展和计算机应用的普及&#xff0c;特别是近几年无线网络的广阔覆盖以及无线终端设备的爆炸式增长&#xff0c;使得人们能够随时随地的访问网络&#xff0c;以获取最新信息、参与网络活动、和他人在线互动。为了能及时…

Python Pandas 多重索引DataFrame数据(第19讲)

Python Pandas 多重索引DataFrame数据(第19讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

VScode安装C/C++编译器步骤

一、安装C/C插件 二、安装 MinGW-w64 工具链 使用国内源 git clone https://gitee.com/cuihongxi/ubuntu2-mac.git 下载后进入到VScode文件夹下&#xff0c;点击msys2-x86_64-20231026.exe进行安装 完成后&#xff0c;确保选中“立即运行 MSYS2”框&#xff0c;然后选择“完…

董事长陈小华辞职,上市一年半的快狗打车让奇瑞亏掉3.5亿元

近年来&#xff0c;即时货运行业以高速高效的优势&#xff0c;在头部电商的带动下迎来了新一波的流量红利。然而诞生于“58系”的同城货运平台快狗打车&#xff08;HK:02246&#xff09;却起了个大早&#xff0c;赶了个晚集。 12月19日&#xff0c;快狗打车发布公告称&#xf…

本地MinIO存储服务如何创建Buckets并实现公网访问上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

A股风格因子看板 (2023.12第13期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第13期&#xff0c;指数组合数据截止日2023-11-30&#xff0c;要点如下 近1年A股风格因子检验…

Actuator内存泄露及利用Swagger未授权自动化测试实现

目录 0x00 前言 0x01 Actuator 泄露及利用 1、Actuator heapdump 内存泄露 2、知道泄露后如何进一步利用 3、如何发现 Actuator 泄露&#xff08;白盒/黑盒&#xff09; 0x02 Swagger自动化测试 1、什么是Swagger&#xff1f; 2、PostmanBurpSuiteXray 联动 3、思考 0x…

【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作

详情点击查看福利&#xff1a;【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作 目标&#xff1a; 1、熟练掌握ChatGPT提示词技巧及各种应用方法&#xff0c;并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告&#xff0c;提供…

SparkSQL的编程模型(DataFrame和DataSet)

1.2 SparkSQL的编程模型(DataFrame和DataSet) 1.2.1 编程模型简介 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 SQL SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的时候&#xff0c;SQL操作的是…

助老理发,寒冬送暖从头开始

为进一步弘扬尊老、敬老、爱老、助老的中华民族传统美德&#xff0c;解决老年人年龄大、冬季出行不便的问题&#xff0c;2023年12月20日&#xff0c;绿萝志愿服务队在翠堤社区开展了“助老理发”志愿活动。 大雪过后天气格外寒冷&#xff0c;但志愿者们依旧早早的来现场做…

Ethernet/IP 之IO 连接简要记录

IO连接 EIP的IO连接提供了在一个生产者和多个消费者之间的特定的通信路径&#xff0c;以达到IO数据在IO连接下传输。 生产者对象产生IO数据通过生产者IO连接管理者对象将连接ID和数据组帧发送给消费者IO连接管理者对象然后将IO数据发送给消费者对象。 显示消息连接 显式消息传…

Seata中AT模式的实现原理03-二阶段提交

全局事务提交 TM提交全局事务 当业务正常处理完毕后 本地事务全部提交完成&#xff0c;TM会将xid提交给TC&#xff0c;TC会返回当前事务状态&#xff0c;status由TC决定&#xff0c;TM最后会将xid从RootContext中解绑&#xff0c;全局事务结束。 TransactionalTemplate priva…

序列化类的高级用法

1.3.3 模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类&#xff0c;DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。 ModelSerializer与常规的Serializer相同&#xff0c;但提供了&#xff1a; 基于模型类自动生成一系列…

ansible的playbook

1、playbook的组成部分 &#xff08;1&#xff09;task任务&#xff1a;在目标主机上执行的操作&#xff0c;使用模块定义这些操作&#xff0c;每个任务都是一个模块的调用 &#xff08;2&#xff09;variables变量&#xff1a;存储和传递数据&#xff08;变量可以自定义&…

使用Python将OSS文件免费下载到本地:项目分析和准备工作

大家好&#xff0c;我是水滴~~ 本文将介绍如何使用Python编程语言将OSS&#xff08;对象存储服务&#xff09;中的文件免费下载到本地计算机。我们先进行项目分析和准备工作&#xff0c;为后续的编码及实施提供基础。 《Python入门核心技术》专栏总目录・点这里 系列文章 使用…

RocketMQ系统性学习-RocketMQ原理分析之Broker接收消息的处理流程

Broker接收消息的处理流程&#xff1f; 既然要分析 Broker 接收消息&#xff0c;那么如何找到 Broker 接收消息并进行处理的程序入口呢&#xff1f; 那么消息既然是从生产者开始发送&#xff0c;消息是有单条消息和批量消息之分的&#xff0c;那么消息肯定是有一个标识&#…

java中常用的加密算法总结

目前在工作中常用到加密的一些场景&#xff0c;比如密码加密&#xff0c;数据加密&#xff0c;接口参数加密等&#xff0c;故通过本文总结以下常见的加密算法。 1. 对称加密算法 对称加密算法使用相同的密钥进行加密和解密。在Java中&#xff0c;常见的对称加密算法包括&…

活动回顾丨迁飞之路主题艺术墙绘落地大坪大融城

重庆作为鹰飞之城&#xff0c;不仅是数十万猛禽迁飞的必经之路&#xff0c;也是其他珍稀鸟类的家园。守护飞羽精灵&#xff0c;领略迁飞之美&#xff0c;2023年12月19日&#xff0c;传益千里携手重庆工商大学艺术学院党员服务站的志愿者们一起走进大坪大融城开展迁飞之路生态艺…