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

news2024/11/26 12:28:35

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.coloradmin.cn/o/2232073.html

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

相关文章

论文笔记(五十四)pi0: A Vision-Language-Action Flow Model for General Robot Control

π0: A Vision-Language-Action Flow Model for General Robot Control 文章概括摘要I. INTRODUCTIONII. RELATED WORKIII. OVERVIEWIV. π 0 \pi_0 π0​模型V. 数据收集和培训配方A. 预训练和后训练B. 语言和高级策略C. 机器人系统细节 VI. 实验评估A. 基础模型评估B. 遵循语…

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…

论文略读:Self-Knowledge Guided Retrieval Augmentation for Large Language Models

2023 emnlp findings RAG 召回的辅助信息不总是有用&#xff0c;甚至可能起负作用 原本对“德牧能不能进机场”这样的问题&#xff0c;ChatGPT是高度认可德牧作为导盲犬的但是检索模块召回了一段“老德牧是一类 balabala 某种狗的争议性名称”的百科介绍作为额外上文输入后&am…

使用Postman进行API测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Postman进行API测试 Postman 简介 安装 Postman 创建请求 组织请求 发送请求 查看响应 使用环境变量 编写测试脚本 示例测试…

鸿蒙系统的优势 不足以及兼容性与未来发展前景分析

2024 年 10 月 22 日&#xff1a;华为正式发布原生鸿蒙操作系统 HarmonyOS next&#xff0c;并正式命名为 HarmonyOS 5&#xff0c;这是鸿蒙系统史上最大的升级&#xff0c;实现了国产操作系统从底层架构到应用生态的全面自主可控。 鸿蒙系统与安卓、iOS 相比&#xff0c;具有…

MT1421-MT1430 码题集 (c 语言详解)

目录 MT1421异或 MT1422总位数 MT1423被3整除 MT1424卡特兰序列 MT1425小码哥的序列 MT1426普洛尼克数 MT1427素数序列 MT1428最小素数因子 MT1429最小正整数 MT1430回文数组 MT1421异或 给定一个由N(<1000)个整数组成的数组&#xff0c;把数组元素任意两两进行异或&#x…

游游的游戏大礼包

游游的游戏大礼包 import java.util.*; public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);long n in.nextInt();long m in.nextInt();long a in.nextInt();long b in.nextInt();long ret 0;for(long x 0; x < Math.…

SpringBoot框架:作业管理系统构建之道

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有管…

Python小游戏19——滑雪小游戏

运行效果 python代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("滑雪小游戏") # 定义颜色 WH…

自定义规则配置教程

大家在使用waf的时候&#xff0c;因为业务特殊性和waf的严格校验&#xff0c;有时会产生误报&#xff0c;阻拦合法流量。 这个时候&#xff0c;只能通过自定义规则进行补充&#xff0c;选择加白名单或者黑名单。 很多人会说配置黑白名单失效了&#xff0c;其实95%以上都是自己…

HarmonyOS ArkTS Web组件jsbridge

1. HarmonyOS ArkTS Web组件jsbridge 1.1. Web组件引入和调用JS库 关于ts可以调用JS库&#xff0c;可以使用以下几种方式&#xff1a;文档中心&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkweb-kit-V5 1.1.1. 鸿蒙系统H5 JSBridge的…

C++笔试题之实现一个定时器

一.定时器&#xff08;timer&#xff09;的需求 1.执行定时任务的时&#xff0c;主线程不阻塞&#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用&#xff0c;一个timer需要能够管理多个定时任务&#xff0c;所以timer要支持增删任务…

DICOM标准:CR图像模块属性详解——计算放射线照相术(CR)及其在DICOM中的表示

目录 CR图像及其在DICOM中的表示 1 计算放射线照相术 1.1 CR序列组件 1.1 -- CR 序列模块属性 1.2 CR 图像模块 表1.2 -- CR 图像模块属性 结论 CR图像及其在DICOM中的表示 计算放射线照相术&#xff08;Computed Radiography, CR&#xff09;是一种利用计算机技术对传统…

[Prometheus学习笔记]从架构到案例,一站式教程

文章目录 Prometheus 优势Prometheus 的组件、架构Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标&#xff0c;它在本地存储所有抓取到的样本数据&#xff0c;并对此数据执行一系列规则&#xff0c;以汇总和记录现有数据的新时间序列或生成告警。可以通…

Javaweb梳理3——SQL概述+DDL语句1

Javaweb梳理3——SQL概述DDL语句1 Javaweb梳理3——SQL概述DDL语句13.1 SQL简介3.2 通用语法3.3 SQL分类3.4 DDL:操作数据库3.4.1 查询数据库3.4.2 创建数据库3.4.3 删除数据库3.4.4 使用数据库 Javaweb梳理3——SQL概述DDL语句1 3.1 SQL简介 英文&#xff1a;Structured Que…

HarmonyOS Next星河版笔记--界面开发(2)

ArkUI-界面开发 位置&#xff1a;在build(){}中去编写代码 //以前学基础 ->写代码的位置&#xff08;页面顶部&#xff09; Entry Component struct Index {State message: string Hello World; //构建 -> 页面build() {//行//列RelativeContainer() {//文本 函数名&a…

使用PostgreSQL进行高效数据管理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…

vue3学习记录-单文件组件 CSS 功能

vue3学习记录-单文件组件 CSS 功能 1.组件作用域 CSS1.1为什么要用到样式穿透&#xff08;&#xff1a;deep&#xff08;&#xff09;&#xff09;1.2 插槽选择器:slotted(div)1.3 全局选择器:global 2.CSS Modules2.1 基本用法2.2 自定义注入名称2.3 与组合式 API 一同使用 3.…

3.1 快速启动Flink集群

文章目录 1. 环境配置2. 本地启动3. 集群启动4. 向集群提交作业4.1 提交作业概述4.2 添加打包插件4.3 将项目打包4.4 在Web UI上提交作业4.5 命令行提交作业 在本实战中&#xff0c;我们将快速启动Apache Flink 1.13.0集群&#xff0c;并在Hadoop集群环境中提交作业。首先&…

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …