java的Excel导出方式总结
一、使用hutool导出excel
1.1 hutool介绍
hutool功能很强大,http请求到json处理、excel的导入导出、定时任务、IO、缓存、数据库操作等都提供了简单而方便的api供我们使用,好处是再也不用担心自己去整理常用的工具类了,同时也支持按需引入【但一般项目都是直接一如hutool-all 导致项目引入很多不必要的工具类】。
从2014年首次发布第一版本到现在已经8年了,这款国产工具类确实收获了越来越多的关注,而且社区的热度是可以的,但是比起Apache或者谷歌提供的工具类,更新频率和可靠性也许稍差,但在我看来是可以考虑使用的。
1.2 编写代码导出excel【仅表头】
我们要的效果:
所需编写的代码:
@GetMapping("/exportTemplate")public void exportTemplate(HttpServletResponse response) throws IOException {String column1Name1 = "时间戳";String column1Name2 = "设备名称";List<String> headList = new ArrayList<>();headList.add(column1Name1);headList.add(column1Name2);//在内存操作,写到浏览器ExcelWriter writer= ExcelUtil.getWriter(true);// 设置表头的宽度writer.setColumnWidth(0, 20);writer.setColumnWidth(1, 15);writer.writeHeadRow(headList).write(Collections.emptyList());//设置content—typeresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");//Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("数据集导入模板","UTF-8")+".xlsx");ServletOutputStream outputStream= response.getOutputStream();//将Writer刷新到OutPutwriter.flush(outputStream,true);outputStream.close();writer.close();}
1.3 编写代码导出excel【含内容】
我们要的效果:
所需编写的代码:
@GetMapping("/exportTemplate")public void exportTemplate(HttpServletResponse response) throws IOException {String column1Name1 = "时间戳";String column1Name2 = "设备名称";List<String> headList = new ArrayList<>();headList.add(column1Name1);headList.add(column1Name2);//在内存操作,写到浏览器ExcelWriter writer= ExcelUtil.getWriter(true);// 设置表头的宽度writer.setColumnWidth(0, 20);writer.addHeaderAlias("timestamp",column1Name1);writer.setColumnWidth(1, 15);writer.addHeaderAlias("deviceName",column1Name2);// 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之writer.setOnlyAlias(true);// 表格内容【相比上一节新内容】List<CollectDataExcelVo> excelList = new ArrayList<>();CollectDataExcelVo vo1 = new CollectDataExcelVo();vo1.setDeviceName("A类设备");vo1.setTimestamp(DateUtil.format(new Date()));excelList.add(vo1);CollectDataExcelVo vo2 = new CollectDataExcelVo();vo2.setDeviceName("B类设备");vo2.setTimestamp(DateUtil.format(new Date()));excelList.add(vo2);writer.writeHeadRow(headList).write(excelList);//设置content—typeresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");//Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("数据集导入模板","UTF-8")+".xlsx");ServletOutputStream outputStream= response.getOutputStream();//将Writer刷新到OutPutwriter.flush(outputStream,true);outputStream.close();writer.close();}
@Data
public class CollectDataExcelVo {/*** 时间戳*/@ApiModelProperty(value = "时间戳")private String timestamp;/*** 设备编码*/@ApiModelProperty(value = "设备名称")private String deviceName;
}
1.4 编写代码导出excel【导出下拉列表】
我们要的效果:
所需编写的代码:
@GetMapping("/exportTemplate")public void exportTemplate(HttpServletResponse response) throws IOException {String column1Name1 = "时间戳";String column1Name2 = "设备名称";List<String> headList = new ArrayList<>();headList.add(column1Name1);headList.add(column1Name2);//在内存操作,写到浏览器ExcelWriter writer= ExcelUtil.getWriter(true);// 设置表头的宽度writer.setColumnWidth(0, 20);writer.addHeaderAlias("timestamp",column1Name1);writer.setColumnWidth(1, 15);writer.addHeaderAlias("deviceName",column1Name2);// 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之writer.setOnlyAlias(true);// 表格下拉框【相比上一节新内容】writer.addSelect(1, 1, new String[]{"1#进线","2#进线", "3#进线"});writer.writeHeadRow(headList).write(Collections.emptyList());//设置content—typeresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");//Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("数据集导入模板","UTF-8")+".xlsx");ServletOutputStream outputStream= response.getOutputStream();//将Writer刷新到OutPutwriter.flush(outputStream,true);outputStream.close();writer.close();}
二、使用easyexcel导出excel
2.1 easyexcel介绍
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称;能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
2.2 编写代码导出excel
我们要的效果:
所需编写的代码:
pom引入依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>
java代码:
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
public class CollectDataExcelVo {/*** 时间戳*/@ExcelProperty(value = "时间戳", index = 0)@ColumnWidth(value = 20)@ApiModelProperty(value = "时间戳")private String timestamp;/*** 设备名称*/@ExcelProperty(value = "设备名称", index = 1)@ColumnWidth(value = 15)@ApiModelProperty(value = "设备名称")private String deviceName;
}
@GetMapping("/exportTemplate")public void exportTemplate(HttpServletResponse response) throws IOException {// 模拟数据库获取数据List<CollectDataExcelVo> list = data();response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode("template"+ DateUtils.format(new Date(), "yyyy-MM-dd")+".xlsx", StandardCharsets.UTF_8.name()));EasyExcel.write(response.getOutputStream(), CollectDataExcelVo.class).sheet().doWrite(list);}private List<CollectDataExcelVo> data() {List<CollectDataExcelVo> list = ListUtils.newArrayList();for (int i = 1; i <= 2; i++) {CollectDataExcelVo data = new CollectDataExcelVo();data.setTimestamp(DateUtil.format(new Date()));data.setDeviceName("A类设备"+i);list.add(data);}return list;}
三、从项目resources目录导出excel
3.1 将文件放入项目路径下
3.2 将文件导出
将文件从项目工程的 resources/file 目录下导出,所需代码如下:
import org.apache.poi.util.IOUtils;@GetMapping("/exportTemplate")public void exportTemplate(HttpServletResponse response) {InputStream inputStream = null;OutputStream outputStream = null;try {String fileName= URLEncoder.encode("template","UTF-8");outputStream = response.getOutputStream();// 获取springboot resource 路径下的文件inputStream = this.getClass().getResourceAsStream("/file/template.xlsx");response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");IOUtils.copy(inputStream, outputStream);} catch (Exception e) {throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, e.toString());} finally {closeInput(inputStream);flushOutput(outputStream);}}private void flushOutput(OutputStream outputStream) {try {outputStream.flush();} catch (IOException e) {logger.error("释放流异常", e);}}private void closeInput(InputStream inputStream) {try {inputStream.close();} catch (IOException e) {logger.error("释放流异常", e);}}
导出后会存在问题 excel文件导出后打不开!! 只需再pom.xml中配置如下即可:
<plugins><!-- maven资源文件复制插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><encoding>UTF-8</encoding><nonFilteredFileExtensions><nonFilteredFileExtension>xls</nonFilteredFileExtension><nonFilteredFileExtension>xlsx</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin></plugins>
四、使用easypoi 导出excel
4.1 easypoi 介绍
easypoi 也是国产开源的软件,它通过简单的注解和模板语言 (熟悉的表达式语法),就可以实现excel的导入导出功能。
4.2 编写代码导出excel
我们要的效果:
所需编写的代码:
pom引入依赖:
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.1.0</version></dependency>
java代码:
// 工具类
public class ExcelUtil {public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {ExportParams exportParams = new ExportParams();exportParams.setCreateHeadRows(isCreateHeader);Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);if (workbook != null) ;try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));workbook.write(response.getOutputStream());} catch (IOException e) {try {throw new Exception(e.getMessage());} catch (Exception e1) {e1.printStackTrace();}}}}
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.util.Date;@Data
public class CollectDataExcelVo {/*** 时间戳*/@Excel(name = "时间戳",format="yyyy-MM-dd HH:mm:ss", width = 20.0)private Date timestamp;/*** 设备编码*/@Excel(name = "设备名称", width = 20)private String deviceName;
}
@GetMapping("/export")@ApiOperation("导出数据")public void export(HttpServletResponse response) {String fileName = "template"+".xls";List<CollectDataExcelVo> list = data();ExcelUtil.exportExcel(list, CollectDataExcelVo.class, fileName, true, response);}
============
以上就是博主的excel导出方式总结,如有问题 欢迎在评论区留言
java的Excel导出方式总结相关推荐
- java中Excel导出echart图片
java中Excel导出echart图片 1.在生成echart的前端代码生成图片代码后Echart.setOption(captestRcapEchartOption, true);后面加上以下代码 ...
- java实现excel导出合并单元格
随着数据的不断增长,很多时候需要将数据导出到Excel中进行分析.处理和展示.而Java作为一种流行的编程语言,自然也提供了很多实现Excel导出的方法.本文将介绍如何使用Java实现Excel导出, ...
- Java之Excel导出工具类使用教程
前言: 本工具类经过PostMan和web页面严格测试可用,经过了多个版本迭代优化,可以直接使用,也方便大家根据自己的业务需求,修改定制自己的导出工具. 市面上有很多封装好的导出工具(如:阿里的eas ...
- 记一次java实现excel导出
新年过完了哦,小子我又来了,大家新年过的还快乐吗?反正我是只感觉到了"快,",没有感觉到"乐". 2021年的第一天,就接到新需求了.对,就是那个谁,来来,给个 ...
- java完成excel导出下载
废话不多说,直接上代码! 一.添加依赖 <!-- excel导出相关依赖 --><dependency><groupId>org.apache.poi</gr ...
- java实现Excel导出(springboot)
文章目录 一.完成相关配置 1.导入依赖 2.定义Excel注解以及Excels注解 3.给实体类添加Excel注解 二.Excel方法类 1.大致路线 2.定义ExcelUtil中的变量 3.Exc ...
- Java读取excel的方式,一篇文章看懂(详细)
目录 一.excel读取的两种方式 1.1 jxl 和 poi 的区别和选择 二.jxl 的使用 2.1 导入相关依赖 2.2 操作 三.poi 的使用 3.1 导入相关依赖 3.2 操作 四.总结 ...
- java poi excel导出
直接上代码 0. pom依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypo ...
- java 实现excel 导出功能
实现功能:java导出excel表 1.jsp代码 1 <form id="zhanwForm" action="<%=path%>/conferenc ...
最新文章
- QIIME 2用户文档. 7差异丰度分析gneiss(2018.11)
- html display布局,Web布局:display属性
- 转 Struct 和 Union区别 以及 对内存对齐方式的说明
- ChannelFactory.Endpoint 上的地址属性为空。ChannelFactory 的终结点必须指定一个有效的地址。...
- 使用无限生命期Session的方法
- git diff old mode 100644 new mode 100755
- javascript location.href 参数详解
- Java网络编程第一章
- Python 散点图的数据分析
- 宏碁电脑BIOS没有usb启动项怎么办?
- 解除操作系统宽带限制
- 关于安全域的划分与风险管理
- jbod ugood 磁盘驱动状态_JBOD磁盘配置和StorCLI命令使用小结
- 分享一个自用小功能--微信小程序二维码签到
- 【华为OD机试真题 Python】判断字符串子序列
- Mac 移动硬盘突然自己异常退出了(一)
- tensorflow.js在nodejs训练猫狗分类模型在浏览器上使用
- 腾讯产品法之读书笔记
- canvas压缩图片或者进行视频抓拍
- IDEA快速移动光标到行首或行尾;