• java的Excel导出方式总结


    一、使用hutool导出excel

       1.1 hutool介绍

            hutool功能很强大,http请求到json处理、excel的导入导出、定时任务、IO、缓存、数据库操作等都提供了简单而方便的api供我们使用,好处是再也不用担心自己去整理常用的工具类了,同时也支持按需引入【但一般项目都是直接一如hutool-all 导致项目引入很多不必要的工具类】。

           从2014年首次发布第一版本到现在已经8年了,这款国产工具类确实收获了越来越多的关注,而且社区的热度是可以的,但是比起Apache或者谷歌提供的工具类,更新频率和可靠性也许稍差,但在我看来是可以考虑使用的。

       1.2 编写代码导出excel【仅表头】

     我们要的效果:

         

     所需编写的代码:

    1. @GetMapping("/exportTemplate")
    2. public void exportTemplate(HttpServletResponse response) throws IOException {
    3. String column1Name1 = "时间戳";
    4. String column1Name2 = "设备名称";
    5. List headList = new ArrayList<>();
    6. headList.add(column1Name1);
    7. headList.add(column1Name2);
    8. //在内存操作,写到浏览器
    9. ExcelWriter writer= ExcelUtil.getWriter(true);
    10. // 设置表头的宽度
    11. writer.setColumnWidth(0, 20);
    12. writer.setColumnWidth(1, 15);
    13. writer.writeHeadRow(headList).write(Collections.emptyList());
    14. //设置content—type
    15. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
    16. //Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。
    17. response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("数据集导入模板","UTF-8")+".xlsx");
    18. ServletOutputStream outputStream= response.getOutputStream();
    19. //将Writer刷新到OutPut
    20. writer.flush(outputStream,true);
    21. outputStream.close();
    22. writer.close();
    23. }

    1.3 编写代码导出excel【含内容】

        

     我们要的效果:

         

     所需编写的代码:

    1. @GetMapping("/exportTemplate")
    2. public void exportTemplate(HttpServletResponse response) throws IOException {
    3. String column1Name1 = "时间戳";
    4. String column1Name2 = "设备名称";
    5. List headList = new ArrayList<>();
    6. headList.add(column1Name1);
    7. headList.add(column1Name2);
    8. //在内存操作,写到浏览器
    9. ExcelWriter writer= ExcelUtil.getWriter(true);
    10. // 设置表头的宽度
    11. writer.setColumnWidth(0, 20);
    12. writer.addHeaderAlias("timestamp",column1Name1);
    13. writer.setColumnWidth(1, 15);
    14. writer.addHeaderAlias("deviceName",column1Name2);
    15. // 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之
    16. writer.setOnlyAlias(true);
    17. // 表格内容【相比上一节新内容】
    18. List excelList = new ArrayList<>();
    19. CollectDataExcelVo vo1 = new CollectDataExcelVo();
    20. vo1.setDeviceName("A类设备");
    21. vo1.setTimestamp(DateUtil.format(new Date()));
    22. excelList.add(vo1);
    23. CollectDataExcelVo vo2 = new CollectDataExcelVo();
    24. vo2.setDeviceName("B类设备");
    25. vo2.setTimestamp(DateUtil.format(new Date()));
    26. excelList.add(vo2);
    27. writer.writeHeadRow(headList).write(excelList);
    28. //设置content—type
    29. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
    30. //Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。
    31. response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("数据集导入模板","UTF-8")+".xlsx");
    32. ServletOutputStream outputStream= response.getOutputStream();
    33. //将Writer刷新到OutPut
    34. writer.flush(outputStream,true);
    35. outputStream.close();
    36. writer.close();
    37. }
    1. @Data
    2. public class CollectDataExcelVo {
    3. /**
    4. * 时间戳
    5. */
    6. @ApiModelProperty(value = "时间戳")
    7. private String timestamp;
    8. /**
    9. * 设备编码
    10. */
    11. @ApiModelProperty(value = "设备名称")
    12. private String deviceName;
    13. }

     1.4 编写代码导出excel【导出下拉列表】

     我们要的效果:

         

     所需编写的代码:

    1. @GetMapping("/exportTemplate")
    2. public void exportTemplate(HttpServletResponse response) throws IOException {
    3. String column1Name1 = "时间戳";
    4. String column1Name2 = "设备名称";
    5. List headList = new ArrayList<>();
    6. headList.add(column1Name1);
    7. headList.add(column1Name2);
    8. //在内存操作,写到浏览器
    9. ExcelWriter writer= ExcelUtil.getWriter(true);
    10. // 设置表头的宽度
    11. writer.setColumnWidth(0, 20);
    12. writer.addHeaderAlias("timestamp",column1Name1);
    13. writer.setColumnWidth(1, 15);
    14. writer.addHeaderAlias("deviceName",column1Name2);
    15. // 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之
    16. writer.setOnlyAlias(true);
    17. // 表格下拉框【相比上一节新内容】
    18. writer.addSelect(1, 1, new String[]{"1#进线","2#进线", "3#进线"});
    19. writer.writeHeadRow(headList).write(Collections.emptyList());
    20. //设置content—type
    21. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
    22. //Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。
    23. response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("数据集导入模板","UTF-8")+".xlsx");
    24. ServletOutputStream outputStream= response.getOutputStream();
    25. //将Writer刷新到OutPut
    26. writer.flush(outputStream,true);
    27. outputStream.close();
    28. writer.close();
    29. }

    二、使用easyexcel导出excel

    2.1 easyexcel介绍

            EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称;能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

       2.2 编写代码导出excel

     我们要的效果:

      

     所需编写的代码:

    pom引入依赖:

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>easyexcelartifactId>
    4. <version>3.0.5version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.poigroupId>
    8. <artifactId>poi-ooxmlartifactId>
    9. <version>4.1.2version>
    10. dependency>

    java代码:

    1. import com.alibaba.excel.annotation.ExcelProperty;
    2. import com.alibaba.excel.annotation.write.style.ColumnWidth;
    3. import io.swagger.annotations.ApiModelProperty;
    4. import lombok.Data;
    5. @Data
    6. public class CollectDataExcelVo {
    7. /**
    8. * 时间戳
    9. */
    10. @ExcelProperty(value = "时间戳", index = 0)
    11. @ColumnWidth(value = 20)
    12. @ApiModelProperty(value = "时间戳")
    13. private String timestamp;
    14. /**
    15. * 设备名称
    16. */
    17. @ExcelProperty(value = "设备名称", index = 1)
    18. @ColumnWidth(value = 15)
    19. @ApiModelProperty(value = "设备名称")
    20. private String deviceName;
    21. }
    1. @GetMapping("/exportTemplate")
    2. public void exportTemplate(HttpServletResponse response) throws IOException {
    3. // 模拟数据库获取数据
    4. List list = data();
    5. response.setCharacterEncoding(StandardCharsets.UTF_8.name());
    6. response.setHeader("content-Type", "application/vnd.ms-excel");
    7. response.setHeader("Content-Disposition",
    8. "attachment;filename=" + URLEncoder.encode("template"+ DateUtils.format(new Date(), "yyyy-MM-dd")+".xlsx", StandardCharsets.UTF_8.name()));
    9. EasyExcel.write(response.getOutputStream(), CollectDataExcelVo.class).sheet().doWrite(list);
    10. }
    11. private List data() {
    12. List list = ListUtils.newArrayList();
    13. for (int i = 1; i <= 2; i++) {
    14. CollectDataExcelVo data = new CollectDataExcelVo();
    15. data.setTimestamp(DateUtil.format(new Date()));
    16. data.setDeviceName("A类设备"+i);
    17. list.add(data);
    18. }
    19. return list;
    20. }

    三、从项目resources目录导出excel

    3.1 将文件放入项目路径下

           

    3.2 将文件导出

          将文件从项目工程的 resources/file 目录下导出,所需代码如下:

    1. import org.apache.poi.util.IOUtils;
    2. @GetMapping("/exportTemplate")
    3. public void exportTemplate(HttpServletResponse response) {
    4. InputStream inputStream = null;
    5. OutputStream outputStream = null;
    6. try {
    7. String fileName= URLEncoder.encode("template","UTF-8");
    8. outputStream = response.getOutputStream();
    9. // 获取springboot resource 路径下的文件
    10. inputStream = this.getClass().getResourceAsStream("/file/template.xlsx");
    11. response.setContentType("application/vnd.ms-excel");
    12. response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
    13. IOUtils.copy(inputStream, outputStream);
    14. } catch (Exception e) {
    15. throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, e.toString());
    16. } finally {
    17. closeInput(inputStream);
    18. flushOutput(outputStream);
    19. }
    20. }
    21. private void flushOutput(OutputStream outputStream) {
    22. try {
    23. outputStream.flush();
    24. } catch (IOException e) {
    25. logger.error("释放流异常", e);
    26. }
    27. }
    28. private void closeInput(InputStream inputStream) {
    29. try {
    30. inputStream.close();
    31. } catch (IOException e) {
    32. logger.error("释放流异常", e);
    33. }
    34. }

       导出后会存在问题 excel文件导出后打不开!! 只需再pom.xml中配置如下即可:

    1. <plugins>
    2. <plugin>
    3. <groupId>org.apache.maven.pluginsgroupId>
    4. <artifactId>maven-resources-pluginartifactId>
    5. <configuration>
    6. <encoding>UTF-8encoding>
    7. <nonFilteredFileExtensions>
    8. <nonFilteredFileExtension>xlsnonFilteredFileExtension>
    9. <nonFilteredFileExtension>xlsxnonFilteredFileExtension>
    10. nonFilteredFileExtensions>
    11. configuration>
    12. plugin>
    13. plugins>

    四、使用easypoi 导出excel

    4.1 easypoi 介绍

            easypoi 也是国产开源的软件,它通过简单的注解和模板语言 (熟悉的表达式语法),就可以实现excel的导入导出功能。

       4.2 编写代码导出excel

     我们要的效果:

      

     所需编写的代码:

    pom引入依赖:

    1. cn.afterturn
    2. easypoi-base
    3. 4.1.0
    4. cn.afterturn
    5. easypoi-web
    6. 4.1.0
    7. cn.afterturn
    8. easypoi-annotation
    9. 4.1.0

    java代码:

    1. // 工具类
    2. public class ExcelUtil {
    3. public static void exportExcel(List list, Class pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
    4. ExportParams exportParams = new ExportParams();
    5. exportParams.setCreateHeadRows(isCreateHeader);
    6. Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
    7. if (workbook != null) ;
    8. try {
    9. response.setCharacterEncoding("UTF-8");
    10. response.setHeader("content-Type", "application/vnd.ms-excel");
    11. response.setHeader("Content-Disposition",
    12. "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
    13. workbook.write(response.getOutputStream());
    14. } catch (IOException e) {
    15. try {
    16. throw new Exception(e.getMessage());
    17. } catch (Exception e1) {
    18. e1.printStackTrace();
    19. }
    20. }
    21. }
    22. }
    1. import cn.afterturn.easypoi.excel.annotation.Excel;
    2. import lombok.Data;
    3. import java.util.Date;
    4. @Data
    5. public class CollectDataExcelVo {
    6. /**
    7. * 时间戳
    8. */
    9. @Excel(name = "时间戳",format="yyyy-MM-dd HH:mm:ss", width = 20.0)
    10. private Date timestamp;
    11. /**
    12. * 设备编码
    13. */
    14. @Excel(name = "设备名称", width = 20)
    15. private String deviceName;
    16. }
    1. @GetMapping("/export")
    2. @ApiOperation("导出数据")
    3. public void export(HttpServletResponse response) {
    4. String fileName = "template"+".xls";
    5. List list = data();
    6. ExcelUtil.exportExcel(list, CollectDataExcelVo.class, fileName, true, response);
    7. }

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

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

  • 相关阅读:
    记录一次紧急的版本切换
    java毕业设计滁州市的围棋协会网站Mybatis+系统+数据库+调试部署
    一看就懂:正则表达式
    堆 Heap & 栈 Stack(.Net)【概念解析系列_3】【C# 基础】
    二分查找——经典题目合集
    无法将RELEASE.pom上传到nexus的解决办法
    “加密上海·喜玛拉雅Web3.0数字艺术大展”落幕,AIGC和数字艺术衍生品是最大赢家?...
    滚雪球学Java(40):解读Java面向对象编程中的方法和继承,打造可维护的代码库
    TDengine 入门教程——导读
    saas多用户小程序商城源码
  • 原文地址:https://blog.csdn.net/zjq852533445/article/details/127846991