浏览器导出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) {//实例化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.rhkb.cn/news/289470.html

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

相关文章

智驾芯片“独角兽”地平线流血冲刺上市,三年累计亏损47亿元

3月26日&#xff0c;Horizon Robotics&#xff08;下称“地平线”&#xff09;向港交所递交招股书&#xff0c;高盛、摩根士丹利、中信建投国际为其联席保荐人。 据介绍&#xff0c;成立于2015年的地平线是一家人工智能计算平台公司&#xff0c;专注于为智能汽车提供高级辅助驾…

Vivado使用(2)——综合运行与OOC

目录 一、综合运行 二、OOC 2.1 如何设置 OOC 模块 2.2 存根文件和黑盒属性 2.3 使用限制 2.4 另一种设置方法 一、综合运行 一个“运行&#xff08;run&#xff09;”是指定义和配置设计在综合过程中的各方面&#xff0c;包括&#xff1a;使用到约束&#xff0c;针对的…

蓝桥杯算法赛(二进制王国)

问题描述 二进制王国是一个非常特殊的国家&#xff0c;因为该国家的居民仅由 0 和 1 组成。 在这个国家中&#xff0c;每个家庭都可以用一个由 0 和 1 组成的字符串 S 来表示&#xff0c;例如 101、 000、 111 等。 现在&#xff0c;国王选了出 N 户家庭参加邻国的庆典…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文&#xff0c;英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国&#xff0c;请记住我给出的原理&#xff0c;不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步&#xff1a;我们打开Uni…

Qt如何直接处理系统事件(比如鼠标事件),而不是post事件

#include <QtGui/5.15.2/QtGui/qpa/qwindowsysteminterface.h> // 方便调试事件 QWindowSystemInterface::setSynchronousWindowSystemEvents(true); 直接再 qWindowsWndProc函数中处理 通常情况: 事件被放到一个队列中

JavaEE之网络初识(网络中的一些基本概念)详解

&#x1f63d;博主CSDN主页: 小源_&#x1f63d; &#x1f58b;️个人专栏: JavaEE &#x1f600;努力追逐大佬们的步伐~ 目录 1. 前言 2. 网络中的一些基本概念 2.1 IP地址 2.2 端口号 2.3 网络协议 2.4 协议分层 2.5 封装 2.6 分用 (封装的逆向过程) 2.7 客户端 vs …

韩顺平Java | C21网络编程

1 网络的相关概念 ip地址的组成&#xff1a;网络地址 主机地址 A类&#xff1a;0 ~ 2^7-1 0 ~ 127 B类&#xff1a;128 ~ 1282^6-1 128 ~ 191 C类&#xff1a;192 ~ 1922^5-1 192 ~ 223 D类&#xff1a;224 ~ 2242^4-1 224 ~ 239 E类&#xff1a;240 ~ 2402^3-1 240 ~ 2…

正弦实时数据库(SinRTDB)的使用(5)-历史数据查询(一)

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

20240321-1-AB测试面试题

AB测试面试题 1. 介绍一下ABTest的步骤 ABtest就是为了测试和验证模型/项目的效果&#xff0c;在app/pc端设计出多个版本&#xff0c;在同一时间维度下&#xff0c;分别用组成相同/相似的群组去随机访问这些版本&#xff0c;记录下群组的用户体验数据和业务数据&#xff0c;最…

力扣题库88题:合并两个有序数组(c语言)

解法&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1m-1;int l2n-1;int l3mn-1;while(l1>0&&l2>0){if(nums1[l1]>nums2[l2]){nums1[l3--]nums1[l1--];}else{nums1[l3--]nums2[l2--];}}while(l2>0)…

化工企业能源在线监测管理系统,智能节能助力生产

化工企业能源消耗量极大&#xff0c;其节能的空间也相对较大&#xff0c;所以需要控制能耗强度&#xff0c;保持更高的能源利用率。 化工企业能源消耗现状 1、能源管理方面 计量能源消耗时&#xff0c;计量器具存在问题&#xff0c;未能对能耗情况实施完全计量&#xff0c;有…

uniapp-Form示例(uviewPlus)

示例说明 Vue版本&#xff1a;vue3 组件&#xff1a;uviewPlus&#xff08;Form 表单 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架&#xff09; 说明&#xff1a;表单组建、表单验证、提交验证等&#xff1b; 截图&#xff1a; 示例代码 <templat…

阎淑萍:老母猪戴口罩还挺重视这张老脸啊,赵本山:我也相当副科级呀!

阎淑萍&#xff1a;老母猪戴口罩还挺重视这张老脸啊&#xff0c;赵本山&#xff1a;我也相当副科级呀&#xff01; ——小品《老拜年》&#xff08;上&#xff09;的台词 《老拜年》 是赵本山、阎淑萍、王中青、苏杰在《1993年中央电视台春节联欢晚会》上表演的小品&#xff0…

支付系列——从支付宝与银联的多年恩怨说起

备注&#xff1a;本文纯属个人观点&#xff0c;可能会有错误&#xff0c;但不接受反驳&#xff0c;哈哈&#xff01;同时&#xff0c;本文没写太多专业术语&#xff0c;只是科普和胡侃&#xff01; 2003年&#xff0c;马云刚创立淘宝网不久&#xff0c;为了能够提供更便捷的线上…

GEE实践应用|热岛效应(一)地表温度计算

目录 1.学习目标 2.理论介绍 3.从MODIS获得地表温度 4.从Landsat卫星获得地表温度 1.学习目标 ①了解如何使用GEE计算地表温度 2.理论介绍 城市化涉及用建筑物、道路和停车场等建筑结构取代自然景观。这种土地覆盖的改变也改变了土地表面的特性。这些变化的范围从表面反射和…

【JavaWeb】Day20.Vue组件库Element——常见组件

常见组件-对话框 Dialog 对话框&#xff1a;在保留当前页面状态的情况下&#xff0c;告知用户并承载相关操作。 首先打开官网&#xff08;Element - The worlds most popular Vue UI framework&#xff09;找到使用的对话框组件。 以自定义内容为例&#xff1a; 常见组件-表…

【实战】springboot整合swagger及knife4j

文章目录 前言技术积累何为swagger何为knife4jSwagger2与Swagger3注解的主要区别 springboot整合swagger及knife4j导入maven依赖yaml配置编写配置类编写实体和接口 效果展示 前言 对于一个有着资深后端搬砖经验的人来说&#xff0c;最重要的事情就是写API文档了。一个好的API文…

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列&#xff0c;需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

Python基本运算

1.逻辑运算符 第四行会有黄色的下划线是因为这个不是系统推荐的写法&#xff0c;系统推荐的是第五行的链式比较&#xff1b; 2.短路求值 对于and而言&#xff0c;左边的语句是false&#xff0c;那么整体一定是false,右边的表达式就不会进行计算&#xff1b; 对于or而言&…