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 我承认我写的乱七八糟的,但好像就是能入库... 甲方要求这样我就东挪西挪的

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

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

相关文章

mint-ui Picker 显示异常

mint-ui Picker 显示异常 现象 最近一个老项目页面显示异常&#xff0c;使用mint-ui Picker显示异常,直接显示成了 数据对象&#xff0c;而不是具体travelName 字段 组件 mint-ui Picker 使用方式(vue方式) // template <mt-picker :slots"slots" value-key…

【重生之我要苦学C语言】深入理解指针2

深入理解指针2 const修饰指针 当const修饰变量时&#xff0c;是无法更该该变量的值的 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {const int a 10;//const常属性&#xff0c;不能改变的属性a 1;printf("%d\n", a);return 0; }报错&…

TVM前端研究--Pass

文章目录 TVM 中 Pass 分类Pass Infrastructure后端主要数据结构前端数据结构Pass 注册机制注册流程AI 编译器一般采用多级 IR 的架构来处理深度学习模型,不同级别的 IR 包含不同层级的信息。比如,越靠近前端的 IR 一般不包含硬件的信息,越靠近后端,IR 所含信息则与硬件愈相…

半参数模型

4. 半参数模型 (Semi-parametric Model) 半参数模型结合了参数化和非参数化的方法。可以在整体上采用线性回归&#xff0c;但在局部允许非线性变化。这样做的目的是在保持模型的线性解释性的同时&#xff0c;捕捉细微的弧度趋势。 例如&#xff0c;可以定义&#xff1a; y …

终于弄懂了Python字符串的操作

字符串的操作 在 Python 中&#xff0c;字符串不仅是存储文本的工具&#xff0c;还提供了多种操作来处理和管理这些文本数据。通过掌握字符串的各种操作&#xff0c;程序员可以更加灵活地处理信息&#xff0c;实现不同的需求。以下将详细介绍字符串的常见操作&#xff0c;包括…

LInux系统编程(二)操作系统和进程

目录 一、前言&#xff1a;冯诺依曼体系结构 1、图中各个单元的介绍 2、值得注意的几点 二、操作系统 1、操作系统分层图 2、小总结 三、 进程&#xff08;重点&#xff09; 1、进程的基本概念 2、存放进程信息的数据结构——PCB&#xff08;Linux 下称作 task_struct…

加法电路和减法电路

一、加法电路 下边为加法电路的拓扑结构 加法电路作用1: 直流量叠加 如上图仿真所示,利用放大器LM324AD进行加法电路的仿真,输入为直流+1V和直流+2V,经过加法运算,根据上边Uo的计算公式进行计算,可得Uo=-3V,和仿真结果保持一致。如下图所示。 加法电路作用2: 信号叠加…

Kafka系列之:对做了条带划分的Kafka节点磁盘实现扩容的技术方案

Kafka系列之:对做了条带划分的Kafka节点磁盘实现扩容的技术方案 一、查看磁盘条带扩容情况二、查看逻辑卷及其关联的物理卷和逻辑卷快照三、显示文件系统磁盘空间使用情况及文件系统类型四、对每块盘扩容五、更改物理卷的大小六、扩展逻辑卷七、扩展XFS文件系统的大小八、扩容…

8. 数据结构——邻接表、邻接矩阵的基本操作

一、邻接表 1. 内容 2. 实现代码(直接可以复制使用) //邻接表的相关操作 #include<bits/stdc.h> #define MVnum 100 #define OK 1 #define ERROR -1 using namespace std;typedef int Status; typedef char VerTexType; //假设顶点的数据类型为char typedef int ArcT…

自动化研磨领域的革新者:半自动与自动自磨机的技术突破

据QYResearch调研团队最新报告“全球半自动和自动自磨机市场报告2023-2029”显示&#xff0c;预计2029年全球半自动和自动自磨机市场规模将达到5.3亿美元&#xff0c;未来几年年复合增长率CAGR为3.5%。 图00001. 半自动和自动自磨机&#xff0c;全球市场总体规模 如上图表/数据…

基于RFID的智能门禁系统的设计(论文+源码)

1系统总体设计 本次基于RFID的智能门禁系统的设计与实现课题&#xff0c;在功能上设计如下&#xff1a; 1.可以通过RFID模块&#xff0c;实现对IC卡的注册&#xff0c;注销操作&#xff1b; 2.在IC卡解锁时&#xff0c;如果非注册IC卡刷卡时蜂鸣器将报警提示&#xff1b; 3…

CAD图纸防泄密|哪些措施可以加密公司图纸?五个宝藏方法分享,2024必读!

在工程设计领域&#xff0c;CAD图纸作为企业的核心资产&#xff0c;其安全性至关重要。一旦图纸泄露&#xff0c;不仅可能给企业带来重大的经济损失&#xff0c;还可能损害企业的声誉和竞争力。 那么&#xff0c;怎么实现CAD图纸防泄密呢&#xff1f; 以下是五个CAD图纸防泄密…

Ubuntu:docker 安装和使用

本文将介绍在 Ubuntu 上安装和使用 docker 的方法和 bash 命令。 一、安装 sudo apt update sudo apt install docker.io二、启动 sudo systemctl start docker sudo systemctl enable docker三、下载 sudo docker pull registry.cn-hangzhou.aliyuncs.com/......四、运行 …

element-plus版本过老,自写选项弹框增删功能

title: element-plus版本过老&#xff0c;自写选项弹框增删功能 date: 2024-10-31 10:53:18 tags: element-plus 1.情景 发现代码怎么都用不了el-select的#footer插槽从而实现不了相关的操作&#xff0c;发现el-select自带的管理相关数据的属性popper-class用不了。 2.原因与…

java项目之文理医院预约挂号系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文理医院预约挂号系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 本系统的使用角色可…

Ubuntu 通过Supervisor 或者 systemd 管理 .Net应用

在 Ubuntu 上安装 .NET 8.0&#xff0c;通过 supervisor 或 systemd 管理 .NET 应用服务&#xff0c;确保应用能够自动启动、运行以及在崩溃时重启。 1. 安装 .NET 8.0 最新的Ubuntu版本已经不需要注册 Microsoft 包存储库了&#xff0c;具体的可以参考微软官方文档安装&…

spring 学习路线梳理(二)注解

1.通过注解的方式创建bean 1.1 定义dao层的接口和实现 public interface ILoginDao {public String login(); }Slf4j Repository public class LoginDaoImpl implements ILoginDao {public LoginDaoImpl(){System.out.println("spring create bean call");}Override…

具有特定结构和功能的化学试剂——反式环辛烯-聚乙二醇-硅烷TCO-PEG-Silane

TCO-PEG-Silane&#xff0c;即反式环辛烯-聚乙二醇-硅烷&#xff0c;是一种具有特定结构和功能的化学试剂。 一、基本性质 外观&#xff1a;通常为白色固体&#xff0c;但具体外观可能因分子量、制备方法和存储条件的不同而有所变化。 溶解性&#xff1a;易溶于多种有机溶…

Blender进阶:着色器节点

11 着色器节点 11.1着色器 着色器Shader&#xff0c;负责给物体表面着色。 综合以下参数&#xff1a; -基础色-金属度、粗超度、透明度-法向-入射光颜色、强度、角度。。 着色器本质上是一段程序、算法&#xff0c;即着色器编程。 在节点编辑器中&#xff0c;支持算法的可…

状态检测防火墙报文处理发流程

华为大同&#xff1a;全系列状态检测防火墙报文处理流程 华为防火墙在处理报文时&#xff0c;其核心在于其状态检测与会话机制&#xff1a;当防火墙接收到报文后&#xff0c;它会在特定时间和条件下创建会话&#xff0c;并对那些与会话表匹配的报文进行特定的转发处理。基于这一…