浏览器导出excel

news/2024/4/28 21:56:10/文章来源:https://blog.csdn.net/weixin_42556307/article/details/137069892

做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) {//实例化XSSFWorkbookXSSFWorkbook 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 {//清空responseresponse.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);//构造ExcelDataExcelData 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文件如下:

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

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

相关文章

Linux系统使用Docker部署Portainer结合内网穿透实现远程管理容器和镜像

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LeetCode 1027——最长等差数列

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 假设我们以 f[d][nums[i]]表示以 nums[i] 为结尾元素间距为 d 的等差数列的最大长度&#xff0c;那么&#xff0c;如果 nums[i]-d 也存在于 nums 数组中&#xff0c;则有&#xff1a; f [ d ] [ n u m s [ i ] ] …

GPT-5有望在今年夏季到来

当OpenAI一年前发布了GPT-4 AI模型时&#xff0c;整个行业都被这个能模仿人类交流和写作的技术所震撼&#xff0c;同时也引发了一阵巨大的炒作和恐慌。自那以后&#xff0c;AI界许多人都关心的问题是&#xff1a;GPT-5什么时候出来&#xff1f;在全球各地的采访和媒体露面中&am…

开源大数据集群部署(十七)HADOOP集群配置(二)

作者&#xff1a;櫰木 1 HADOOP集群配置 配置文件workers [roothd1.dtstack.com software]# cd /opt/hadoop/etc/hadoop [roothd1.dtstack.com hadoop]# pwd /opt/hadoop/etc/hadoop [roothd1.dtstack.com hadoop]# cat >> workers <<EOF hd3.dtstack.com hd1.d…

【每日一题】1997. 访问完所有房间的第一天-2024.3.28

题目&#xff1a; 1997. 访问完所有房间的第一天 你需要访问 n 个房间&#xff0c;房间从 0 到 n - 1 编号。同时&#xff0c;每一天都有一个日期编号&#xff0c;从 0 开始&#xff0c;依天数递增。你每天都会访问一个房间。 最开始的第 0 天&#xff0c;你访问 0 号房间。…

基于51单片机的汽车安全带检测控制器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1To_ZEiJHBrZnm9ejYHFoPg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

为响应国家号召,搜维尔科技开启虚拟仿真实验室设备升级改造服务

近日&#xff0c;国务院发布了关于《推动大规模设备更新和消费品以旧换新行动方案》&#xff0c;该通知的发布表现出国家对于科技创新事业的高度重视。各行各业都在积极响应国家号召&#xff0c;加快数字化转型和设备升级与更新步伐。搜维尔科技为响应国家号召&#xff0c;将开…

46.continue语句

目录 一.continue语句 二.视频教程 一.continue语句 continue语句的作用和break语句很像&#xff0c;break语句会跳出当前循环&#xff0c;而continue语句则是跳出本次循环&#xff0c;继续执行下一次循环。 举个例子&#xff1a; #include <stdio.h>void main(void)…

iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

Android客户端自动化UI自动化airtest从0到1搭建macos脚本设计demo演示全网最全最详细保姆级有步骤有图-CSDN博客 避坑系列-必读&#xff1a; 不要安装iOS-Tagent &#xff0c;安装appium -这2个性质其实是差不多的都是为了安装wda。注意安装appium最新版本&#xff0c;安装完…

Mysql的日志管理,备份与回复

目录 一、Mysql日志管理 1、日志的默认位置及配置文件 2、日志分类 2.1错误日志 2.2通用查询日志 2.3二进制日志 2.4慢查询日志 2.5中继日志 3、日志配置 4、日志查询 4.1查询通用日志是否开启 4.2查询二进制日志是否开启 4.3查看慢查询日志是否开启 4.4查询慢查…

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…

UE4_旋转节点总结一

一、Roll、Pitch、Yaw Roll 围绕X轴旋转 飞机的翻滚角 Pitch 围绕Y轴旋转 飞机的俯仰角 Yaw 围绕Z轴旋转 飞机的航向角 二、Get Forward Vector理解 测试&#xff1a; 运行&#xff1a; 三、Get Actor Rotation理解 运行效果&#xff1a; 拆分旋转体测试一&a…

春秋云境CVE-2022-24663

简介 远程代码执行漏洞&#xff0c;任何订阅者都可以利用该漏洞发送带有“短代码”参数设置为 PHP Everywhere 的请求&#xff0c;并在站点上执行任意 PHP 代码。P.S. 存在常见用户名低权限用户弱口令 正文 进入首页我们没看到任何有价值的东西&#xff0c;那么就只好去寻找…

Gartner 公布 2024 年八大网络安全预测

近日&#xff0c;Gartner 安全与风险管理峰会在悉尼举行&#xff0c;旨在探讨网络安全的发展前景。 本次峰会&#xff0c;Gartner 公布了 2024 年及以后的八大网络安全预测。 Gartner 研究总监 Deepti Gopal 表示&#xff0c;随着 GenAI 的不断发展&#xff0c;一些长期困扰网…

SQLite数据库文件损坏的可能几种情况(一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 下一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 概述 SQLite数据库具有很强的抗损坏能力。如果应用程序崩溃&#xff0c…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例程开始执…

It takes two (搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 AAAO AAAA AAAA 输出 NO 思路&#xff1a; 根据题目意思&#xff0c;如果存在的 A 联通不可以成为 矩形&#xff0c;输出 NO&#xff0c;否则输出 YES 这道题看数据范…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

Linux文件系统和日志管理

文件系统的组成 Linux 文件系统会为每个文件分配两个数据结构&#xff1a;索引节点&#xff08;index node&#xff09; 和 目录项&#xff08;directory entry&#xff09;&#xff0c;它们主要用来记录文件的元信息和目录层次结构。 索引节点&#xff0c;也就是 inode&#…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…