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

使用右侧值现象来处理一个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。导致读不到正确的表头位置。实际也有人工介入修正的情况。但极少。该功能主要也是做系统上线之初的数据初始化。后面用得较少。也可以接受。

相关文章:

  • 【认证授权FAQ】SSL/TLS证书过期导致的CLS认证失败
  • ArcGISPro 新建shp+数据结构
  • STM32 Flash详解教程文章
  • uniapp商城之首页模块
  • rancher on k3s
  • kafka介绍,kafka集群环境搭建,kafka命令测试,C++实现kafka客户端
  • 机器学习数学基础:24.随机事件与概率
  • 黑马SpringCloud微服务课程总结(二)
  • Stable Diffusion 安装教程(附安装包) 【SD三种安装方式,Win+Mac一篇文章讲明白】
  • JVM——类的生命周期
  • 【Getting Started】-时间复杂度-Time Complexity
  • 前瞻技术:塑造未来生活的新趋势
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第八节】
  • 宠物企业宣传网站静态模板 – 前端静态页面开发实例
  • 国密算法SM1、SM2、SM3和SM4 具体的使用和区别
  • 【物联网】电子电路基础知识
  • Linux执行一条命令并自动重试直到成功,自动化脚本
  • 无人机遥感图像拼接软件有哪些?无人机遥感图像采集流程;遥感图像拼接的一般流程
  • EventSource的使用
  • 动态规划LeetCode-494.目标和
  • 经济日报刊文:品牌经营不能让情怀唱“独角戏”
  • 方正证券总裁何亚刚到龄退休,54岁副总裁姜志军接棒
  • 上海消防全面推行“检查码”,会同相关部门推行“综合查一次”
  • 大风暴雨致湖南岳阳县6户房屋倒塌、100多户受损
  • 探索人类的心灵这件事,永远也不会过时
  • 金价大反攻,国内金饰价格涨回千元,能否重返巅峰?