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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

反悔贪心

Problem - C - Codeforces&#xff08;初识反悔贪心&#xff09; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #define fi first #define se secondusing namespace std; typedef pair<int,int> PII;string a, b, ans; bool vis…

Cisco Packet Tracer 8.0 路由器静态路由配置

文章目录 静态路由简介一、定义与特点二、配置与命令三、优点与缺点四、应用场景 一&#xff0c;搭建拓扑图二&#xff0c;配置pc IP地址三&#xff0c;pc0 ping pc1 timeout四&#xff0c;配置路由器Router0五&#xff0c;配置路由器Router1六&#xff0c;测试 静态路由简介 …

burp靶场-Remote code execution via web shell upload

Lab: 通过 Web shell 上传远程执行代码 This lab contains a vulnerable image upload function. It doesn’t perform any validation on the files users upload before storing them on the server’s filesystem. 此实验室包含易受攻击的映像上传功能。在将用户上传的文件…

极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果

目录 前言 1.弹性放大按钮效果 2.旋转和缩放组合动画 3.颜色渐变背景动画 4.缩放进出效果 前言 在上一篇文章中&#xff0c;我们介绍了Flutter中的隐式动画的一些相关知识&#xff0c;在这篇文章中,我们可以结合多个隐式动画 Widget 在 Flutter 中创建一些酷炫的视觉效果&…

后端:Spring-1

文章目录 1. 了解 spring(Spring Framework)2. 基于maven搭建Spring框架2.1 纯xml配置方式来实现Spring2.2 注解方式来实现Spring3. Java Config类来实现Spring 2.4 总结 1. 了解 spring(Spring Framework) 传统方式构建spring(指的是Spring Framework)项目&#xff0c;导入依…

qt QStackedLayout详解

QStackedLayout类提供了一种布局方式&#xff0c;使得在同一时间内只有一个子部件&#xff08;或称为页面&#xff09;是可见的。这些子部件被维护在一个堆栈中&#xff0c;用户可以通过切换来显示不同的子部件&#xff0c;适合用在需要动态显示不同界面的场景&#xff0c;如向…

C++进阶:C++11的新特性

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ C11的发展历史 2011年&#xff0c;C标准委员会发布了C11标准&#xff0c;这是C的一次巨大飞跃&#xff0c;引入了许多重要的新特性&#xff0c;如智能指针、lambda表达式、并发编程支持等。这一版本的发布对C社…

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…

OpenAI推出搜索GPT,进军搜索引擎领域

OpenAI 推出了一项新功能——Search GPT&#xff0c;为 ChatGPT 引入实时网络搜索功能&#xff0c;使其站上与 Google 和 Bing 等搜索巨头竞争的舞台。 OpenAI 产品的重大变化&#xff0c;Search GPT 承诺提供快捷、实时的答案&#xff0c;并附上可靠来源的链接。 ChatGPT 一直…

Unity XR Interaction Toolkit 开发教程(3)快速配置交互:移动、抓取、UI交互【3.0以上版本】

获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&#xff1a; 3.快速配置交互&#xff1a;移动、抓取、UI交互【Unity XR Interaction Toolkit 跨平台开发教程】&#xff08;3.0以上版本&#xff09; 系列教程专栏&…

SE-Net模型实现猴痘病识别

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DeepLabV3模型实现人体部位分割CIHP数据】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.…

深度学习之权重、偏差

1 权重偏差初始化 1.1 全都初始化为 0 偏差初始化陷阱&#xff1a; 都初始化为 0。 产生陷阱原因&#xff1a;因为并不知道在训练神经网络中每一个权重最后的值&#xff0c;但是如果进行了恰当的数据归一化后&#xff0c;我们可以有理由认为有一半的权重是正的&#xff0c;另…

企业物流管理数据仓库建设的全面指南

文章目录 一、物流管理目标二、总体要求三、数据分层和数据构成&#xff08;1&#xff09;数据分层&#xff08;2&#xff09;数据构成 四、数据存储五、数据建模和数据模型&#xff08;1&#xff09;数据建模&#xff08;2&#xff09;数据模型 六、总结 在企业物流管理中&…

Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战

数据的并行导出与压缩下载&#xff1a;EasyExcel&#xff1a;实现大规模数据的并行导出与压缩下载 构建高效排队导出&#xff1a;解决多人同时导出Excel导致的服务器崩溃 SpringBoot集成EasyExcel 3.x&#xff1a; 前言 在企业级应用开发中&#xff0c;常常需要处理复杂的 …

【网络篇】计算机网络——链路层详述(笔记)

目录 一、链路层 1. 概述 2. 链路层提供的服务 &#xff08;1&#xff09;成帧&#xff08;framing&#xff09; &#xff08;2&#xff09;链路接入 &#xff08;3&#xff09;可靠交付 &#xff08;4&#xff09;差错检测和纠正 3. 链路层的实现 二、多路访问链路和…

Android——显式/隐式Intent

概述 在Android中&#xff0c;Intent是各个组件之间信息通信的桥梁&#xff0c;它用于Android各组件的通信。 Intent 的组成部分 一、显式 Intent 第一种方式 Intent intent new Intent(this, ActFinishActivity.class);startActivity(intent);第二种方式 Intent intent …

__init__.py __all__和 __name__的作用及其用法

__ init__.py 的作用及其用法&#xff1a; 包下的__init__.py 所在目录是一个模块包,本身也是一个模块,可用于定义模糊导入时要导入的内容。当我们导入一个包的时候&#xff0c;包下的__init__.py中的代码会自动执行&#xff0c;因此在某些大的项目被使用频率较高的模块&#x…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— Tabs底部导航栏》

简介 通过学习HarmonyOS Next&#xff0c;实战项目WanAndroid 鸿蒙版&#xff0c;API接口均来自WanAndroid 开源接口&#xff0c;我们一起来做个App吧。 玩Android 开放API&#xff1a;https://www.wanandroid.com/blog/show/2 效果图 创建每个模块下的各个目录 1、feature…

LinkedList 分析

LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较。关于 LinkedList 和ArrayList的详细对比&#xff0c;我们 Java 集合常见面试题总结(上)有详细介绍到。 双向链表 不过&#xff0c;我们在项目中一般是不会使用到 Link…