当前位置: 首页 > article >正文

使用右侧值现象来处理一个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.kler.cn/a/551290.html

相关文章:

  • 像素绽放PixelBloom(AiPPT.com) 联合创始人蒲世林:创新者的窘境就是新物种的机会
  • 代码随想录day12
  • 【第1章:深度学习概览——1.6 深度学习框架简介与选择建议】
  • DeepSeek-R1本地部署详细指南!(Ollama+Chatbox AI+Open WebUI)
  • 开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码
  • DeepSeek教unity------MessagePack-04
  • 零基础学QT、C++(一)安装QT
  • 深入解析 Vue 3 编译宏:揭开 `<script setup>` 的魔法面纱
  • 力扣-二叉树-513 找二叉树左下角的值
  • python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
  • Qt creater 出现“启动程序失败,路径或者权限错误”解决方法
  • gozero实现数据库MySQL单例模式连接
  • Linux探秘坊-------8.进程详解
  • PyTorch入门实战:从零搭建你的第一个神经网络
  • (尚硅谷 Java 学习 B 站大学版)Day17 多态练习
  • 001-监控你的文件-FSWatch-C++开源库108杰
  • 以用户为中心,汽车 HMI 界面设计的创新之道
  • MySQL智障离谱问题,删了库确还存在、也不能再创建同名库
  • 【Pytorch 库】自定义数据集相关的类
  • 基于Unity引擎的网络通信架构深度解析——以NetworkConnectionController为例