【Apache POI】Excel操作(三):Excel在浏览器端即Web端写入操作的实现
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭。
有目录,不迷路
- 前言
- 编码开始
- 依赖
- 实体类
- 控制层
- 运行
- 小提醒
前言
之前给大家介绍了Excel在本地导入的基本操作(本期博客需要有前两期博客的基础才比较好理解,大家最好看一看哦),详情可见博客:
【Apache POI】Excel操作(一):Excel本地写入基本操作的实现
以及
【Apache POI】Excel操作(二):Excel本地写入基本操作的实现(进阶版)
但很多小伙伴,或者说看过我这篇博客:那些年Java走过的路 的小伙伴可能就会问了:Java大多是运用于B/S架构的项目,也就是浏览器/服务器模式的项目,所以我往往需要的是在浏览器端导出Excel,那么我到底该怎么写呢???
别担心,本期博客将解决这个问题!!!
编码开始
依赖
既然要在web端操作,肯定需要Web的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
完整依赖如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- xls(03) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version>
</dependency><!-- xlsx(07) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version>
</dependency><!-- 日期格式化工具 -->
<dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version>
</dependency><!-- lombok的依赖,idea需按照lombok的插件-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope>
</dependency>
实体类
再需要一个实体类来装数据:
package com.guqueyue.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;//lombok插件的注解
@Data // 若未使用lombok插件,请自行生成getter、setter以及toString方法
@AllArgsConstructor // 若未使用lombok插件,请自行生成有参构造方法
@NoArgsConstructor // 若未使用lombok插件,请自行生成无参构造方法
@Accessors(chain = true) // 开启链式编程
public class DemoData {/*** 书名*/private String bookName;/*** 作者*/private String author;/*** 时间*/private String dateTime;}
控制层
接下来,我们在控制层编写代码就好了:
package com.guqueyue.controller;import com.guqueyue.entity.DemoData;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.joda.time.DateTime;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @ClassName ExportExcelController* @Description excel导出相关的控制层* @Author 古阙月* @Date 2020/11/4 0:31* @Version 1.0**/
@RequestMapping("/exportExcel")
@RestController
public class ExportExcelController {/*** 列名数组*/static String[] rowNameArray = {"书名", "作者", "写作时间"};/*** 生成数据的方法* @return*/private List<DemoData> getData() {List<DemoData> dataList = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setBookName("平凡的世界" + i);data.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));data.setAuthor("路遥" + i);dataList.add(data);}return dataList;}/*** 导出excel* @param response* @throws Exception*/@RequestMapping("/export")public void testWrite03Web(HttpServletResponse response) throws Exception {// 1.创建一个工作簿Workbook workbook = new HSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("古阙月的书单");// 3.创建第一行Row row1 = sheet.createRow(0);// 创建列名for (int i = 0; i < rowNameArray.length; i++) {Cell cell = row1.createCell(i);cell.setCellValue(rowNameArray[i]);}// 遍历创建接下来的行List<DemoData> dataList = getData();for (int i = 0; i < dataList.size(); i++) {Row row = sheet.createRow(i + 1);int j = 0;DemoData demoData = dataList.get(i);// 获取反射对象Class<?> clazz = demoData.getClass();// 获取反射对象的所有属性,包括公有属性和私有属性Field[] fields = clazz.getDeclaredFields();// 遍历所有属性for (Field field : fields) {// 私有属性授权,方便访问field.setAccessible(true);// 赋值String value = (String) field.get(demoData);Cell cell = row.createCell(j);cell.setCellValue(value);j++;}}/*** 格式化当前日期,以便拼接文件名*/SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String date = sdf.format(new Date());// 生成文件名String fileName = "古阙月书籍表03" + date + ".xls";/*** 将生成的excel写入到浏览器端*/response.reset();response.setContentType("application/ms-excel;charset=UTF-8");try {response.addHeader("Content-Disposition", "attachment;filename=\""+ new String((fileName).getBytes("GBK"),"ISO8859_1") + "\"");OutputStream out = response.getOutputStream();// 写入workbook.write(out);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}
}
看见代码不要慌,其实跟上期博客相比,主要多了这么些代码而已:
/*** 将生成的excel写入到浏览器端*/
response.reset();
response.setContentType("application/ms-excel;charset=UTF-8");
try {response.addHeader("Content-Disposition", "attachment;filename=\""+ new String((fileName).getBytes("GBK"),"ISO8859_1") + "\"");OutputStream out = response.getOutputStream();// 写入workbook.write(out);out.flush();out.close();
} catch (Exception e) {e.printStackTrace();
}
运行
运行SpringBoot程序,在浏览器端输入:http://localhost:8080/exportExcel/export (因为我这里没有配置端口,所以默认为8080
)
可以看到在浏览器下方成功导出了一个excel文件,点开一看:
完美!!!
小提醒
当然,我们在实际开发过程中是不可能让用户直接在浏览器端输入url来导出excel的,我们可能需要编写前端代码来发送请求。
切记,千万不要用ajax来发送请求,毕竟ajax发送请求都是由ajax引擎来发送和接收请求的,而不是浏览器!!!
本博主就因为这个发送的问题困扰了几个小时!用location.href
即可:
location.href = "url";
比如没有拦截器等配置的情况之下,本篇博客中的url就是:http://localhost:8080/exportExcel/export
好了,本期博客到此结束,敬请期待下期博客,我们不见不散
【Apache POI】Excel操作(三):Excel在浏览器端即Web端写入操作的实现相关推荐
- 【Apache POI】Java 读取Excel文件
Excel内容如下: 封装Excel行列字段的Bean: public class Employee {private String name;private String gender;privat ...
- 利用Apache POI读取并解析Excel的数据
/* * Created on 2010-12-9 * java读取excel文件 * */ import java.io.FileInputStream; import java.io.Fi ...
- sql2java-excel(一):基于apache poi实现数据库表的导出及支持spring web
sql2java是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器.这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供导出excel的功能. ...
- Apache POI 插入图片至 Excel 的两种方法
方法 1 插入图片至坐标 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();BufferedImage bufferIm ...
- 【Apache POI】Excel操作(六):Excel计算公式的读取和使用
此后如竟没有炬火,我便是唯一的光. 文章目录 前言 Excel准备 计算公式读取 直接读取 屠龙秘技 再直接读取 再通过计算公式读取 完整代码 往期回顾 前言 在上期:[Apache POI]Exce ...
- 【Apache POI】Excel操作(八):Excel工具类的封装(终极版)
恋爱最珍贵的纪念品,从来就不是那些你送我的手表和项链,甚至也不是那些甜蜜的短信和合照.是你留在我身上的,如同河流留给山川的,那些你对我造成的改变. 有目录,不迷路 前言 代码开整 环境准备 正式开整 ...
- 【Apache POI】Excel操作(四):Excel大数据量的写入
迷茫代表着你身边还有选择,焦虑意味着你手上还有时间. 有目录,不迷路 前言 超量数据 速率比较 原因剖析 超级版本大救星 往期回顾 前言 之前在下面这期Excel操作: [Apache POI]Exc ...
- 【Apache POI】Excel操作(一):Excel本地写入基本操作的实现
有人住高楼,有人在深沟,有人光万丈,有人一身锈:世人千万种,浮云莫去求,斯人若彩虹,遇上方知有. 有目录,不迷路 前言 前期准备 POI基本介绍 Excel简单介绍 Excel版本介绍 Excel基本 ...
- 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?
在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...
最新文章
- PyTorch | (2)PyTorch 入门-张量
- R语言与数据分析(8)-获取帮助
- html省市联动插件,jquery实现的交互体验更友好省市区三级联动插件
- [I2C]I2C总线协议图解
- @Resource注解研究和在SAP Hybris ECP中的应用
- Android项目实战欢迎界面
- 完美解决Mac电脑睡眠之后苹果电脑没有声音的方法
- extjs 中动态给gridpanel 复选框赋值
- JAVA常用API或编程工具003--实现pdf在线阅读功能之pdf.js
- php 循环table,php table循环 问题很简单 求帮助
- 宿主机mac os无法连接到虚拟机centos
- ECCV 2016 paper list
- python pip下载安装教程_windows下python安装pip图文教程
- YOLOv5 完美实现中文标签显示
- python图形化编程 在线教程_使用Python Editor进行在线图形化编程
- trove mysql 镜像_centos7下手动制作trove镜像
- 前端技术的发展和趋势
- chrome显示比例 Android,Android版Chrome在大尺寸平板电脑中将默认采用桌面模式
- Drone CI/CD系列(二)——python语言之配置.drone.yml文件
- 给数据穿上美丽的外衣