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

模版下载和Excel文件导入

模版下载

  • 模版下载

模版下载

/*** 生成模版** @param* @return AppResponse*/public AppResponse ExcelFile() throws IOException {// 创建一个新的Excel工作簿Workbook workbook = new XSSFWorkbook();// 创建一个工作表Sheet sheet = workbook.createSheet("页面拨测模板");// 创建行并设置单元格值Row headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("序号");headerRow.createCell(1).setCellValue("拨测地址");headerRow.createCell(2).setCellValue("正常状态码");headerRow.createCell(3).setCellValue("页面大小(KB)");headerRow.createCell(4).setCellValue("加载时间(S)");// 设置列宽sheet.setColumnWidth(0, 5000);sheet.setColumnWidth(1, 5000);sheet.setColumnWidth(2, 5000);sheet.setColumnWidth(3, 5000);sheet.setColumnWidth(4, 5000);FileOutputStream outputStream = null;//获取字典项 存储路径//TODO 数据库配置String path = dialDictDataService.getValue(DictConstants.MODEL_FILE);// 保存Excel文件try {outputStream = new FileOutputStream(path + "pageTemplate.xlsx");workbook.write(outputStream);logger.info("DialPageTaskComponent.downloadExcelFile-----------Excel模板生成成功");} catch (IOException e) {e.printStackTrace();logger.info("DialPageTaskComponent.downloadExcelFile-----------Excel模板生成失败");return AppResponse.failed("生成模版失败");} finally {IOUtils.closeQuietly(outputStream);}return AppResponse.ok();}
/*** 下载模版* @param response*/public void downloadPageTemplate(HttpServletResponse response) {OutputStream out = null;InputStream in = null;ByteArrayOutputStream bos = null;String fileName = "pageTemplate导入模版";try {// 读取模板Resource res = new ClassPathResource("pageTemplate.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(res.getInputStream());// 转换为字节流bos = new ByteArrayOutputStream();workbook.write(bos);byte[] barray = bos.toByteArray();in = new ByteArrayInputStream(barray);response.reset();response.setContentType("application/octet-stream");response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");out = response.getOutputStream();byte[] b = new byte[1024];int len;while ((len = in.read(b)) > 0) {out.write(b, 0, len);}out.flush();} catch (Exception e) {logger.error("DialPageTaskComponent.downloadPageTemplate, 下载模板失败", e);} finally {if (null != in) {try {in.close();} catch (IOException e) {logger.error("DialPageTaskComponent.downloadPageTemplate, 关闭资源异常", e);}in = null;}if (null != out) {try {out.close();} catch (IOException e) {logger.error("DialPageTaskComponent.downloadPageTemplate, 关闭资源异常", e);}out = null;}if (null != bos) {try {bos.flush();bos.close();} catch (IOException e) {logger.error("DialPageTaskComponent.downloadPageTemplate, 关闭资源异常", e);}out = null;}}}/*** 导入数据** @param file* @return*/public AppResponse<List<DialPageAddressResponseDTO>> importDial(MultipartFile file) {// 获取文件全名(包含扩展名)String excelName = file.getOriginalFilename();// 上传文件名格式校验if (!".xlsx".equals(excelName.substring(excelName.lastIndexOf(".")))) {logger.info("DialPageTaskComponent.importDial, 导入失败,请导入excel文件格式, {}", excelName);return AppResponse.failed("导入失败,请导入正确的excel文件格式!");}List<DialPageAddressResponseDTO> resultData = null;try {ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream()).setIgnoreEmptyRow(false);if (excelReader.getSheets().size() != 1) {return AppResponse.failed("导入失败,excel内容不标准!");}// 校验excel是否含有图片Workbook workbook = new XSSFWorkbook(file.getInputStream());Map<String, PictureData> picMap = ExcelPicUtil.getPicMap(workbook, 0);if (CollectionUtil.isNotEmpty(picMap)) {return AppResponse.failed("导入失败,excel内容不标准!");}List<List<Object>> read = excelReader.read(0);// 校验excel题头AppResponse<Object> checkTitleAppResponse = checkTitle(read);if (!checkTitleAppResponse.isOk()) {logger.info("DialPageTaskComponent.importDial, 数据校验失败, data={}", checkTitleAppResponse);return AppResponse.failed(checkTitleAppResponse.getMsg());}resultData = this.handleData(read);} catch (Throwable e) {logger.error("DialPageTaskComponent.importDial, 读取文件失败", e);return AppResponse.failed("导入失败,excel读取异常!");}return AppResponse.ok(resultData);}/*** 校验表头** @param read* @return AppResponse<Object>*/private AppResponse<Object> checkTitle(List<List<Object>> read) {if (CollectionUtil.isEmpty(read) || CollectionUtil.size(read) < 4) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel内容不可为空, resultData={}", read);return AppResponse.failed("导入失败,excel内容不可为空!");}if (StringUtils.isBlank(String.valueOf(read.get(0).get(0)))) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel内容不可为空, read={}", read);return AppResponse.failed("DialPageTaskComponent.checkTitle, 导入失败,excel内容不可为空!");}List<Object> secondRow = read.get(1);if (CollectionUtil.isEmpty(secondRow)) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel内容不可为空, read={}", read);return AppResponse.failed("导入失败,excel内容不可为空!");}if (secondRow.size() != 4) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel表头不正确, secondRow={}", secondRow.size());return AppResponse.failed("导入失败,excel表头不正确!");}if (!"拨测地址".equals(String.valueOf(secondRow.get(0)))) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel表头不正确-拨测地址, dialAddress={}", secondRow.get(0));return AppResponse.failed("导入失败,excel表头不正确!" + String.valueOf(secondRow.get(0)));}if (!"正常响应码".equals(String.valueOf(secondRow.get(1)))) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel表头不正确-正常响应码, normalStatusCode={}", secondRow.get(1));return AppResponse.failed("导入失败,excel表头不正确!" + String.valueOf(secondRow.get(1)));}if (!"页面大小".equals(String.valueOf(secondRow.get(2)))) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel表头不正确-页面大小, responseTime={}", secondRow.get(2));return AppResponse.failed("导入失败,excel表头不正确!" + String.valueOf(secondRow.get(2)));}if (!"加载时间".equals(String.valueOf(secondRow.get(3)))) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,excel表头不正确-加载时间, responseTime={}", secondRow.get(3));return AppResponse.failed("导入失败,excel表头不正确!" + String.valueOf(secondRow.get(2)));}// 导入数据为空校验AppResponse<Object> checkDataIsEmptyappResponse = checkDataIsEmpty(read);if (!checkDataIsEmptyappResponse.isOk()) {logger.info("DialPageTaskComponent.checkTitle, 导入失败,内容填写不完整, responseData={}", checkDataIsEmptyappResponse);return AppResponse.failed(checkDataIsEmptyappResponse.getMsg());}return AppResponse.ok();}/*** 校验数据是否为空** @param read* @return*/private AppResponse<Object> checkDataIsEmpty(List<List<Object>> read) {// 去除最后的空行removeLastEmptyRow(read);StringBuffer message = new StringBuffer();StringBuffer emptyRowMsg = new StringBuffer();for (int i = 2; i < read.size(); i++) {if (read.get(i).size() == 0) {logger.info("DialPageTaskComponent.checkDataIsEmpty, 导入失败,数据单元格不能为空,{}", read.get(i).toString());emptyRowMsg.append("第").append(i - 1).append("行数据内容为空!").append("</br>");}if (read.get(i).size() < 4) {message.append("第").append(i - 1).append("行,内容填写不完整!" + String.valueOf(read.get(i)).replace("null", "")).append("</br>");}for (int j = 0; j < read.get(i).size(); j++) {if (StringUtils.equalsIgnoreCase(String.valueOf(read.get(i).get(j)), "null")) {message.append("第").append(i - 1).append("行,第" + (j + 1) + "个单元格内容填写不完整!" + String.valueOf(read.get(i).get(j)).replace("null", "")).append("</br>");}}}if (StringUtils.isNotEmpty(emptyRowMsg.toString())) {return AppResponse.failed(emptyRowMsg.toString());}if (StringUtils.isNotEmpty(message.toString())) {return AppResponse.failed(message.toString());}return AppResponse.ok();}/*** 去除最后的空行** @param read*/public void removeLastEmptyRow(List<List<Object>> read) {for (int i = read.size() - 1; i >= 0; i--) {if (CollectionUtil.isNotEmpty(read.get(i))) {break;}read.remove(i);}}/*** 处理数据** @param read 参数* @return List<WhiteList> 返回*/public List<DialPageAddressResponseDTO> handleData(List<List<Object>> read) {List<DialPageAddressResponseDTO> resultData = new ArrayList<>();for (int i = 2; i < read.size(); i++) {DialPageAddressResponseDTO dialPageAddress = new DialPageAddressResponseDTO();dialPageAddress.setDialAddress(String.valueOf(read.get(i).get(0)).replace("null", ""));dialPageAddress.setNormalStatusCode(String.valueOf(read.get(i).get(1)).replace("null", ""));dialPageAddress.setPageSize(Integer.valueOf(String.valueOf(read.get(i).get(2)).replace("null", "")));dialPageAddress.setLoadTime(Integer.valueOf(String.valueOf(read.get(i).get(3)).replace("null", "")));resultData.add(dialPageAddress);}return resultData;}

相关文章:

模版下载和Excel文件导入

模版下载 模版下载 模版下载 /*** 生成模版** param* return AppResponse*/public AppResponse ExcelFile() throws IOException {// 创建一个新的Excel工作簿Workbook workbook new XSSFWorkbook();// 创建一个工作表Sheet sheet workbook.createSheet("页面拨测模板&…...

Datax 数据同步-使用总结(一)

1&#xff0c;实时同步&#xff1f; datax 通常做离线数据同步使用。 目前能想到的方案 利用 linux 的定时任务时间戳的方式做增量同步。 2&#xff0c;同步速度快不快&#xff1f; 单表同步速度还是挺快的 但是如果遇到复杂的 sql 查询&#xff0c;其同步效率&#xff0c…...

代码随想录算法训练营第九天| 232.用栈实现队列,225.用队列实现栈

232. 用栈实现队列 232.用栈实现队列 这里用两个栈来模拟队列以此实现队列的先进先出&#xff0c; 注意点 1.dump()方法将stackin的元素移入到stackout的操作&#xff0c;是要将stackin的全部元素放到stackout中&#xff0c;所以用while循环判断 stackIn是否为空 2.新建栈…...

求解二次方程

描述 编写一个程序&#xff0c;实现求解形如ax^2 bx c 0的二次方程的根。要求使用三个函数分别计算b^2 - 4ac大于0、等于0和小于0时的根&#xff0c;并在主函数中输出结果。 输入 输入三个浮点数a、b和c&#xff0c;分别表示二次方程的系数。 输出 输出二次方程的根&am…...

【hive 运维】hive注释/数据支持中文

文章目录 一. 设置mysql中的hive库二. hive-site.xml 设置三. 测试 hive支持中文需要关注两个方面&#xff1a; 设置hive 元数据库中的一些表设置hive-site.xml. 一. 设置mysql中的hive库 use hivedb; alter table TBLS modify column TBL_NAME varchar(1000) character se…...

架构,性能和游戏 《游戏编程模式》学习笔记

开新坑&#xff0c;准备把《游戏编程模式》这本书啃完。这是一本讲设计模式的书&#xff0c;针对游戏开发而作&#xff0c;写得很好。 以下是读书笔记&#xff0c;文末有原文链接 每个程序都有一定的软件架构&#xff0c;哪怕是全塞到main里也是一种架构好的架构可以把代码写成…...

Spring Bean的生命周期

文章目录 Spring Bean的生命周期加载Bean对象创建Bean对象构造对象填充属性初始化实例注册销毁 销毁 Spring Bean的生命周期 Spring Bean的生命周期就是指Bean对象从创建到销毁的过程&#xff0c;大体可以分为&#xff1a;实例化、属性赋值、初始化、使用、销毁。 加载Bean对象…...

基于量子同态的安全多方量子求和加密

摘要安全多方计算在经典密码学中一直扮演着重要的角色。量子同态加密(QHE)可以在不解密的情况下对加密数据进行计算。目前&#xff0c;大多数协议使用半诚实的第三方(TP)来保护参与者的秘密。我们使用量子同态加密方案代替TP来保护各方的隐私。在量子同态加密的基础上&#xff…...

前端自动化测试:确保质量和稳定性的关键步骤

文章目录 测试金字塔与前端测试层级1. 单元测试&#xff08;Unit Testing&#xff09;2. 组件测试&#xff08;Component Testing&#xff09;3. 集成测试&#xff08;Integration Testing&#xff09;4. 端到端测试&#xff08;End-to-End Testing&#xff09; 单元测试、集成…...

《Ansible自动化工具篇:Centos操作系统基于ansible工具一键远程离线部署之K8S1.24.12二进制版集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署二进制版K8S集群&#xff0c;由于大都数用户都是专网环境&#xff0c;无法使用外网&#xff0c;为了更便捷&#xff0c;高效的部署&#xff0c;针对业务系统的特性&#xff0c;我这边编写了 基于a…...

Java实现十大经典排序算法之快速排序

0 算法简介 快速排序是一种高效率排序算法&#xff0c;它是对冒泡排序的一种改进&#xff0c;它也是一种不稳定排序算法。快速排序的核心是比较、交换和递归。 在待排序数组中指定一个基准元素pivot&#xff08;一般选取数组首元素&#xff09;&#xff0c;使得数组排序之后基…...

【0803作业】创建两个线程:其中一个线程拷贝图片的前半部分,另一个线程拷贝后半部分(4种方法)

方法一&#xff1a;使用pthread_create、pthread_exit、pthread_join函数【两个线程不共用同一份资源】 先在主函数创建并清空拷贝的目标文件&#xff0c;再创建两个线程&#xff0c;在两个线程内部同时打开要读取的文件以及要拷贝的目标文件&#xff08;两个线程不共用同一份资…...

php运算符的短路特性

php运算符的短路特性 1、逻辑运算符&#xff1a;逻辑与&#xff08;&&)和逻辑或&#xff08;||&#xff09;&#xff0c;存在着短路特性 PHP中有以下两个运算符具有短路的特性&#xff0c;他们是逻辑运算符的逻辑与&#xff08;&&)和逻辑或&#xff08;||&am…...

C语言假期作业 DAY 13

一、选择题 1、如果 x2014 &#xff0c;下面函数的返回值是&#xff08; &#xff09; int fun(unsigned int x) { int n 0; while(x 1) { n; x x | (x 1); } return n; } A: 20 B: 21 C: 23 D 25 答案解析 正确答案&#xff1a;C 这个作用是对整型中0的个数进行统计&…...

以产品经理的角度去讲解原型图---会议OA项目

目录 一.前言 二.原型图 2.1 原型图是什么 3.1 原型图的作用 三.演示讲解 3.1 项目背景 3.2 项目介绍 3.2.1 会议管理&#xff08;会议的发起&#xff0c;通知&#xff09; 3.2.2 投票管理&#xff08;会议的流程重大决策记录&#xff09; 3.2.3 会议室管理 3.2.4 系统管…...

C++ 外部变量和外部函数

1.外部变量 如果一个变量除了在定义它的源文件中可以使用外&#xff0c;还能被其他文件使用&#xff0c;那么就称这个变量为外部变量。命名空间作用域中定义的变量&#xff0c;默认情况下都是外部变量&#xff0c;但在其他文件中如果需要使用这一变量&#xff0c;需要用extern…...

C# Onnx Paddle模型 OCR识别服务

效果 项目 可运行程序exe下载 Demo&#xff08;完整源码&#xff09;下载...

MCUXpresso for VS Code -- 基于VSCode开发RT1176

MCUXpresso for VS Code 是nxp推出插件&#xff0c;旗下MCX LPC, Kinetis和i.MX rt等MCU&#xff0c;都能在VS Code平台进行嵌入式开发。功能框图如下&#xff1a; 前期准备&#xff1a; 软件环境: windows(实际可以跨系统&#xff0c;linux和mac没有测试) VS Code ninja CMa…...

MySQL的使用——【初识MySQL】第二节

MySQL的使用——【初识MySQL】第二节 文章目录 MySQL环境变量的配置&#xff08;如使用Navicat可忽略&#xff09;使用命令行连接MySQL&#xff08;如使用Navicat可忽略&#xff09;步骤注意 NavicatNavicat的下载Navicat的使用连接MySQL新建表 总结总结 MySQL环境变量的配置&a…...

MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字

一、&#x1f49b;并发基本概念 并发的基本意思&#xff1a; 什么是并发呢&#xff1f;简单的理解就是同一时间执行 服务器同一时刻&#xff0c;给多个客户端提供服务&#xff5e;&#xff5e;&#xff0c;这两个客户端都可以给服务器提交事务。 如果提交两个事务&#xff0c;改…...

Qwen3.5-2B算法优化实战:提升LSTM时序数据预测与多模态融合效果

Qwen3.5-2B算法优化实战&#xff1a;提升LSTM时序数据预测与多模态融合效果 1. 引言&#xff1a;当LSTM遇上多模态 最近在做一个股票预测项目时遇到个有趣问题&#xff1a;传统LSTM模型只看K线走势数据&#xff0c;效果总是不太稳定。后来发现&#xff0c;市场情绪对股价影响…...

大模型位置编码进化史:从Sinusoidal到RoPE的5个关键突破

大模型位置编码进化史&#xff1a;从Sinusoidal到RoPE的5个关键突破 在自然语言处理领域&#xff0c;位置编码技术如同给模型装上了"空间感知"系统&#xff0c;让原本对序列顺序"视而不见"的Transformer架构获得了理解词序关系的能力。本文将带您深入探索这…...

别再死记硬背了!用Multisim仿真带你直观理解MOSFET放大电路的静态工作点

用Multisim仿真解锁MOSFET放大电路&#xff1a;静态工作点的可视化教学革命 学习模拟电子技术时&#xff0c;许多初学者都会在MOSFET放大电路的静态工作点分析上卡壳。那些抽象的曲线、复杂的公式和难以捉摸的"预夹断"概念&#xff0c;常常让人望而生畏。但今天&…...

2026奇点智能技术大会语音交互全解密(端到端LLM-ASR-TTS融合架构首度公开)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AI原生语音交互 2026奇点智能技术大会(https://ml-summit.org) AI原生语音交互的核心范式演进 传统语音助手依赖于“ASR → NLU → Dialogue Management → TTS”的分阶段流水线&#xff0c;而AI原生语音交互将整个流程重…...

基于Spring Boot和SSM框架的ERP进销存管理系统源码分享:单据流转与物流信息管理解...

基于spring boot的ERP进销存管理系统 单据流转 物流信息管理系统源码 物流信息系统 超市进销存管理系 药品管理系统 系统设计与开发 SSM框架、Java开发、vue开发、B/S架构、Java项目 亮点&#xff1a;单据之间有关联&#xff0c;可以实现单据的流转 前后端分离 本系统功能包括…...

Bidili Generator问题解决:LoRA强度调节技巧,控制图片风格

Bidili Generator问题解决&#xff1a;LoRA强度调节技巧&#xff0c;控制图片风格 今天我想和大家分享一个在使用Bidili Generator时特别实用的技巧——如何通过调节LoRA强度来控制生成图片的风格。如果你曾经遇到过生成的图片风格不是你想要的&#xff0c;或者觉得风格太过强…...

Lychee重排序模型与YOLOv8强强联合:智能相册多模态检索系统开发指南

Lychee重排序模型与YOLOv8强强联合&#xff1a;智能相册多模态检索系统开发指南 1. 引言 你有没有遇到过这样的情况&#xff1a;手机里有几千张照片&#xff0c;想找一张特定的图片却像大海捞针&#xff1f;或者想用文字描述来搜索图片&#xff0c;结果却总是不尽如人意&…...

Qwen3-0.6B-FP8功能测评:思维模式切换,让对话更智能

Qwen3-0.6B-FP8功能测评&#xff1a;思维模式切换&#xff0c;让对话更智能 你是否遇到过这样的场景&#xff1a;想让AI帮你解决一个复杂的数学题&#xff0c;它却用闲聊的语气跟你兜圈子&#xff1b;或者只是想简单聊聊天&#xff0c;它却开始长篇大论地推理分析&#xff1f;…...

Pixel Dimension Fissioner 开发环境配置:Visual Studio Code远程连接GPU服务器

Pixel Dimension Fissioner 开发环境配置&#xff1a;Visual Studio Code远程连接GPU服务器 1. 为什么需要远程开发&#xff1f; 当你开始使用Pixel Dimension Fissioner这类AI模型时&#xff0c;本地电脑的性能可能无法满足需求。GPU服务器提供了强大的计算能力&#xff0c;…...

基于DSP28335主控的直流有刷电机闭环控制系统:转速PID调控与上位机操作体验

直流有刷电机闭环控制 主控dsp28335&#xff0c;直流有刷电机&#xff0c;采用ab编码器&#xff0c;进行速度闭环。 有转速指令规划处理&#xff0c;速度环pid控制&#xff0c;eqep位置解算、转速解算&#xff0c;可以通过上位机控制电机正反转&#xff0c;发送指令等。 可以直…...