使用右侧值现象来处理一个word导入登记表的需求

需求也简单,导word文件用户登记表,有各部门的十几个版本(为什么这么多?不知道)。这里说下谈下我的一些代码做法:
在这里插入图片描述

需求分析:
如果能解决java字段和各项填的值怎么配对的问题,那么就好办了。

经分析,配对问题采用了一种右侧值的思路,即:全部的字段项都是 姓名–>张三 ,也就是左侧是中文key,右侧是value这种型式。这个是确认过的。只要按这个规律,配对是不成问题的。

做法如下:
第一步,模板定义,将每个模板的中文名与java字段名进行对应,这里因为模板和硬编码较多,每个模板我放到xml中定义了。
templateCode:模板code
templateName:模板名称
processor: 执行保存任务的执行器
table index=“2”:word模板里面的第几张表,有的模板有多张说明表。要说明取第几张。


<?xml version="1.0" encoding="UTF-8" ?><!ELEMENT template (table+)><!ATTLIST template templateCode #REQUIRED><!ATTLIST template templateName   #REQUIRED><!ATTLIST template processor   #REQUIRED><!ELEMENT table (cell-single+,cell-collection+)><!ATTLIST table index (1|2|3|4|5) ><!--单个k-v值--><!ELEMENT cell-single EMPTY><!ATTLIST cell-single sort (1|2|3|4|5)  ><!ATTLIST cell-single chinaName #REQUIRED><!ATTLIST cell-single propName #REQUIRED><!ATTLIST cell-single location   (right|under)  ><!--子表集合或其他集合--><!ELEMENT cell-collection (start-header+,end-header+)><!ATTLIST cell-collection subTableCode #REQUIRED><!ATTLIST cell-collection subTableName  #REQUIRED><!ELEMENT start-header EMPTY><!ATTLIST start-header headerName   #REQUIRED><!ATTLIST start-header propName  #REQUIRED><!ELEMENT end-header EMPTY><!ATTLIST end-header headerName  #REQUIRED><?xml version="1.0" en
coding="UTF-8" ?>
<!DOCTYPE template SYSTEM "uniter_import.dtd">
<template templateCode="mingZhu" templateName="民主党派代表人士信息采集表" processor="mingZhuImportUniterProcessor"><table index="2"><cell-single chinaName="姓名" propName="userName"/><cell-single chinaName="性别" propName="sex"/><cell-single chinaName="出生年月" propName="birthday"/><cell-single chinaName="民族" propName="nation"/><cell-single chinaName="籍贯" propName="nativePlace"/><cell-single chinaName="出生地" propName="birthPlace"/><cell-single chinaName="加入党派时间" propName="joinPartyDate"/></table>
</template>

第二步:
解析导入的数据,可使用XWPFDocument 工作来解析docx,TableIterator来解析doc。该工具还可以把那个寸照解析出来,挺好用的。正常的坐标–>值封装成List集合,

@Data
public class TableCellValue {private int row; // 行private int col;  // 列private String cellValue;

第三步,根据xml配置的模板表头,读取到表头的坐标。以姓名为例,假如得到姓名–>(0,0)的坐标。那么姓名的value值必定出现在(张三)–>(1,0),据此可得所有的value值都是(col+1,row),从而解析出姓名=张三,年龄=18 k->v对集合。

第四步,根据姓名=张三对和模板配置的属性对应关系,得到userName–>张三,age–>18。然后构建实体,保存数据。

经实际使用,效果还可以,导了一批2千多用户的存量数据。没出啥问题。但有时会存在一个表头和value相等的BUG。导致读不到正确的表头位置。实际也有人工介入修正的情况。但极少。该功能主要也是做系统上线之初的数据初始化。后面用得较少。也可以接受。

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

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

相关文章

Day48(补)【AI思考】-设计模式三大类型统一区分与记忆指南

文章目录 设计模式三大类型统一区分与记忆指南**一、创建型模式&#xff08;对象如何生&#xff1f;&#xff09;****二、结构型模式&#xff08;对象如何组&#xff1f;&#xff09;****三、行为型模式&#xff08;对象如何动&#xff1f;&#xff09;****1. 行为型类模式&…

Rook-ceph(1.92最新版)

安装前准备 #确认安装lvm2 yum install lvm2 -y #启用rbd模块 modprobe rbd cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules do[ -x \$file ] && \$file done EOF cat > /etc/sysconfig/modules/rbd.modules &l…

Transformer技术报告:架构与原理

【深度学习】Transformer 技术报告&#xff1a;架构与原理 一、引言二、Transformer 的基本架构2.1 总体架构2.2 编码器&#xff08;Encoder&#xff09;2.3 解码器&#xff08;Decoder&#xff09;2.4 输入嵌入与位置编码 三、Transformer 的关键特性四、应用场景五、总结 一、…

电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案

作者背景 拥有8年乙方项目经理经验、8年甲方信息化管理经验&#xff0c;主导过12个Odoo制造业项目落地&#xff0c;服务客户涵盖消费电子、汽车电子、工业设备等领域。本文基于华东某电子企业&#xff08;以下简称"A公司"&#xff09;的实战案例&#xff0c;解析行业…

【实战】用飞书多维表格+AI DeepSeeker做股票量价分析

用2万元起步资金&#xff0c;进行A股实战模拟。&#xff08;量化分析无法知晓 消息面的事宜&#xff0c;是一个不足&#xff0c;但是可以代替 哪些一般水平的 股票分析师&#xff09; https://zk4wn8rhv2.feishu.cn/base/OABmbEBa4a4zgOsw5JlcrfIPnzh?tabletblMK2bDhPW5Am9b&a…

计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程

该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…

Vue 记录用户进入页面的时间、离开页面的时间并计算时长

在 Vue 项目中&#xff0c;要记录用户进入页面的时间、离开页面的时间&#xff0c;并在用户离开时计算时长并调用后端接口&#xff0c;可以借助 Vue 的生命周期钩子和浏览器的一些事件来实现。以下是具体的实现步骤和示例代码&#xff1a; 实现思路 记录进入时间&#xff1a;…

蓝桥杯单片机基础部分——单片机介绍部分

前言 这个部分是额外的&#xff0c;我看我有的学弟学妹基础比较差&#xff0c;对板子上面的模块不太熟悉&#xff0c;这里简单的介绍一下 蓝桥杯单片机 这个就是蓝桥杯单片机的板子&#xff0c;它的主控芯片是&#xff08;IAP15F2K61S2&#xff09;&#xff0c;这里就对他常用…

场外个股期权下单后多久成交?场外个股期权对投资组合的影响

对普通老板们而言&#xff0c;它如同精密手术刀——用得好可精准优化投资组合&#xff0c;用不好则可能伤及本金。记住两个关键&#xff1a;一是永远用"亏得起的钱"参与&#xff0c;二是把合约条款当"药品说明书"逐字研读。 场外个股期权下单后多久成交&am…

sqlserver多表查询(内连接,外连接)

1.简单两表查询 2.内连接查询&#xff1a;两张表 3.内连接查询&#xff1a;三张表 4.外连接查询&#xff1a;左外联&#xff0c;右外联同理 5.全外联 6.自连接 一个表中某些数据有关联&#xff0c;相当于把一张表拆成了两张表

SQL Server 运算符优先级

在 SQL Server 中&#xff0c;运算符的优先级决定了在没有使用括号明确指定计算顺序时&#xff0c;运算符的执行顺序。 运算符优先级列表 括号 () 一元运算符 &#xff08;正号&#xff09;-&#xff08;负号&#xff09;~&#xff08;按位取反&#xff09; 乘法、除法和取模…

黑马JS教程笔记(JavaScript教程)——JS基础

黑马pink老师-JavaScript基础语法 黑马程序员前端JavaScript入门到精通全套视频教程&#xff0c;javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 文章目录 ~~黑马pink老师-JavaScript基础语法~~001-计算机编程基础002-计算机编程基础编程语言和标记语言区别 00…

LabVIEW用CANopen的设备属性配置与心跳消息和PDO读取

本示例展示了如何通过SDO&#xff08;服务数据对象&#xff09;配置设备属性&#xff0c;以及如何读取从设备周期性发送的心跳消息和PDO&#xff08;进程数据对象&#xff09;消息。通过该示例&#xff0c;可以有效地进行设备配置并实现数据监控&#xff0c;适用于CANopen网络中…

北斗导航 | 周跳探测算法(matlab源码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 周跳 1. 高次差法2. 相位减伪距法3. TurboEdit算法(MW+GF组合)4. 多项…

【区块链】深入理解椭圆曲线密码学(ECC)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…

JavaScript系列(75)--代理模式专题

JavaScript代理模式专题 &#x1f3ad; JavaScript的Proxy提供了强大的对象代理能力&#xff0c;能够拦截和自定义对象的基本操作。本文将深入探讨Proxy的各种模式、应用场景和最佳实践。 代理基础 &#x1f31f; &#x1f4a1; 小知识&#xff1a;代理模式允许我们创建一个对…

如何优化Spark作业的性能

优化Spark作业的性能是一个综合性的任务&#xff0c;涉及多个方面的调整和优化。以下是一些关键的优化策略&#xff1a; 一、开发调优 避免创建重复的RDD&#xff1a; 对于同一份数据&#xff0c;只应该创建一个RDD&#xff0c;避免多次创建RDD来增加性能开销。在对不同的数据…

SOCKET建立简单的tcp服务端与客户端通信

socket是什么 socket可以使两台机子建立连接&#xff0c;就像连接风扇与电源的插座一样&#xff0c;socket可以使服务端与客户端建立连接&#xff0c;服务端就像供电厂&#xff0c;而客户端就像用电器&#xff0c;而socket就是连接二者的插座。 建立简单的连接 如果我们想在客…

blender笔记2

一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式&#xff1a;反方&#xff0c;相对于&#xff1a;场景原点&#xff0c;对齐&#xff1a;z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后&#xff0c;物体面有阴影。 数据-&g…

如何正确安装Stable Diffusion Web UI以及对应的xFormers

本文是我总结的步骤&#xff0c;验证了几次保证是对的。因为正确的安装 Stable Diffusion Web UI 以及对应的 xFormers 实在是太麻烦了&#xff0c;官方和网上的步骤都是残缺和分散的&#xff0c;加上国内网络速度不理想&#xff0c;所以需要一些额外步骤&#xff0c;之前研究出…