当前位置: 首页 > news >正文

【文件导出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文件的导出功能。

相关文章:

  • C# 绘图及古诗填字
  • Android基础-进程间通信
  • 熟悉的软件架构风格及详细介绍
  • 自动驾驶人工智能
  • 【深度学习】之 卷积(Convolution2D)、最大池化(Max Pooling)和 Dropout 的NumPy实现
  • arm系统中双网卡共存问题
  • 区块链共识机制技术一--POW(工作量证明)共识机制
  • Transformer论文精读
  • App UI 风格,引领时尚
  • 无头+单向+非循环链表的实现
  • web学习笔记(六十五)
  • Recognize Anything: A Strong Image Tagging Model(RAM模型使用方法)
  • 各品牌电视安装第三方软件失败的解决方法
  • 理解数仓建模
  • 移动安全赋能化工能源行业智慧转型
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译]如何构建服务器端web组件,为何要构建?
  • CentOS6 编译安装 redis-3.2.3
  • Javascripit类型转换比较那点事儿,双等号(==)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 离散点最小(凸)包围边界查找
  • 普通函数和构造函数的区别
  • 网络应用优化——时延与带宽
  • 由插件封装引出的一丢丢思考
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 仓管云——企业云erp功能有哪些?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (Forward) Music Player: From UI Proposal to Code
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (译) 函数式 JS #1:简介
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET 服务 ServiceController
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net连接oracle数据库
  • .NET面试题(二)
  • .net专家(张羿专栏)
  • .sh 的运行
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [BetterExplained]书写是为了更好的思考(转载)
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [CC-FNCS]Chef and Churu
  • [Docker]五.Docker中Dockerfile详解
  • [exgcd] Jzoj P1158 荒岛野人
  • [Flex][问题笔记]TextArea滚动条问题
  • [Git].gitignore失效的原因
  • [Hibernate] - Fetching strategies
  • [LeetCode] NO. 387 First Unique Character in a String
  • [Manacher]【学习笔记】