【文件导出2】导出html文件数据

导出html文件数据

文章目录

  • 导出html文件数据
  • 前言
  • 一、实现代码
    • 1.controller层
    • 2.接口层
    • 3.接口实现类
    • 4.FileUtil 工具类
  • 二、文件导出效果
  • 总结


前言

springBoot项目实现在线导出html文件数据的功能。


一、实现代码

1.controller层

@GetMapping("/record/_export")
@ApiOperation("查询记录导出")
public void recordExport(HttpServletResponse response, RecordSearchRequest query) throws IOException {ruleVerifyResultService.recordExport(response, query);}

RecordSearchRequest为请求查询条件,根据条件导出对应的记录。

2.接口层

public interface ResultService extends IService<RuleVerifyResultEntity> {/*** 记录导出* @param query* @return*/void recordExport(HttpServletResponse response, RecordSearchRequest query) throws IOException;
}

3.接口实现类

@Override
public void queryRecordExport(HttpServletResponse response, RuleVerifyRecordSearchRequest query) throws IOException {LocalDateTime startExecuteTime = null;LocalDateTime endExecuteTime = null;//设置导出文件名称String fileName = "检验记录列表数据";if (ObjectUtils.isNotEmpty(query.getExecuteStartTime())) {startExecuteTime = query.getExecuteStartTime().atStartOfDay();endExecuteTime = query.getExecuteStartTime().atTime(23, 59, 59);}//查询需要导出的数据,用list集合接收List<RuleVerifyRecordEntity> recordList = ruleVerifyRecordMapper.selectList(Wrappers.<RuleVerifyRecordEntity>lambdaQuery().// 关键字搜索and(StringUtils.isNotEmpty(query.getKeywords()), wrapper -> wrapper.like(RuleVerifyRecordEntity::getTableName, query.getKeywords()).or().like(RuleVerifyRecordEntity::getTableRemark, query.getKeywords()).or().like(RuleVerifyRecordEntity::getDatasourceName, query.getKeywords()))orderByDesc(RuleVerifyRecordEntity::getExecuteStartTime));//2.导出html数据if (ObjectUtils.equals(ExportTypeEnum.HTML.getValue(), query.getExportType())) {//构建文件信息StringBuilder table = this.buildTableInfo(recordList);InputStream inputStream = null;FileInputStream fileInputStream = null;ServletOutputStream outputStream = null;try {//string字符串转输入流inputStream = FileUtil.getInputStream(table.toString());//字节输入流转文件输入流fileInputStream = FileUtil.convertToFileInputStream(inputStream);//给浏览器设置响应头:Content-Disposition告诉浏览器以附件的形式打开这个文件response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".html", "UTF-8"));//给浏览器设置响应头:文件类型response.setContentType("application/octet-stream;charset=utf-8");//从response中获取输出流outputStream = response.getOutputStream();//进行流拷贝操作FileUtil.copyStream(fileInputStream, outputStream);outputStream.flush();} catch (IOException e) {log.error(e.getMessage());e.printStackTrace();} finally {//关闭资源文件try{inputStream.close();fileInputStream.close();outputStream.close();}catch(Exception e){e.printStackTrace();}}}private StringBuilder buildTableInfo(List<RuleVerifyRecordEntity> recordList){StringBuilder table = new StringBuilder();// 添加table标签table.append("<table>\n");// 生成表头table.append("<tr>\n");table.append("<th>" + "表名称" + "</th>");table.append("<th>" + "规则异常" + "</th>");table.append("<th>" + "执行状态" + "</th>");table.append("<th>" + "调度信息" + "</th>");table.append("<th>" + "开始时间" + "</th>");table.append("<th>" + " " + "</th>\n");table.append("<th>" + "结束时间" + "</th>");table.append("</tr>\n");// 生成HTML表格// 生成表格数据for (RuleVerifyRecordEntity row : recordList) {table.append("<tr>\n");table.append("<td>" + row.getTableName() + "</td>\n");table.append("<td>" + row.getRuleCount()) + "</td>\n");table.append("<td>" + (ObjectUtils.isNotEmpty(row.getExecuteStatus()) ? row.getExecuteStatus().toString() : null) + "</td>\n");table.append("<td>" + row.getSchedulerInfo() + " " + "</td>\n");table.append("<td>" + DateTimeUtil.toDateTimeStr(ObjectUtils.isNotEmpty(row.getExecuteStatus()) ? row.getExecuteStartTime() : LocalDateTime.now()) + "</td>\n");table.append("<td>" + " " + "</td>\n");table.append("<td>" + DateTimeUtil.toDateTimeStr(ObjectUtils.isNotEmpty(row.getExecuteEndTime()) ? row.getExecuteEndTime() : LocalDateTime.now()) + "</td>\n");table.append("</tr>\n");}table.append("</table>");return table;}
}

4.FileUtil 工具类


import javax.servlet.ServletOutputStream;
import java.io.*;
import java.nio.charset.StandardCharsets;public class FileUtil {//string字符串转输入流public static InputStream getInputStream(String str) {if (str != null && !"".equals(str.trim())) {try {ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));return inputStream;} catch (Exception e) {e.printStackTrace();}}return null;}//字节输入流转文件输入流public static FileInputStream convertToFileInputStream(InputStream inputStream) throws IOException {File tempFile = File.createTempFile("temp", ".tmp");tempFile.deleteOnExit();try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}return new FileInputStream(tempFile);}//数据写入输出流public static void copyStream(FileInputStream fileInputStream, ServletOutputStream outputStream) throws IOException {int len = 0;byte[] arr = new byte[1024];while ((len = fileInputStream.read(arr)) != -1) {outputStream.write(arr, 0, len);}}
}

二、文件导出效果

在这里插入图片描述


总结

本次实现了html文件的导出功能,下节接着实现xml文件的导出功能。

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

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

相关文章

.NET4.8安装失败解决办法

在windows 2008 r2 安装.net 4.8 &#xff0c;一开始下载 .net 4.8 的web 安装包&#xff0c;链接如下&#xff1a; https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/9b7b8746971ed51a1770ae4293618187/ndp48-web.exe 安装过…

Flutter中同步与异步

一&#xff0c;同步/异步的理解 1&#xff0c;await&#xff1a;同步机制 同步操作会阻止其他操作执行&#xff0c;直到完成为止。同步就好比打电话一样&#xff0c;打电话时都是一个人在说另一个人听&#xff0c;一个人在说的时候另一个人等待&#xff0c;等另一个人说完后再…

【Git】远程操作 -- 详解

一、理解分布式版本控制系统 我们目前所说的所有内容&#xff08;工作区、暂存区、版本库等等&#xff09;都是在本地&#xff0c;也就是在我们的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统。 上面这段话是什么意思呢&#xff1f; 可以简单理解为&#xff1…

java算法篇之二分查找的公共函数

Arrays.binarySearch 方法的底层实现是使用经过优化的二分查找算法。以下是大致的二分查找算法实现步骤&#xff1a; 首先&#xff0c;确定搜索范围的起始索引 low 和结束索引 high&#xff0c;它们分别初始化为数组的起始位置和结束位置。在每一轮循环中&#xff0c;计算中间…

node-mysql中占位符?的使用

要mysql执行的命令串如果是固定的&#xff0c;那么不需要使用占位符&#xff0c;如果其中的一些参数允许在执行前可自由设定&#xff0c;那么使用占位符就很必要&#xff0c;这样你可以不需要由自己来拼接出一个完整的执行串&#xff0c;只需要在执行串模板上将占位符的参数设置…

新型数据库技术一览

新型数据库技术是信息技术领域中不断发展和创新的一部分&#xff0c;它们旨在解决传统数据库系统面临的挑战&#xff0c;如大数据量的处理、实时分析、云服务集成、数据安全性和多模型支持等。以下是一些当前备受关注的新型数据库技术&#xff1a; NoSQL数据库&#xff1a; 非…

USB (2)

USB transaction 以2.0的枚举过程为例。 首先是TOKEN TRANSACTION&#xff0c;其次是DATA TRANSACTION&#xff0c;再次是Handshake Transaction。 上面的SETUP TRANSACTION是TOKEN TRANSACTION的一种。另外三种是OUT, IN, SOF。 在每个TRANSACTION中又包含了3个STAGE&#x…

在Windows中安装MinGW-w64

在Windows中安装MinGW-w64 总共两步&#xff1a; 下载mingw文件&#xff0c;官网较慢&#xff0c;有国内镜像解压下载的文件&#xff0c;放到想要安装的位置&#xff0c;然后在环境变量里面新建一个值&#xff0c;添加/bin目录 以前安装mingw是可以直接下载一个.exe安装文件…

如何在恢复出厂设置后从 Android 恢复照片

在某些情况下&#xff0c;您可能会考虑将 Android 设备恢复出厂设置。需要注意的是&#xff0c;恢复出厂设置后&#xff0c;所有设置、用户数据甚至应用程序数据都将被清除。因此&#xff0c;如果您将 Android 设备恢复出厂设置&#xff0c;甚至在里面留下了一些珍贵的照片&…

Debian13将正式切换到基于内存的临时文件系统

以前的内存很小&#xff0c;旅行者一号上的计算机内存只有68KB&#xff0c;现在的内存可以几十G&#xff0c;上百G足够把系统全部装载在内存里运行&#xff0c;获得优异的性能和极速响应体验。 很多小型系统能做到这一点&#xff0c;Linux没有那么激进&#xff0c;不过Debian …

java判断对象是否还在被引用

1、代码取消强引用后&#xff0c;gc回收对象 public static void main(String[] args) {Object obj new Object();WeakReference<Object> weakRef new WeakReference<>(obj);System.out.println(weakRef.get());obj null; // 取消强引用,后续gc会被回收,如果不…

1.基于-LABVIEW的自动售卖机开发(前面板)

1.项目简介 随着科技的进步和人们生活节奏的加快&#xff0c;自动售卖机在日常生活中扮演着越来越重要的角色。它们不仅提高了商品购买的便捷性&#xff0c;还节省了人力成本。为了实现更加智能化和高效的售卖服务&#xff0c;本项目旨在开发一款基于LabVIEW平台的自动售卖机系…

SpringBoot+Vue免税商品优选购物商城(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户商家 功能截图

Mysql学习(六)——函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 三、函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 三、函数 函数是指一段可以直接被另一段程序调用的程序或代码。 3.1 字符串函数 MySQL中内置了很…

论文浅尝 | THINK-ON-GRAPH:基于知识图谱的深层次且可靠的大语言模型推理方法...

笔记整理&#xff1a;刘佳俊&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2307.07697.pdf 1. 动机 本文是IDEA研究院的工作&#xff0c;这篇工作将知识图谱的和大语言模型推理进行了结合&#xff0c;在每一步图推理中利用大…

Y2期末测试

目录 总结&#xff1a;题目1.划分区间2.序列操作题目描述&#xff1a;题解&#xff1a;代码&#xff1a; 3.划分区间题目描述&#xff1a;题解&#xff1a;代码&#xff1a; 4.数字匹配题目描述&#xff1a;题解&#xff1a;代码&#xff1a; 总结&#xff1a; 本次模拟未达到…

[图解]建模相关的基础知识-06

1 00:00:00,790 --> 00:00:03,480 下一个概念&#xff0c;就是基数的概念 2 00:00:04,390 --> 00:00:11,560 cardinality&#xff0c;表示有限集合中元素的数量 3 00:00:12,200 --> 00:00:14,790 我们可以用一个井号 4 00:00:14,800 --> 00:00:18,320 在前面表示…

数据结构--递归和数组

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

10.邮票问题

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/625 题目描述 有四种面值的邮票,分别是 …

使用 Django 创建 App

文章目录 步骤 1&#xff1a;创建 Django 项目步骤 2&#xff1a;创建 App步骤 3&#xff1a;配置 App步骤 4&#xff1a;编写代码步骤 5&#xff1a;运行服务器 在 Django 中&#xff0c;App 是组织代码的基本单元&#xff0c;它可以包含模型、视图、模板等组件&#xff0c;帮…