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

Java 用户随机选择导入ZIP文件,解压内部word模板并入库,Windows/可视化Linux系统某麒麟国防系统...均可适配

1.效果

压缩包内部文件

2.依赖

        <!--支持Zip--><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>总之是要File类变MultipartFile类型的 好像是下面这仨个 你们都添加进去吧<!--file类型转换Mu...--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.13.RELEASE</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><!--file类型转换Mu...--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency>

3.Impl 代码

@Override    
public Result importFileA(MultipartFile multipartFile,Integer modelMarking) throws IOException {//创建临时目录用于解压//ChatGPT解释// --> Linux/macOS:通常在/tmp目录下。例如/temp/uploadZip_XXXXXX.// --> Windows:通常在 C:\Users\<用户名>\AppData\Local\Temp 目录下,例如 C:\Users\<用户名>\AppData\Local\Temp\uploadZip_XXXXXX.Path uploadZip = Files.createTempDirectory("uploadZip_");File directory = new File(uploadZip.toString());if (!directory.exists()){directory.mkdir();}//zip文件目录String zipFilePath = uploadZip + "/" + multipartFile.getOriginalFilename();//自定义文件写入临时项目目录中try{multipartFile.transferTo(new File(zipFilePath));}catch (Exception e){e.printStackTrace();}//解压ZIP文件List<String> s = unzipAndPrintPaths(zipFilePath, uploadZip.toString());for (String string : s) {File file = new File(string);//将文件写入指定路径MultipartFile cMultiFile = new MockMultipartFile("file", file.getName(), null, new FileInputStream(file));if (modelMarking == 1) {importFileAF1(cMultiFile);} else if (modelMarking == 2) {importFileAF2(cMultiFile);} else if (modelMarking == 3) {importFileAF3(cMultiFile);}}//清除临时文档Files.walk(uploadZip).sorted((a,b)->b.compareTo(a)).forEach(f -> f.toFile().delete());}return Result.success();}

3.1 挑一个importFileAF1这个方法解读

public void importFileAF1(MultipartFile multipartFile) throws IOException {InputStream inputStream = null;File file = null;try{// 创建临时文件file = File.createTempFile("temp", null);// 把multipartFile写入临时文件multipartFile.transferTo(file);// 使用文件创建 inputStream 流inputStream = new FileInputStream(file);//读取Word文档XWPFDocument document = new XWPFDocument(inputStream);//保存报表A数据TestRecord testRecord = new TestRecord();//头标签String handTab = null;String fileName = null;// 遍历头表头// 遍历文档的每个段落for (XWPFParagraph paragraph : document.getParagraphs()) {String content = paragraph.getText();if(content.startsWith("F1")){testRecord.setModelId(1);} else if (content.startsWith("F2")) {testRecord.setModelId(2);} else if (content.startsWith("F3")) {testRecord.setModelId(3);}if (content.startsWith("文件名:")){String[] parts = content.split(":", 2);fileName = parts[1];//set名字时待整改testRecord.setFileName(parts[1]);String part = parts[1];String[] split = part.split("_", 6);handTab = split[3];}}List<StringBuffer> joinList = new ArrayList<>();// 识别下方// 获取文档中的所有表格List<XWPFTable> tables = document.getTables();// 遍历每个表格for (XWPFTable table : tables) {// 获取表格的行List<XWPFTableRow> rows = table.getRows();// 遍历每一行for (XWPFTableRow row : rows) {// 获取行中的单元格List<XWPFTableCell> cells = row.getTableCells();StringBuffer stringBuffer = new StringBuffer();// 遍历每个单元格for (XWPFTableCell cell : cells) {// 输出单元格的文本内容System.out.print(cell.getText() + "|");stringBuffer.append(cell.getText() + "|");}joinList.add(stringBuffer);System.out.println(); // 换行}System.out.println(); // 表格间换行}JSONObject jsonObject = new JSONObject();JSONArray checkItems = new JSONArray();/*** vehicle_info* 需要 unit_id √* 需要 powerHours √* 需要 powerPackWorking √* 需要 powerPackYieldHours √* 需要 taskPayloadWorkingHours √* 需要 factoryDate √* 需要 plateNumber √*///拼凑vehicle_info数据JSONObject vehicleInfo = new JSONObject();String[] split;//采集子数据List<String> sonList = new ArrayList<>();for(StringBuffer sb:joinList){//特殊处理if (sb.toString().equals("|")){continue;}if (sb.toString().startsWith("装备基础信息")){split = sb.toString().split("\\|");testRecord.setModelName(split[2]);vehicleInfo.put("powerHours",split[4]);continue;//testRecord} else if (sb.toString().startsWith("|车辆编号")) {split = sb.toString().split("\\|");testRecord.setPlateNum(split[2]);vehicleInfo.put("plateNumber",split[2]);vehicleInfo.put("powerPackWorkingHours",split[4]);//接收null值continue;} else if (sb.toString().startsWith("|所属机构")) {split = sb.toString().split("\\|");//if (split[2].contains("/")){String[] split1 = split[2].split("/");Unit unit1 = unitMapper.selectOne(new QueryWrapper<Unit>().lambda().eq(Unit::getUnitName, split1[1]));if(unit1.getUnitName()!=null){vehicleInfo.put("unitId",unit1.getUnitId());}}else {Unit unit1 = unitMapper.selectOne(new QueryWrapper<Unit>().lambda().eq(Unit::getUnitName,split[2]));if (unit1.getUnitName()!=null){vehicleInfo.put("unitId",unit1.getUnitId());}}vehicleInfo.put("powerPackYieldHours",Optional.ofNullable(split[4]).orElse("0"));continue;} else if (sb.toString().startsWith("|出厂日期")) {split = sb.toString().split("\\|");vehicleInfo.put("factoryDate",split[2]);vehicleInfo.put("taskPayloadWorkingHours",Optional.ofNullable(split[4]).orElse("0"));continue;} else if (sb.toString().startsWith("|车辆里程数(km)")){split = sb.toString().split("\\|");try {testRecord.setMileage(Double.parseDouble(split[2]));vehicleInfo.put("mileage",split[2]);testRecord.setCreateTime(split[4]);} catch (NumberFormatException e) {e.printStackTrace();}continue;} else if (sb.toString().startsWith("|||备注|")){split = sb.toString().split("\\|");try {testRecord.setRemark(split[4]);} catch (NumberFormatException e) {e.printStackTrace();}continue;} else if (sb.toString().startsWith("序号|")) {continue;}sonList.add(sb.toString());}String[] split2 = fileName.split("_");//组装数据JSONObject returnResult = new JSONObject();returnResult.put("topSystem",false);returnResult.put("systemName",split2[3]);JSONArray objects = new JSONArray();//解锁遍历for(String entity:sonList){String[] split1 = entity.toString().split("\\|");JSONObject Json = new JSONObject();if(split1[1].split(" ")[0].contains("感知故障码") || split1[1].split(" ")[0].contains("感知提示码") || split1[1].split(" ")[0].contains("平台故障码") || split1[1].split(" ")[0].contains("平台提示码")){Json.put("code",split1[1].split(" ")[1]);Json.put("name",split1[2]);//判断红绿状态if ("故障".equals(split1[5])){Json.put("state",false);Json.put("stateMessage","故障");}else {Json.put("state",true);Json.put("stateMessage","提示");}}else{Json.put("name",split1[1]);Json.put("stateMessage",split1[2]);//判断红绿状态if ("故障".equals(split1[5])){Json.put("state",false);}else {Json.put("state",true);}}objects.add(Json);}returnResult.put("checkItems",objects);testRecord.setDetail("["+JSONObject.toJSONString(returnResult,SerializerFeature.WriteMapNullValue)+"]");testRecord.setContent(split2[3]);testRecord.setUnitId(Integer.valueOf(vehicleInfo.get("unitId").toString()));testRecord.setVehicleInfo(JSONObject.toJSONString(vehicleInfo, SerializerFeature.WriteMapNullValue));testRecordMapper.insert(testRecord);}catch (Exception e){e.printStackTrace();//关闭文件流inputStream.close();}finally {// 最后记得删除文件file.deleteOnExit();// 关闭流inputStream.close();}}

3.2 我承认我写的乱七八糟的,但好像就是能入库... 甲方要求这样我就东挪西挪的

相关文章:

Java 用户随机选择导入ZIP文件,解压内部word模板并入库,Windows/可视化Linux系统某麒麟国防系统...均可适配

1.效果 压缩包内部文件 2.依赖 <!--支持Zip--><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>总之是要File类变MultipartFile类型的 好像是…...

【C++】C++17结构化绑定、std::optional、std::variant、std::any

二十二、C17中的结构化绑定、std::optional、std::variant、std::any 本部分是一个小系列&#xff0c;介绍C17中新引入的、用来解决各种不同返回情况的、标准库新组件。 1、C的结构化绑定 结构化绑定structured bindings是C17中引入的一项特性&#xff0c;它允许开发者方便地…...

C#的起源。J++语言的由来?J#和J++傻傻分不清?

C#的起源 C#读音是C Sharp, 它是微软为了对抗Java而生&#xff0c;最早是J&#xff0c;效率比Java还好&#xff0c;后来被Sun公司起诉J破坏了平台无关性&#xff0c;微软重新开发C#. C#和Java一样都定位为中间件语言&#xff0c;用虚拟机执行编译的字节码以达到跨平台目的。从语…...

Flutter 在 对接 google play 时,利用 android studio 可视化生成 已签名的aab包

android studio 可视化生成 aab包 第一 &#xff1a; 先说注意事项 在Flutter项目里面&#xff0c;直接打开当前项目是不行的&#xff0c;不显示相应操作&#xff0c;需要在Android 目录打开&#xff0c;直白点就是直接打开项目里面的Android 目录 不然会出现的一些问题 第一…...

使用web.dev提供的工具实现浏览器消息推送服务

文章目录 前言实现工具和效果实现原理实现过程前端接收用户订阅请求将用户订阅信息更新到后端后端实现接收并保存订阅信息的接口后端实现消息推送的逻辑前言 对于电商独立站来说,新品上架或者促销活动上线及时通知到用户是很重要的,通知的渠道有很多,其中就包括浏览器消息推…...

计算机系统结构为什么用architecture 而不是structure?

architecture本意是建筑学、建筑艺术&#xff0c;其含义就是建筑的样子和背后的设计思想&#xff0c;用于计算机科学可以表达计算机的系统结构和后面的设计原理&#xff1a;它长什么样&#xff1f;它为什么长这样&#xff1f; 与architecture 对应的词是structure &#xff08…...

sqoop问题汇总记录

此篇博客仅记录在使用sqoop时遇到的各种问题。持续更新&#xff0c;有问题评论区一起探讨&#xff0c;写得有不足之处见谅。 Oracle_to_hive 1. main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTr…...

Git 创建新的分支但清空提交记录

有时候需要创建新的分支&#xff0c;但是原有分支的提交非常多&#xff0c;不好区分哪些是创建分支之后的提交。 那么就把原分支的提交全部去掉 要从 分支1 创建 分支2&#xff0c;并确保 分支2 不包含任何提交历史&#xff0c;同时文件与 分支1 的最后一次提交一致&#xff0…...

SQL PRIMARY KEY

SQL PRIMARY KEY 概述 在关系型数据库中&#xff0c;主键&#xff08;PRIMARY KEY&#xff09;是一个非常重要的概念。它是表中每一行数据的唯一标识符&#xff0c;用于保证数据的完整性和准确性。本文将详细介绍SQL中的主键&#xff0c;包括其定义、作用、如何创建和修改主键…...

软件测试学习笔记丨Flask操作数据库-对象与数据模型

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/23440 对象与数据模型 数据模型&#xff1a;是数据特征的抽象&#xff0c;抽象层次上描述了系统的静态特征、动态行为和约束条件&#xff0c;为数据库系统的信息表示与操作提供一个抽象的框架…...

IntelliJ IDEA使用 MybatisX-Generator 插件 自动生成Entity+Mapper+Mapper.xml等代码

一、Intellij安装MybatisX插件&#xff1a; 首先点击 Intellij->Preference->Plugins&#xff0c;然后搜索MybatisX&#xff0c;点击安装&#xff1a; 2 打开数据库 在IntelliJ IDEA 连接Mysql数据库&#xff0c;选择表&#xff0c;点击右键&#xff0c;选择 Mybatis…...

vue中如何为不同功能设置不同的默认打印设置(设置不同的打印机)

浏览器自带的window.print 功能较简单&#xff0c;这里使用LODOP露肚皮打印 以下是vue2示例&#xff1a; 从官网中下载Lodop和C-Lodop官网主站安装包并安装到本地电脑可以全局搜索电脑找到安装文件LodopFuncs.js&#xff0c;也可以直接复制我贴出来的文件 //用双端口加载主JS…...

经纬恒润INTEWORK-VBA新版本正式发布

在汽车电子研发领域&#xff0c;随着开发测试的深入&#xff0c;工程师们常常面临着一个共同的问题&#xff1a;如何高效地在多样化的开发测试场景中切换&#xff0c;并确保不同工具间的紧密协作。不同场景、不同工具的切换与使用给工程师带来高昂的学习成本和前后端信息传递的…...

金蝶云数据集成至MySQL的高效解决方案

金蝶云数据集成至MySQL的高效解决方案 金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化过程中&#xff0c;数据的高效集成和管理是关键环节。本文将聚焦于一个具体的系统对接集成案例&#xff1a;金蝶云星空的数据如何通过轻易云数据集成平台无缝对接到MySQL数据库。本…...

Day02 C++ 环境设置

2024.11.1 C 环境设置 如果您想要设置 C 语言环境&#xff0c;需要确保电脑上有以下两款可用的软件&#xff0c;文本编辑器和 C 编译器。 一、文本编辑器 通过编辑器创建的文件通常称为源文件&#xff0c;源文件包含程序源代码。 C 程序的源文件通常使用扩展名 .cpp、.cp 或…...

AQS是什么

AQS&#xff1a;AbstructQueuedSynchronizer是java.util.concurrent.locks包中的一个类&#xff0c;是多线程同步器&#xff0c;J.U.C包中的多个组件的底层实现都使用到了它。如&#xff1a;Lock、CountDownLatch、Semaphore. 从本质上来说AQS实现了两种机制的锁&#xff0c;排…...

Spring IOC容器简介

Spring IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;容器是Spring框架的核心组件之一&#xff0c;负责管理应用程序中的对象及其依赖关系。IoC容器通过依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;实现对象的创建、配置和管理…...

【backstopjs】入门安装环境

1.首先全局安装BackstopJS npm install -g backstopjs 安装失败,常见报错&解决办法&#xff1a; 报错&#xff1a; (venv) D:\workspace\Otaku\backstop>npm install -g backstopjs npm warn deprecated inflight1.0.6: This module is not supported, and leaks mem…...

LocalDate 类常用方法详解(日期时间类)

LocalDate 类常用方法详解 LocalDate 是 Java 8 引入的日期时间API中的一个类&#xff0c;用于表示不含时间和时区的日期&#xff08;年、月、日&#xff09;。以下是一些常用的 LocalDate 方法&#xff1a; 创建 LocalDate 实例 now()&#xff1a;获取当前日期 LocalDate t…...

kmp desktop实现excel预览

先将excel转paf https://blog.csdn.net/qq_42761569/article/details/121699594 package utilimport com.aspose.cells.License import com.aspose.cells.PdfSaveOptions import com.aspose.cells.Workbook import com.geolo.desktop.common.utils.LogUtils import java.io.Fi…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...