浏览器导出excel

做java web项目时,经常遇到需要在页面上点击导出按钮,然后直浏览器接下载下来一个excel文档。

比如一个List<Person>的集合,需要将每个Person当做一行,输出到excel中去。其中Person实体类如下:

import lombok.Data;

/**
 * className Person
 * description
 *
 * @author 
 * @version 1.0
 * @date 
 **/
@Data
public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private Integer sex;
    /**
     * 身份证号
     */
    private String certificateNumber;
    /**
     * 手机号
     */
    private String phoneNumber;
}

可以使用 HttpServletResponse 实现浏览器下载,写一个ExcelUtils,如下:

import com.test.cn.entity.dto.ExcelData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.httpclient.util.DateUtil;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.List;


/**
 * @ClassName ExcelUtils
 * @Deacription excel工具类
 * @Author wangcaoxiu
 * @Date 2022/5/9 15:41
 * @Version 1.0
 **/
@Component
@Slf4j
public class ExcelUtils {
    /**
     * 方法名:exportExcel
     * 功能:导出Excel
     * 描述:
     * 创建人:typ
     * 创建时间:2018/10/19 16:00
     * 修改人:
     * 修改描述:
     * 修改时间:
     */
    public static void exportExcel(HttpServletResponse response, ExcelData data) {
        //实例化XSSFWorkbook
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建一个Excel表单,参数为sheet的名字
        XSSFSheet sheet = workbook.createSheet("sheet");
        //设置表头
        setTitle(workbook, sheet, data.getHead());
        //设置单元格并赋值
        setData(sheet, data.getData());
        //设置浏览器下载
        setBrowser(response,workbook, data.getFileName());
    }

    /**
     * 方法名:setTitle
     * 功能:设置表头
     * 描述:
     * 创建人:typ
     * 创建时间:2018/10/19 10:20
     * 修改人:
     * 修改描述:
     * 修改时间:
     */
    private static void setTitle(XSSFWorkbook workbook, XSSFSheet sheet, String[] str) {
        XSSFRow row = sheet.createRow(0);
        //设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
        for (int i = 0; i <= str.length; i++) {
            sheet.setColumnWidth(i, 15 * 256);
        }
        //设置为居中加粗,格式化时间格式
        XSSFCellStyle style = workbook.createCellStyle();
        XSSFFont font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
        //创建表头名称
        XSSFCell cell;
        for (int j = 0; j < str.length; j++) {
            cell = row.createCell(j);
            cell.setCellValue(str[j]);
            cell.setCellStyle(style);
        }
    }

    private static void setData(XSSFSheet sheet, List<String[]> data) {
        int rowNum = 1;
        for (int i = 0; i < data.size(); i++) {
            XSSFRow row = sheet.createRow(rowNum);
            for (int j = 0; j < data.get(i).length; j++) {
                row.createCell(j).setCellValue(data.get(i)[j]);
            }
            rowNum++;
        }
    }

    /**
     * 方法名:setBrowser
     * 功能:使用浏览器下载
     * 描述:
     * 创建人:typ
     * 创建时间:2018/10/19 16:20
     * 修改人:
     * 修改描述:
     * 修改时间:
     */
    private static void setBrowser(HttpServletResponse response,XSSFWorkbook workbook, String fileName) {
        try {
            //清空response
            response.reset();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
            OutputStream os = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-download");
            response.setCharacterEncoding("utf-8");

            //将excel写入到输出流中
            workbook.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            log.error("excel error :{}", e);
        }
    }

}

其中ExcelData的实体类如下:

import com.alibaba.fastjson.JSONObject;

import java.util.List;

/**
 * @description excel导出类
 * @className ExcelData
 * @author
 * @date
 **/
public class ExcelData {
    private String fileName;
    private String[] head;
    private List<JSONObject> heads;
    private List<String[]> data;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String[] getHead() {
        return head;
    }

    public void setHead(String[] head) {
        this.head = head;
    }

    public List<JSONObject> getHeads() {
        return heads;
    }

    public void setHeads(List<JSONObject> heads) {
        this.heads = heads;
    }

    public List<String[]> getData() {
        return data;
    }

    public void setData(List<String[]> data) {
        this.data = data;
    }
}

然后在代码里调用ExcelUtils实现下载:

import com.test.cn.entity.dto.ExcelData;
import com.test.cn.entity.dto.Person;
import com.test.cn.util.ExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * className PersonController
 * description
 *
 * @author 
 * @version 1.0
 * @date 
 **/
@Slf4j
@RestController
@RequestMapping("/person")
public class PersonController {

    @PostMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) {
        try {
            List<String[]> list = new ArrayList<>();
            Person person1 = new Person("张三",23, "男", "111111111111111111","18888888888");
            Person person2 = new Person("李四",34, "男", "111111111111111111","18888888888");
            Person person3 = new Person("王五",28, "男", "111111111111111111","18888888888");

            String[] data1 = new String[]{person1.getName(),person1.getAge().toString(),person1.getSex(),person1.getCertificateNumber(),person1.getPhoneNumber()};
            list.add(data1);

            String[] data2 = new String[]{person2.getName(),person2.getAge().toString(),person2.getSex(),person2.getCertificateNumber(),person2.getPhoneNumber()};
            list.add(data2);

            String[] data3 = new String[]{person3.getName(),person3.getAge().toString(),person3.getSex(),person3.getCertificateNumber(),person3.getPhoneNumber()};
            list.add(data3);

            //构造ExcelData
            ExcelData excelData = new ExcelData();
            excelData.setData(list);
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            String fileName = "人员信息表_" + df.format(new Date());
            excelData.setFileName(URLEncoder.encode(fileName, "UTF-8"));
            String[] head = {"姓名", "年龄", "性别", "身份证号", "手机号"};
            excelData.setHead(head);
            //导出
            ExcelUtils.exportExcel(response, excelData);
            log.info("请求 exportExcel end ......");
        } catch (Exception e) {
            log.error("exportExcel error:", e);
        }
    }
}

postman调用这个接口,即可看下成功下载的excel文件如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PTA-练习9

目录 实验10-4 递归实现顺序输出整数 实验10-10 十进制转换二进制 实验10-6 递归求简单交错幂级数的部分和 实验11-1-2 输出月份英文名 实验11-1-6 指定位置输出字符串 实验11-1-8 查找子串 递归的基本思路&#xff1a; 推出递归的条件或者进入递归的条件每层递归需要执行…

手把手教你绘画原型图:Axure的安装使用

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师&#xff0c;大模型&#xff0c;爬虫、ACM算法 &#x1f492; 公众号&#xff…

DC-3靶机

一.环境搭建 下载地址&#xff1a; http://www.five86.com/downloads/DC-3-2.zip 下载不下来的可以用迅雷输入上面的网址进行下载 虚拟机配置&#xff1a; 切换连接桥接模式为nat模式&#xff0c;启动靶机&#xff0c;出现如下报错&#xff0c;进入虚拟机配置 选中CD/DVD&…

通过Appium和Xcode Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

百元开放式耳机怎么选?五款入手不亏的上乘产品推荐

耳机已经成为了我们生活中不可或缺的一部分&#xff0c;无论是通勤路上的音乐陪伴&#xff0c;还是家中观影的沉浸体验&#xff0c;一款优质的耳机都能为我们带来极大的享受。而在众多耳机类型中&#xff0c;开放式耳机因其独特的声场表现和舒适的佩戴体验&#xff0c;受到了越…

弹性伸缩 AS

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

JavaScript进阶5之垃圾回收(计算机组成、解释与编译、JavaScript引擎、垃圾回收、内存管理)、运行机制(浏览器进程分类、浏览器事件循环)

垃圾回收&运行机制 垃圾回收计算机组成解释与编译JavaScript引擎V8引擎 垃圾回收引用计数法标记清除&#xff08;mark-sweep&#xff09;算法 内存管理新生代 运行机制浏览器进程分类&#xff1a;浏览器事件循环宏任务微任务整体流程浏览器事件循环案例一案例二 垃圾回收 …

成都克鲁斯机器人电路板故障维修攻略,快来了解一下!

一、克鲁斯机器人电路板维修步骤 断开电源&#xff1a;在进行电路维修前&#xff0c;务必断开机器人的电源&#xff0c;确保安全。 拆卸电路板&#xff1a;根据电路图或维修手册&#xff0c;小心拆卸故障电路板。注意记录拆卸过程中的细节&#xff0c;以便后续重新安装。 更换损…

Linux中APP读取按键的4种方法

查询方式 驱动程序中构造、注册一个file_operations结构体&#xff0c;里面有对应的open,read函数。 APP 调用 open 时&#xff0c;导致驱动中对应的 open 函数被调用&#xff0c;在里面配置 GPIO 为输入引脚。APP 调用 read 时&#xff0c;导致驱动中对应的 read 函数被调用&a…

一个金融长期主义案例:金融壹账通的财务减亏与生产力创新之路

产业变革正在进入新一轮竞速期&#xff0c;社会对新质生产力的需求越来越迫切。在此背景下&#xff0c;金融业也正在坚定重塑自我、向外赋能的决心。 在微观的企业角度上&#xff0c;改变也正悄然发生。3月18日&#xff0c;在美港股双重上市的金融壹账通公布2023年年度业绩报告…

正则表达式不会用?一篇教你快速搞懂 !

目录 前言一、基础字符二、一系列常用的字符&#xff1b;1、一些元字符&#xff08;Meta-characters&#xff09; 三、一些高级概念1、贪婪与懒惰匹配2、两个实例加深理解1.颜色值的匹配&#xff1a;RGBS值2.ipv4 地址匹配 四、正则表达式常用语法**1.Flags&#xff08;标志符或…

测试开发工程师(QA)职业到底需要干些什么?part5:性能测试工程师QA

工作职责 性能测试工程师&#xff08;Performance Testing Engineer&#xff09;是负责评估和优化软件、应用程序或系统在不同负载和压力条件下的性能的专业人员。他们的工作职责包括以下几个方面&#xff1a; 性能测试计划&#xff1a;性能测试工程师与开发团队、产品团队和系…

工作的第二天

昨天的进度 写今天思路如何做评论表的增删该查评论表的增加 选择用户和商品 弹出框出现了问题 检查代码 结构没有问题 定义变量也没有问题 控制太中也没有报错信息 问题解决了 出现的问题在哪里定义的变量都有问题应该现在 setup 上面 定义一个 变量 const ref ref(fals…

Autosar-CanNm、Nm配置详解(免费)-2

3.5NM配置项 3.5.1NmGlobalConstants NmNumberOfChannels Nm管理几个Can通信&#xff0c;通信我们只有智能进入网需要网络管理&#xff0c;因此一般这里只需要填1。 NmNumberOfClusters 如果NM需要与几个CanNm进行协同处理的话&#xff0c;那需要把这些配置为Cluster,即组…

让 AI 帮你写代码,开发提效神器来了

如今&#xff0c;大量程序员已经习惯在 AI 辅助下进行编程。据调研&#xff0c;AI 编码工具将程序员工作效率提升 50% 以上。 通义灵码是目前国内最受开发者喜爱的 AI 编码助手&#xff0c;可以提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、…

设置http响应报文

一、总结&#xff1a; (1)设置响应状态码&#xff1a; response.statusCode (2)设置响应状态描述&#xff1a; response.statusMessage() 使用的极少 (3)设置响应头信息&#xff1a; response.setHeader(头值,头名) (4)设置响应体&#xff1a; response…

一文详解CDGA证书含金量,非常详细!

在信息技术飞速发展的今天&#xff0c;数据已成为企业宝贵的资产。正确地管理和治理这些数据&#xff0c;对于企业实现数据价值最大化、保障数据安全和合规至关重要。这也使得数据治理领域的专业人才需求持续增长。CDGA&#xff08;Certified Data Governance Architect&#x…

【并发】第三篇 Hash冲突的解决方法

导航 一. 简介二. 解决Hash冲突的方法1. 开放地址法1.1 线性探测再散列1.2 二次探测再散列1.3 伪随机探测再散列2. 链地址法3. 再哈希法一. 简介 哈希(hash)是将任意长度的输入数据转化为固定长度的输出数据的算法。哈希函数会将输入数据压缩并映射为一个固定长度的哈希值,…

Trello国内替代工具有哪些?分享5款

盘点5款类似Trello的本地部署项目管理工具&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.Teambition&#xff1b;4.redmine&#xff1b;5.TAIga.io。 Trello是一款杰出的协作与工作管理应用&#xff0c;专为追踪团队项目、凸显当前活动任务、分配责任人&#xff…

面试题 之 webpack

1.说说你对webpack理解&#xff1f;解决什么问题&#xff1f; Webpack 是实现前端项目的模块化&#xff0c;用于现代 JavaScript 应用程序的静态模块打包工具&#xff0c;被webpack 直接引用的资源打包进 bunde.js的资源&#xff0c;当webpack 处理应用程序时,它会在内部构建一…