Java Excel导出复杂excel表格样式之ExcelUtil工具类

2023-11-04

Java Excel导出包括普通导出及复杂表格样式,主要是对于需要进行行列合并的列进行特殊处理,计算清楚起始行,结束行,起始列,结束列。
普通导出可以是所有列,也可以是包含某些列,或者排除某些列;
在这里插入图片描述

1. 效果图

在这里插入图片描述

2. 原理

在这里插入图片描述
如对于上图中的覆盖能力,需要A2,A3,A4行列进行合并,则传参

// 表示要执行合并的行是第一行,从第1行到第3行,从第0列到第0列;注意这里excel的行列编号下表index都是从0开始的。
mergeRowColCell(sheet, 1, 1, 3, 0, 0, ‘覆盖能力’,valStyle);

3. 源码

3.1 pom

<!--easyexcel 依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.6</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.17</version>
</dependency>

3.2 ExcelUtil工具类

package com.example.restservice.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/*************************************
 *Class Name: ExcelUtil
 *Description: <Excel导出类>
 *@author: Seminar
 *@create: 2022/4/6
 *@since 1.0.0
 *************************************/
public class ExcelUtil {

    public static final String UNDERLINE = "_";

    public static ServletOutputStream setResponseParam(HttpServletResponse response, String fileName) throws IOException {
        String value = "attachment; filename=" + new String(
                (fileName + UNDERLINE + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ExcelTypeEnum.XLS.getValue()).getBytes("gb2312"), "ISO8859-1");
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/vnd.openxmlformats.officedocument.spreadsheetml.sheet");
        response.setHeader("Content-disposition", value);
        return response.getOutputStream();
    }


    public static void exportExcel(HttpServletResponse response, String fileName, Class clazz, List data) throws IOException {
        OutputStream os = setResponseParam(response, fileName);
        EasyExcel.write(os, clazz).sheet(fileName).doWrite(data);
    }

    public static void exportExcelIncludeColumns(HttpServletResponse response, String fileName, Class clazz, List data, List<String> columns) throws IOException {
        OutputStream os = setResponseParam(response, fileName);
        EasyExcel.write(os, clazz).includeColumnFiledNames(columns).sheet(fileName).doWrite(data);
    }

    public static void exportExcelExcludeColumns(HttpServletResponse response, String fileName, Class clazz, List data, List<String> columns) throws IOException {
        OutputStream os = setResponseParam(response, fileName);
        EasyExcel.write(os, clazz).excludeColumnFiledNames(columns).sheet(fileName).doWrite(data);
    }

    /**
     * 定制导出Excel
     *
     * @param response
     * @param fileName sheet名称
     * @param title    标题
     * @param data     表格数据
     * @return
     */
    public static void exportExcelPj(HttpServletResponse response, String fileName, String[] title, String[][] data) throws IOException {
        OutputStream os = setResponseParam(response, fileName);

        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        HSSFWorkbook wb = new HSSFWorkbook();

        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(fileName);
        // 设置列宽
        sheet.setColumnWidth(0, 5000);
        sheet.setColumnWidth(2, 5000);

        // 第三步,在sheet中添加表头第0行
        HSSFRow row1 = sheet.createRow(0);

        // 第四步,创建单元格,并设置表头居中及值的样式
        HSSFCellStyle style = wb.createCellStyle();
        style.setFillBackgroundColor(IndexedColors.GREEN.getIndex());
        style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        style.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中

        HSSFCellStyle leftStyle = wb.createCellStyle();
        leftStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());
        leftStyle.setAlignment(HorizontalAlignment.LEFT); // 创建一个居中格式

        HSSFCell cell = null;
        // 创建标题
        for (int i = 0; i < title.length; i++) {
            cell = row1.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }

        //合并单元格的内容
        List<String> mergeCells = Arrays.asList(new String[]{"覆盖能力(20分)", "获取成本(10分)", "数据质量(60分)",
                "产线支持(10分)", "附带价值(10分)", "总分"});
        for (int i = 0; i < data.length; i++) {
            //创建内容
            row1 = sheet.createRow(i + 1);
            for (int j = 0; j < data[i].length; j++) {
                //将内容按顺序赋给对应的列对象
                cell = row1.createCell(j);
                cell.setCellValue(data[i][j]);
                // 设置评价指标列居左,其他的列剧中
                if (j == 2) {
                    cell.setCellStyle(leftStyle);
                } else {
                    cell.setCellStyle(style);
                }
            }
        }

        mergeRowColCell(sheet, 1, 1, 3, 0, 0, mergeCells.get(0), style);
        mergeRowColCell(sheet, 4, 4, 6, 0, 0, mergeCells.get(1), style);
        mergeRowColCell(sheet, 7, 7, 13, 0, 0, mergeCells.get(2), style);
        mergeRowColCell(sheet, 14, 14, 14, 0, 0, mergeCells.get(3), style);
        mergeRowColCell(sheet, 15, 15, 15, 0, 0, mergeCells.get(4), style);
        mergeRowColCell(sheet, 16, 16, 16, 1, 3, "", style);
        mergeRowColCell(sheet, 16, 16, 16, 0, 0, mergeCells.get(5), style);

        wb.write(os);
        os.flush();
        os.close();
    }

    /**
     * 表格合并方法
     *
     * @param sheet    表格sheet
     * @param rowIndex 要执行合并的行
     * @param firstRow 首行
     * @param lastRow  尾行
     * @param firstCol 首列
     * @param lastCol  尾列
     * @param cellVal  合并后的单元格值
     * @param valStyle 合并后的单元格样式
     */
    private static void mergeRowColCell(HSSFSheet sheet, int rowIndex, int firstRow, int lastRow, int firstCol, int lastCol, String cellVal, HSSFCellStyle valStyle) {
        if (!(firstRow == lastRow && firstCol == lastCol)) {
            // 合并单元格
            CellRangeAddress callRangeAddress = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);//起始行,结束行,起始列,结束列
            sheet.addMergedRegion(callRangeAddress);
        }
        HSSFRow row = sheet.getRow(rowIndex);
        HSSFCell cell = row.createCell(0);
        cell.setCellValue(cellVal);
        cell.setCellStyle(valStyle);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Excel导出复杂excel表格样式之ExcelUtil工具类 的相关文章

  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 使用 SERVER_NAME 时出现 Flask 404

    在我的 Flask 配置中 我将 SERVER NAME 设置为 app example com 之类的域 我这样做是因为我需要使用url for with external网址 如果未设置 SERVER NAME Flask 会认为服务器

随机推荐

  • 每日一题cf!

    Problem C Codeforces 题目大意 给你一个 序列 和一个操作 选择一个x 并且让所有等于x的数为0 问让这个序列变成非递减序列的最小操作次数是多少 思路 预处理 定义一个map q用来存每个数出现的最长到达的长度 p用来存
  • 英文字母的排序

    题目内容 编写一个程序 当输入英文字符串时 计算机将这个句子中的英文字母按字典字母顺序重新排列 排列后的单词的 长度要与原始句子中的长度相同 并且要求只对 到 的字母重新排列 其它字符保持原来的状态 输入描述 一个字符串 包括大写英文字母
  • 项目-CSDN博客导出工具.md

    CSDN博客批量导出工具 解决CSDN反爬虫问题 10 14 由于CSDN缘故 暂时不能使用 有空修复 9 27 更新介绍 2019 9 26 新的UI交互界面 解决由于文件名导致的无法写文件的问题 操作更加简便 可以选择下载 添加鼠标右击
  • arx 正向遍历 逆向遍历 database

    void AllDb AcDbBlockTable pBlkTbl acdbHostApplicationServices gt workingDatabase gt getBlockTable pBlkTbl AcDb kForRead
  • 在pandas模块中,读取CSV文件主要使用pd.read_csv()函数。

    在pandas模块中 读取CSV文件主要使用pd read csv 函数 必选参数 要读取的CSV文件的文件路径 常用的可选参数 1 指定行索引 index col 2 获取指定列 usecols 3 添加columns header No
  • C语言:链栈的基本操作

    关注作者 Aqu 蓝空 描述 利用链表对栈的将实现基本操作 入栈 出栈 打印 代码 include
  • Human Resource Machine 全成就通关 第41关

    HUMAN RESOURCE MACHINE PROGRAM COMMENT 0 a INBOX JUMPZ d COPYTO 24 b BUMPUP 24 JUMP a c COPYFROM 22 OUTBOX COPYFROM 24 C
  • 面试问到一个,让你写一下朋友圈点赞功能的测试用例!记录一下

    给你一个朋友圈点赞的功能 写出测试用例 UI 点击操作栏 是否正常弹出气泡 是否正常收回 是否流畅 样式是否与需求保持一致 未赞时 点击 点赞 样式变为已赞 已赞时 点击 取消 样式变为未赞 功能 给某一朋友的朋友圈进行点赞 检查接口 gt
  • QT串口 QSerialPort的使用与粘包处理

    1 在工程的pro文件中加入串口模块 QT serialport 2 添加头文件 include
  • CS231n——机器学习算法——线性分类(下:Softmax及其损失函数)

    在前两篇笔记中 基于线性分类上 线性分类中继续记笔记 1 Softmax分类器 SVM和Softmax分类器是最常用的两个分类器 Softmax的损失函数与SVM的损失函数不同 对于学习过二元逻辑回归分类器的读者来说 Softmax分类器就
  • Python就该这样学,我是如何2个月快速掌握Python的!学习大纲+学习方式+学习资料 汇总!

    一 学习建议 1 找到自己感兴趣的方向 并且结合市场需求进行选择 Python的应用范围 测试运维web人工智能大数据爬虫及数据分析办公自动化 2 学习过程中一定要勤加练习 并且尝试去使用学习过的内容实现一些简答的功能 遇到技术问题不要慌
  • vscode保存以后或者切换文件以后卡顿,代码提示卡顿

    主要原因 可能是因为你们装了这个扩展 导致vscode会对所有文件进行格式化 一般是开启了vscode保存快捷键格式化以后才会出现这个问题 解决方案 把这个快捷键改一下就好 一般问题是显示什么 正在启动格式化程序 然后每切换一个页面都要改一
  • 网络分析工具Wireshark Network Analyzer

    监听端口10001过滤设置 port 10001
  • go: 配置 vim 高亮插件

    在早期的 golang 源代码包里面是有 vim 插件的 但是呢 到了1 4的源码包的时候 就删除了 vim 插件 所以我们需要从 1 3 3 版本的代码中获得 vim配置 一 官网下载 可以从 golang 官网 Downloads Th
  • date到期(逾期)提醒的逻辑分析,例如快到一年提前一个月提醒

    需求 如快到一年时 提前一个月进行提醒 伪代码 create date x expire date 过期的肯定不用管 expire date m tip date tip date 就是提示开始的时间 所以这个sql大概应该这么写 crea
  • 解决由于已经达到 MaxReports 限制,没有写入 apport 报告的错误

    解决由于已经达到 MaxReports 限制 没有写入 apport 报告的错误 现将info文件夹更名 sudo mv var lib dpkg info var lib dpkg info old 再新建一个新的info文件夹 sudo
  • 初识Qt,几种写界面的方法

    1 我们可以直接在新建项目中选择Application中的Qt Widgets Application 此时Qt会为我们直接生成 ui文件 以及对应得 h头文件 cpp源文件 那么我们需要做的就只是在ui的设计下添加一些我们想让界面拥有的东
  • 重置或修改系统(Linux/windows/宝塔)密码

    一 linux忘记密码 3步重置root密码 虚拟机多了之后 root密码就不好记住了 忘了密还有这种方法修改哦 1 在启动项界面按 e 进入修改页面 2 找到linux16这一行 在末尾添加 rd break 3 再按Ctrl X进入单用
  • 浏览器中输入url请求之后发生的事情?

    一 浏览器查找域名的IP地址 1 请求一旦发起 比如 www baidu com 浏览器第一件事就是 解析这个域名 浏览器先查看本地硬盘的hosts文件 看看其中有没有和这个域名对应的规则 如果有的话 就直接使用hosts文件里面的ip地址
  • Java Excel导出复杂excel表格样式之ExcelUtil工具类

    Java Excel导出包括普通导出及复杂表格样式 主要是对于需要进行行列合并的列进行特殊处理 计算清楚起始行 结束行 起始列 结束列 普通导出可以是所有列 也可以是包含某些列 或者排除某些列 1 效果图 2 原理 如对于上图中的覆盖能力