excludeCols, Integer sheetNo, String sheetName) {
EasyExcel.write(filePath, headClazz).excludeColumnFiledNames(excludeCols).sheet(sheetNo, sheetName).doWrite(data);
* 多个sheet页的数据链式写入
* ExcelUtil.writeWithSheets(outputStream)
* .writeModel(ExcelModel.class, excelModelList, "sheetName1")
* .write(headData, data,"sheetName2")
* .finish();
* @param outputStream
public static EasyExcelWriterFactory writeWithSheets(OutputStream outputStream) {
EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(outputStream);
return excelWriter;
* 多个sheet页的数据链式写入
* ExcelUtil.writeWithSheets(file)
* .writeModel(ExcelModel.class, excelModelList, "sheetName1")
* .write(headData, data,"sheetName2")
* .finish();
* @param file
public static EasyExcelWriterFactory writeWithSheets(File file) {
EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(file);
return excelWriter;
* 多个sheet页的数据链式写入
* ExcelUtil.writeWithSheets(filePath)
* .writeModel(ExcelModel.class, excelModelList, "sheetName1")
* .write(headData, data,"sheetName2")
* .finish();
* @param filePath
public static EasyExcelWriterFactory writeWithSheets(String filePath) {
EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(filePath);
return excelWriter;
* 多个sheet页的数据链式写入(失败了会返回一个有部分数据的Excel)
* ExcelUtil.writeWithSheets(response, exportFileName)
* .writeModel(ExcelModel.class, excelModelList, "sheetName1")
* .write(headData, data,"sheetName2")
* .finish();
* @param response
* @param exportFileName 导出的文件名称
public static EasyExcelWriterFactory writeWithSheetsWeb(HttpServletResponse response, String exportFileName) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
String fileName = URLEncoder.encode(exportFileName, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(response.getOutputStream());
return excelWriter;
3.引入自定义写入类,此类是原作者封装一个类方便使用链式调用的方式方便添加多sheet(这里下面生成时会用到这个链式调用)
package com.yangjie.testDemo1.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import java.io.File;
import java.io.OutputStream;
import java.util.List;
* Author: YangJie
* Datetime: 2022年11月16日 10:59
* Description: 链式添加sheet表
public class EasyExcelWriterFactory {
private int sheetNo = 0;
private ExcelWriter excelWriter = null;
public EasyExcelWriterFactory(OutputStream outputStream) {
excelWriter = EasyExcel.write(outputStream).build();
public EasyExcelWriterFactory(File file) {
excelWriter = EasyExcel.write(file).build();
public EasyExcelWriterFactory(String filePath) {
excelWriter = EasyExcel.write(filePath).build();
* 链式模板表头写入
* @param headClazz 表头格式
* @param data 数据 List<ExcelModel> 或者List<List<Object>>
* @return
public EasyExcelWriterFactory writeModel(Class headClazz, List data, String sheetName) {
excelWriter.write(data, EasyExcel.writerSheet(this.sheetNo++, sheetName).head(headClazz).build());
return this;
* 链式自定义表头写入
* @param head
* @param data 数据 List<ExcelModel> 或者List<List<Object>>
* @param sheetName
* @return
public EasyExcelWriterFactory write(List<List<String>> head, List data, String sheetName) {
excelWriter.write(data, EasyExcel.writerSheet(this.sheetNo++, sheetName).head(head).build());
return this;
* 使用此类结束后,一定要关闭流
public void finish() {
excelWriter.finish();
4.下载ExcelUtil 工具类
package com.yangjie.testDemo1.util;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
* @className com.yq.common.utils.ExcelUtil
* @author: yangjie
* @description: ExcelUtil
@Slf4j
public class ExcelUtil {
* 下载Excel
* @param response 请求response
* @param fileName 下载文件名称 xxx.xlsx
* @param filePath 下载文件路径 D://xxx/xxx
public static void downExcel(HttpServletResponse response, String fileName, String filePath) {
// path是指想要下载的文件的路径
File file = new File(filePath);
ExcelUtil.downExcel(response,fileName,file);
* 下载Excel
* @param response 请求response
* @param fileName 下载文件名称 xxx.xlsx
* @param file 下载文件流
public static void downExcel(HttpServletResponse response, String fileName, File file) {
FileInputStream fileInputStream = null;
InputStream fis = null;
OutputStream outputStream = null;
try {
// 将文件写入输入流
fileInputStream = new FileInputStream(file);
fis = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
// 解决跨域问题,这句话是关键,对任意的域都可以,如果需要安全,可以设置成安前的域名
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.setHeader("FileName", URLEncoder.encode(fileName, "UTF-8"));
response.setHeader("Access-Control-Expose-Headers", "FileName");
response.setCharacterEncoding("UTF-8");
//Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
//attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 告知浏览器文件的大小
response.addHeader("Content-Length", "" + file.length());
outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
log.error("文件下载异常,{}", e);
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
5.创建实体类(这里的
@ExcelProperty(value = "品种", index = 0)
value对应 Excel中最上方显示名称 index:代表在第几列
package com.yangjie.testDemo1.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
* @author YangJie
* @date 2022年11月16日 13:49
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExportMyRequirementsInformationVo implements Serializable {
private static final long serialVersionUID = -2986024804753822180L;
@ExcelProperty(value = "品种", index = 0)
private String spuName;
@ExcelProperty(value = "企业名称", index = 1)
private String customerEnterpriseName;
@ExcelProperty(value = "需求量 (吨)", index = 2)
private BigDecimal requirementWeight;
@ExcelProperty(value = "品种需求占比", index = 3)
private String proportionOfDemand;
@ExcelProperty(value = "品牌偏好", index = 4)
private String brand;
@ExcelProperty(value = "竞争对手", index = 5)
private String competitorName;
6:写入和下载文件 访问该请求地址浏览器可直接下载
(这里造的数据和输出的不一样是 因为我偷懒了)
* 导出我的需求信息
* @author YangJie
* @date 2022/11/16 14:25
@GetMapping("/exportMyRequirementsInformation")
public void exportMyRequirementsInformation(HttpServletResponse response) {
List<ExportMyRequirementsInformationVo> exportMyRequirementsInformationVoList = new ArrayList<>();
//造数据
for (int i = 0; i < 10; i++) {
ExportMyRequirementsInformationVo exportMyRequirementsInformationVo = new ExportMyRequirementsInformationVo();
exportMyRequirementsInformationVo.setRequirementWeight(BigDecimal.ONE);
exportMyRequirementsInformationVo.setBrand("数据" + i);
exportMyRequirementsInformationVo.setCompetitorName("Name" + i);
exportMyRequirementsInformationVo.setSpuName("产品" + i);
exportMyRequirementsInformationVoList.add(exportMyRequirementsInformationVo);
//文件名称 注意这里一定要拼接文件格式 不然文件下载下来会是txt文件
String fileName = "我的Excel" + ".xlsx";
//文件存储路径
String tempPath = "/Users/yangjie/Desktop/testDemo/src/main/resources" + "/";
//导出/写入 文件路径
String filePath = tempPath + fileName;
EasyExcelWriterFactory res = EasyExcelUtil.writeWithSheets(filePath)
.writeModel(ExportMyRequirementsInformationVo.class, exportMyRequirementsInformationVoList, "我的需求信息");
res.finish();
ExcelUtil.downExcel(response,fileName,filePath);
解决: 想要实现循环 多sheet问题
1.因为在 EasyExcelWriterFactory 中我们封装了链式调用
我们就可以用循环的形式来添加多个sheet
1.1 因为第一个sheet和后面的格式不一样 可以单独为第一个sheet设置一个实体类
EasyExcelWriterFactory res = null;
for (Long spuId : spuIdSet) {
if (res == null) {
//判断循环当前是否是第一个sheet 如果是就用单独创建的类
res = EasyExcelUtil.writeWithSheets(filePath)
.writeModel(ExportSummaryOfRequirementsVo.class, exportSummaryOfRequirementsVoList, "需求总览");
List<ExampleExportRequirementStatisticsVo> exampleExportRequirementStatisticsVoResultList =
exampleExportRequirementStatisticsVoMap.get(spuId);
//因为这边需求是用产品名称来为sheet命名
String spuName = exampleExportRequirementStatisticsVoResultList.get(0).getSpuName();
//循环中 链式调用创建多sheet
res = res.writeModel(ExampleExportRequirementStatisticsVo.class, exampleExportRequirementStatisticsVoResultList, spuName);
res.finish();
ExcelUtil.downExcel(response,statisticalFileName,filePath);
1、Java导出动态数据为Excel文件,具体示例可以参考:https://img-blog.csdnimg.cn/1cc86ee5dffa48669e2b97283585fad2.png
2、项目使用SpringBoot,Ali3.0.5版本的easyexcel框架。
3、资源内有具体的使用说明和易碰到的问题及解决方案,有博主个人联系方式,欢迎来交流。
使用说明:
1、下载资源后请先看readme文档,README.md中有项目的介绍和具体的使用流程说明和易碰到的问题及解决方案。
2、若各位项目需求与本资源的样式相符度低,例如业务有渲染单元格颜色的,或者要求字体加粗,或者写入到多个Sheet页,或者设置列宽、行高,或者合并单元格,或者自动列宽,或者插入批注,或者读取Excel数据,又或者日期、数字或者自定义格式转换等等的需求时,可以参考本资源里面的《导出Excel教程.docx》里面给的需求思路。
1、关于读取Excel和写入Excel的注解示例可以参考:https://download.csdn.net/download/gongjin28_csdn/85324
编写 controller
这个方法时get请求,浏览器直接请求这个地址就会自动触发下载,前端也可以通过流的方式接收接口返回,然后处理文件下载,方法如下首先在请求拦截器中添加如下判断添加接口 api 请求
调用实现
点击按钮调用接口触发下载
最近看了阿里的开源项目EasyExcel,发现它是个很强大的工具,但是官方介绍中大部分都是使用对象,变量增加注解的方式,下面主要是在代码中实现相关样式的调整
本文介绍一下SpringBoot中,简单通过List生成excel并下载的方法,大家可以直接CV大法。还可以实现通过自己写样式策略来自由调整行高、自由合并。
一、将List直接导出为Excel下载
1.controller内接口写法:
@PostMapping("export")
public void export(@RequestBo
项目要求从数据库中查询出相关数据后,通过表格展示给用户,如果用户需要,可以点击导出按钮,导出数据为csv格式。
开发环境:JDK7、Tomcat7、SpringBoot
网页中的表格
下载后的表格
1、数据库查询数据
2、创建临时csv文件
3、输出csv流文件,提供给浏览器下载
4、删除临时文件
测试地址:127.0.0.1:8080/export
pom文件添加以下依赖
<dependency>
在Spring Boot中使用EasyExcel导出动态数据为Excel文件的代码如下:
1. 首先,我们需要导入`easyexcel`的依赖。在`pom.xml`文件中添加以下依赖:
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.3.0</version>
</dependency>
2. 创建一个Excel工具类,用于导出Excel文件。假设我们已经有一个名为`ExcelUtil`的工具类。
```java
import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
@Component
public class ExcelUtil {
public void export(HttpServletResponse response, List<Object> data) throws IOException {
// 设置响应头信息
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("导出文件", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 导出Excel文件
EasyExcel.write(response.getOutputStream(), Object.class).sheet("Sheet1").doWrite(data);
public void exportTemplate(HttpServletResponse response) throws IOException {
// 设置响应头信息
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("模板文件", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 导出模板文件
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("template.xlsx");
EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).sheet().doWrite(null);
3. 创建一个Controller类,用于处理导出Excel的请求。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/excel")
public class ExcelController {
@Autowired
private ExcelUtil excelUtil;
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
// 模拟动态数据,实际场景中可以根据业务需求获取数据
List<Object> data = new ArrayList<>();
data.add("数据1");
data.add("数据2");
data.add("数据3");
// 导出Excel文件
excelUtil.export(response, data);
@GetMapping("/template")
public void exportTemplate(HttpServletResponse response) throws IOException {
// 导出Excel模板文件
excelUtil.exportTemplate(response);
以上代码演示了使用Spring Boot和EasyExcel导出动态数据为Excel文件的过程。在Controller中,我们可以根据实际业务需求获取数据,并调用`ExcelUtil`中的方法实现导出操作。同时,我们也提供了导出Excel模板文件的方法,以方便用户进行数据录入。
安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0
安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0
weixin_43623277:
安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0
abtechwhs:
安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0
abtechwhs:
Java使用EasyExcel导出数据到Excel文件,以及调用接口下载文件
Bbl300Ey:
Java使用EasyExcel导出数据到Excel文件,以及调用接口下载文件
可釦--稀饭:
安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0
mysql模糊查询text字段时 查询效率极慢(优化)
jrebel and xrebel 激活了用不了,Event Log :Auto build completed with errors