Java easypoi 导出excel 并合并相关列

news2024/11/24 17:25:40

在项目开发中经常会使用到合并列,格式如下:

 1.引入easypoi

        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
        </dependency>

2.定义一个实体类PersonDto

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;

import java.io.Serializable;

@Data
public class PersonDto implements Serializable {
    private static final long serialVersionUID = 1L;

    @Excel(name = "省份", mergeVertical = true, width = 50)
    private String province;

    @Excel(name = "城市", mergeVertical = true, width = 50)
    private String city;

    @Excel(name = "民族", mergeVertical = true, width = 50)
    private String national;


    @Excel(name = "姓名", width = 20)
    private String userName;


    @Excel(name = "年龄", needMerge = true)
    private int age;


    @Excel(name = "地址", width = 50)
    private String address;
}

3.定义控制器ExportController

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.util.PoiMergeCellUtil;
import com.boot.basic.annotation.security.PreAuth;
import com.boot.web.vo.PersonDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;

@RestController
@RequestMapping("/excel")
public class ExcelController {
    @Autowired
    protected HttpServletResponse response;

    /**
     * 数据导出excel
     */
    @ApiOperation(value = "Get方式导出Excel")
    @RequestMapping(value = "/export", method = RequestMethod.GET, produces = "application/octet-stream")
    protected void exportExcel() {
        try {
            List<PersonDto> list = new ArrayList<>();

            for (int i = 0; i < 10; i++) {
                PersonDto entity = new PersonDto();
                entity.setProvince("广东");
                entity.setCity("广州");
                entity.setNational("汉族");
                entity.setUserName("张三_" + i);
                if (i > 4) {
                    entity.setUserName("李四");
                }
                entity.setAge(16 + i);
                entity.setAddress("广东省广州市_" + i);
                list.add(entity);
            }

            for (int i = 0; i < 10; i++) {
                PersonDto entity = new PersonDto();
                entity.setProvince("广西");
                entity.setCity("南宁");
                entity.setNational("壮族");
                entity.setUserName("王五_" + i);
                entity.setAddress("广西南宁_" + i);
                if (i > 2) {
                    entity.setNational("汉族");
                }
                if (i > 4) {
                    entity.setCity("桂林");
                    entity.setUserName("王五");
                    entity.setAddress("广西桂林_" + i);
                }
                entity.setAge(21 + i);
                list.add(entity);
            }

            // 导出excel
            ExportParams params = new ExportParams("人员信息表", "人员信息表", ExcelType.XSSF);
            Workbook workbook = ExcelExportUtil.exportExcel(params, PersonDto.class, list);
            // 重置响应对象
            response.reset();
            // 指定下载的文件名--设置响应头
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("人员信息表" + System.currentTimeMillis(), "UTF-8") + ".xlsx");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
            log.error("数据导出失败:" + e.getMessage());
        }
    }
}

 

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

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

相关文章

设计模式详解之策略模式

作者&#xff1a;刘文慧 策略模式是一种应用广泛的行为型模式&#xff0c;核心思想是对算法进行封装&#xff0c;委派给不同对象来管理&#xff0c;本文将着眼于策略模式进行分享。 一、概述 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#x…

chatgpt赋能python:Python什么情况下用类

Python什么情况下用类 在Python编程中&#xff0c;类是一种重要的数据结构&#xff0c;它是面向对象编程的核心。类可定义数据类型&#xff0c;并把数据与操作数据的函数组合在一起。因此&#xff0c;通过使用类&#xff0c;我们可以将数据、函数和其他方法组合在一起&#xf…

OLAP系列:四、clickhouse分布式表使用指南

一、背景 ClickHouse中最强大的表引擎当属MergeTree&#xff08;合并树&#xff09;引擎及该系列&#xff08;*MergeTree&#xff09;中的其他引擎&#xff0c;支持索引和分区&#xff0c;地位可以相当于innodb之于Mysql。 而且基于MergeTree&#xff0c;还衍生出了很多小弟&a…

【量化分析】绘制指标线EWM和MACD(1)

目录 一、说明 二、使用mplfinance的前提 2.1 mplfinance生态圈 2.1 安装mplfinance 三、mplfinance绘图 3.1 单变量图 3.2 将用户自己生成的曲线添加到 mplfinance plot() 四、显示EWM和MACD 一、说明 在做量化分析的时候&#xff0c;需要有能力计算种种曲线&#xff…

ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案

去年年底&#xff0c;全新升级版的 ShowMeBug ——一款支持实战编程的技术能力评估平台&#xff0c;首次揭开了它神秘的面纱。 而近日&#xff0c;ShowMeBug 再次迎来一系列产品更新&#xff0c;它将以全新的面貌&#xff0c;提供高信效度支撑的技术招聘方案&#xff0c;持续助…

chatgpt赋能python:Python人脸登录:这项技术将颠覆传统的登录方式

Python人脸登录&#xff1a;这项技术将颠覆传统的登录方式 简介 在互联网时代&#xff0c;登录是每个人使用网站或软件的第一步&#xff0c;但是传统的用户名和密码登录已经不能满足用户的需求。不断的爆出各种账户泄露事件、密码猜测和密码被盗等问题&#xff0c;导致用户的…

cleanmymac要不要下载装机?好不好用

当我们收到一台崭新的mac电脑&#xff0c;第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”&#xff0c;监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…

生成程序片段(程序依赖图PDG)

生成程序片段(程序依赖图PDG) 生成程序片段 标准方法是&#xff1a; 基于依赖性分析的切片。 使用程序依赖图表示依赖。 从中生成切片。 我们将专注于这种方法。但是&#xff0c;还有其他选择。 程序依赖图 The Program Dependence Graph (PDG) 表示数据和控制依赖项&#xf…

Servlet的常用Api—HttpServletResponse

Servlet的常用Api—HttpServletResponse &#x1f50e;核心方法setContentType && setCharacterEncodingsendRedirect关于Keep-Alive关于状态码 && Body &#x1f50e;结尾 &#x1f50e;核心方法 方法描述(void) setStatus(int sc)为该响应设置状态码(void) s…

2023年4月和5月随笔

1. 回头看 为了不耽误学系列更新&#xff0c;4月随笔合并到5月。 日更坚持了151天&#xff0c;精读完《SQL进阶教程》&#xff0c;学系统集成项目管理工程师&#xff08;中项&#xff09;系列更新完成。 4月和5月两月码字114991字&#xff0c;日均码字数1885字&#xff0c;累…

python的AutoGui库(1)获取鼠标实时位置

1.安装AutoGui库,与库的导入 PyAutoGUI是一个纯Python的GUI自动化工具&#xff0c;其目的是可以用程序自动控制鼠标和键盘操作&#xff0c;多平台支持&#xff08;Windows&#xff0c;OS X&#xff0c;Linux&#xff09;。可以用pip安装&#xff0c;Github上有源码。 使用命令…

Ceph应用

//存储类型 块存储 一对一&#xff0c;只能被一个主机挂载使用&#xff0c;数据以块为单位进行存储&#xff0c;典型代表: 硬盘 文件存储 一对多&#xff0c;能被多个主机同时挂载使用&#xff0c;数据以文件的形式存储的(元数据和实际数据是分开存储的)&#xff0c;并且有…

Python学习笔记 - 探索33个保留关键字

Python编程语言中有33个保留关键字&#xff0c;这些关键字在Python语法中有特殊含义&#xff0c;不能用作变量名、函数名或其他标识符。 33个保留字&#xff08;关键字&#xff09; 不能冲突的关键词 33 个 来看看都有哪些关键字。 import keyword print("&#xff0c;…

面试专题:java多线程(3)---关于 Atomic 原子类

1.介绍一下Atomic 原子类Atomic 翻译成中文是原子的意思。在化学上&#xff0c;我们知道原子是构成一般物质的最小单位&#xff0c;在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开…

cpolar内网穿透创建实现远程办公---无需公网IP

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 转发自cpolar极点云的文章&#xff1a;外网远程访问公司内网用友畅捷通T财务软件 – 远程办公 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企业对远…

JavaScript 客户端脚本语言 选择器、事件

JavaScript发展史 JavaScript介绍 JavaScript ( 简称 JS): 是一种轻量级客户端脚本语言&#xff0c;通常被直接嵌入 HTML 页面&#xff0c;在浏览器上执 行。 JavaScript 的主要用途 : 使网页具有交互性&#xff08;如果不去使用js&#xff0c;只是使用html css那么只是…

chatgpt赋能python:Python主网站的SEO优化

Python主网站的SEO优化 作为一名有10年Python编程经验的工程师&#xff0c;我一直非常关注Python官方网站的SEO优化&#xff0c;因为官方网站对于传播Python语言的影响至关重要。在这篇文章中&#xff0c;我将介绍一些Python主网站的SEO优化策略&#xff0c;并总结一些结论&am…

程序切片(定义+用途)

程序切片(定义用途) 介绍 让我们假设我们测试了一个程序 p 并失败了&#xff08;错误的 输出&#xff09;。然后我们想找出导致失败&#xff08;故障&#xff09;的原因。 现在假设我们要更改程序的一部分。我们可能会问&#xff1a;程序的哪些其他部分受到影响 我们想找到导致…

1728_c语言标准库memcpy函数的简单使用

全部学习汇总&#xff1a; GreyZhang/c_basic: little bits of c. (github.com) 欢迎路过的YUAN类朋友相互交流&#xff0c;以下是我的联系方式&#xff1a; Email&#xff1a;greyzhang126.com 微信&#xff1a;grey0612 静态代码检测遇到了一处memcpy函数使用的错误&#…

如何DIY项目资源私有检测规则

本地资源检测是UWA推出的、面向于静态资源的全量分析。可以全面自动检测项目静态工程内各项资源、代码和设置&#xff0c;能够帮助项目组制定合理的资源与代码标准&#xff0c;及时发现潜在的性能问题和异常错误&#xff0c;建立有效的开发规范。 为了在游戏优化过程中持续与U…