java的Excel导出方式总结

news2025/2/28 20:22:41

一、使用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—type
        response.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刷新到OutPut
        writer.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—type
        response.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刷新到OutPut
        writer.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—type
        response.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刷新到OutPut
        writer.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>

============

以上就是博主的excel导出方式总结,如有问题 欢迎在评论区留言

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样在PDF上直接编辑文字?这几种编辑方法需要掌握

怎么做才能够直接在PDF文件上编辑文字呢&#xff1f;对PDF文件大家在工作中是经常使用的&#xff0c;相信大家也都亲身体验过&#xff0c;那就是经常会看见文件中有错误的地方&#xff0c;可能只是一个错别字&#xff0c;或者是图片错误&#xff0c;但我们也不得不改&#xff0…

2023年前端开发趋势未来可期

☆ 对于很多质疑&#xff0c;很多不解&#xff0c;本文将从 △ 目前企业内前端开发职业的占比&#xff1b; △ 目前业内开发语言的受欢迎程度&#xff1b; △ 近期社区问答活跃度&#xff1b; 等维度来说明目前前端这个职业的所处位置。 ☆ 还有强硬的干货&#xff0c;通过深入…

MQTT 协议的基本概念

目录 1、MQTT 介绍 2、MQTT 发布-订阅模式 &#xff08;1&#xff09;Broker 可拓展 &#xff08;2&#xff09;Broker 消息过滤 &#xff08;3&#xff09;MQTT 的主要特征是什么&#xff1f; &#xff08;4&#xff09;MQTT 和消息队列的区别 3、MQTT 客户端、 Broker…

6-TRITC 四甲基罗丹明-6-异硫氰酸 CAS 80724-20-5

产品名称&#xff1a;6-TRITC 四甲基罗丹明-6-异硫氰酸 英文名称&#xff1a;6-TRITC [Tetramethylrhodamine-6-isothiocyanate] CAS&#xff1a;80724-20-5 结构式&#xff1a; Ex (nm) 544 Em (nm) 570 分子量 479.98 溶剂 DMSO 存储条件 在零下15度以下保存, 避免光…

使用Idea新建Play项目sbt构建失败,提示scala-xml依赖冲突

最近学习scala和paly,使用idea模板创建项目后&#xff0c;项目构建时就发现报错了&#xff0c;处理了很久&#xff0c;记录一下。 错误日志: [error] (update) found version conflict(s) in library dependencies; some are suspected to be binary incompatible: [error] […

协程原理与设计

什么是M:N协程&#xff1f;为什么要支持M:N协程&#xff1f;如何设计M:N协程&#xff1f;tRPC-Cpp引入了公司开源组件Flare/fiber作为底层库&#xff0c;本文多角度分析梳理了M:N协程的关键原理和特性。1 常见线程模型的问题 在高并发编程场景&#xff0c;如互联网后台类业务中…

尚医通 (十九) --------- 数据字典导出与导入

目录一、数据字典导出1. 导出接口封装2. 在 service-cmn 模块添加 service 方法3. 在 service-cmn 模块添加 controller 方法4. 测试5. 导出前端实现二、数据字典导入1. 导入接口封装2. 导入前端实现一、数据字典导出 1. 导出接口封装 A、在 model 模块添加导出实体 在 mode…

【论文解析】Deep Generative Models on 3D Representations: A Survey

文章目录内容组织结构3 FUNDAMENTALS3.1 Deep Generative ModelsGenerative Adversarial Networks.Variational AutoencodersNormalizing Flows.Diffusion ModelsEnergy-based model.3.2 3D RepresentationsVoxel gridsPoint cloudsMeshesNeural fieldsHybrid representation.4…

读《高性能MySQL》笔记---索引

索引是存储引擎用于快速找到记录的的一种数据结构。 索引的优点 索引大大减少服务器需要扫描的数据量。索引帮助服务器避免排序和临时表。索引将随机IO变为顺序IO。 说明&#xff1a; 顺序IO&#xff1a;是指读写操作的访问地址连续。在顺序IO访问中&#xff0c;HDD所需的磁…

生产环境日志还用notepad++?难怪定位慢,UltraEdit了解一下!

最近这两天运营部门反馈有会员的会员卡开卡时间与相关页面显示的开卡时间不一致&#xff0c;需要定位确定哪个时间是准确的。对于线上数据异常问题一定要谨慎处理&#xff0c;因为很有可能会是用户的某些非常规操作导致部分场景漏测。 对于这种数据异常的业务问题&#xff…

顺序存储二叉数(Java)

1、顺序存储二叉数 从存储角度来看&#xff0c;我们之前讲的树在存储结构上不是顺序存储的&#xff0c;都是非线性的存储结构&#xff0c;所以我们可以从数组的角度来分析&#xff0c;数组和树可以相互转换&#xff0c;数组可以转换成树&#xff0c;树也可以转换成数组&#x…

吗咿呀嘿-用js来搞个简单的人脸识别

缘起 “蚂蚁呀嘿&#xff0c;蚂蚁呀呼&#xff0c;蚂蚁呀哈” 相信最近好多人的朋友圈或者抖音都被类似视频刷过屏&#xff01; 类似的效果最早是在2020年初&#xff0c;那个时候大家应该还都记得&#xff0c;几乎所有的人都因为疫情原因被迫线上办公&#xff01; 工作当然离不…

mybatisPlus

第十一章&#xff1a;Mybatis_plus 第1节&#xff1a;简介 本章节主要介绍mybatisPlus是mybatis的增强工具&#xff0c;只做增强不做改变&#xff0c;不会对mybatis产生任何影响。它的主要优势具有无侵入、损耗小、强大的CRUD操作、支持 Lambda 形式调用、支持 ActiveRecord模…

向毕业妥协系列之机器学习笔记:无监督学习-异常检测

目录 一.发现异常事件 二.高斯正态分布 三.异常检测算法 四.开发与评估异常检测系统 五.异常检测与监督学习对比 六.选择使用什么特征 一.发现异常事件 下图的例子是飞机发动机的制造&#xff0c;有很多特征&#xff0c;我们为了方便讲解取其中的两个特征&#xff1a;发…

基于JavaWeb的小区物业管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

(1)paddle---在anaconda中安装paddle环境

1、 创建一个anaconda的环境 (1)创建 conda create --name chenpaddle_cp310 python=3.10 如果要删除 conda remove -n chenpaddle_cp310 --all (2)查看现有环境 conda env list #查看现有环境 2、安装 paddlepaddle (1)查看自己安装的cuda版本 nvidia-smi 发现…

java计算机毕业设计ssm+vue工商学院办公用品管理信息系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

Linux内存管理知识总结(一)

以下源代码来自 linux-5.10.3 内核代码&#xff0c;主要以 x86-32 为例 Linux 内存管理是一个很复杂的“工程”&#xff0c;它不仅仅是对物理内存的管理&#xff0c;也涉及到虚拟内存管理、内存交换和内存回收等 物理内存的探测 Linux 内核通过 detect_memory()函数实现对物…

2021年认证杯SPSSPRO杯数学建模B题(第一阶段)依巴谷星表中的毕星团求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 B题 依巴谷星表中的毕星团 原题再现&#xff1a; 依巴谷卫星&#xff08;High Precision Parallax Collecting Satellite&#xff0c;缩写为 Hip-parcos&#xff09;&#xff0c;全称为“依巴谷高精度视差测量卫星”&#xff0c;是欧洲空间局发…

Java培训:重试实现高可用方案

1、背景介绍 随着互联网的发展项目中的业务功能越来越复杂&#xff0c;有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素。在测试阶段可能没有什么异常情况&#xff0c;但上…