当前位置: 首页 > 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…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...