2021.8.19
上次实现了批量导入,最近太忙拖到现在才更新
2021.8.13
实习期间导师给我分配了个小任务
把xml文件中的字段内容腾到excel中,中间涉及一些对于数据的分析抽取等,但都有规可循,有道是 懒是编程发展的原动力,所以我自己做了一个小demo实现了以上功能的自动化

目录

  • 实现效果
  • Java解析XML文件
  • 源数据到填入Excel数据的转换
  • 自动写入Excel
  • 批量导入文件并自动写入
  • 代码链接

实现效果

xml文件大致是这样的

手动录入大致是这样的

程序实现
控制台输出

写入文件

我把整个功能剖成三部分

  • Java解析XML文件
  • 源数据到填入Excel数据的转换
  • 自动写入Excel

Java解析XML文件

先来看Java解析XML文件的部分,Java解析XML文件的方式有四五种,我这里是通过DOM4J实现的

1.先导入Maven依赖

<!-- dom4j -->
<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version>
</dependency>

2.编写实体类
为了方便后续的操作,我写了个实体类存储从xml中读取出来的数据
get set 和 tostring 方法太长了,就不再列出来了

package com.hao.pojo;public class Data {private String id;private String fieldName;private String note;private String parentid;private String parentValue;private String defaultValue;private String name;private String value;private int sortNum;public String getId() {return id;}
}

3.解析xml文件的方法

//从xml获取数据
public List<Data> getDataList(File file){List<Data> dataList = null;Data data = new Data();//搜索优先级int sortNum = 0;//创建一个SAXReader对象SAXReader reader = new SAXReader();try {Document document = reader.read(file);//获取根节点Element eumpGroup = document.getRootElement();List<Attribute> groupAttributes = eumpGroup.attributes();dataList = new ArrayList<Data>();Iterator gruopit = eumpGroup.elementIterator();while(gruopit.hasNext()){data = new Data();for (Attribute groupAttribute:groupAttributes){if (groupAttribute.getName().equals("id")){String id = groupAttribute.getValue();data.setId(id);}else if(groupAttribute.getName().equals("fieldName")){String fieldName = groupAttribute.getValue();data.setFieldName(fieldName);}else if(groupAttribute.getName().equals("note")){String note = groupAttribute.getValue();data.setNote(note);}else if(groupAttribute.getName().equals("parentid")){String parentid = groupAttribute.getValue();data.setParentid(parentid);}else if(groupAttribute.getName().equals("parentValue")){//校验while (groupAttribute.getValue()==null){String parentValue = "0";}String parentValue = groupAttribute.getValue();data.setParentValue(parentValue);}else if(groupAttribute.getName().equals("defaultValue")){String defaultValue = groupAttribute.getValue();data.setDefaultValue(defaultValue);}}Element dataElement = (Element) gruopit.next();//遍历dataElement的属性List<Attribute> attributes = dataElement.attributes();for(Attribute attribute : attributes){if(attribute.getName().equals("name")){String name = attribute.getValue();//System.out.println(id);data.setName(name);}else if(attribute.getName().equals("value")){String value = attribute.getStringValue();data.setValue(value);}}//设置sortNumdata.setSortNum(++sortNum);dataList.add(data);data = null;}} catch (DocumentException e) {e.printStackTrace();}return dataList;
}

4.测试

    public static void main(String[] args) {ParseXMLByDom4j parseXMLByDom4j = new ParseXMLByDom4j();//从文件读取数据File file = new File("src/main/resources/data.xml");System.out.println("==========================================");System.out.println("正在从xml中读取数据");System.out.println("==========================================");List<Data> dataList = parseXMLByDom4j.getDataList(file);System.out.println("读取成功,数据如下");System.out.println("==========================================");for(Data data : dataList){System.out.println(data);}}

源数据到填入Excel数据的转换

1.仍旧先编写了一个实体类,get set tostring 省略

package com.hao.pojo;public class FinalData{private String conftype;private String id;private String name;private String nameUS;private String nameTW;private String parentId;private String dataType;private String dataValue;private int sortNum;private int clickable;private String ruleRegs;private String proId;private String proName;
}

2.编写转换方法,这个就很简单,常量我单独放在Constant类中了

  • getFinalData方法
    public List<FinalData> getFinalData(List<Data> dataList,String conftype){List<FinalData> finalDataList = new ArrayList<FinalData>();for (Data data:dataList){FinalData finalData = new FinalData();finalData.setConftype(conftype);finalData.setId(data.getValue());finalData.setName(data.getName());finalData.setNameUS(data.getName());finalData.setNameTW(data.getName());finalData.setParentId(data.getParentValue());finalData.setDataType(Constant.DATA_TYPE);finalData.setDataValue(data.getValue());finalData.setSortNum(data.getSortNum());finalData.setClickable(Constant.CLICKABLE);finalData.setRuleRegs(Constant.RULE_REGS);finalData.setProId(Constant.PRO_ID);finalData.setProName(Constant.PRO_NAME);finalData.setStatus(Constant.STATUS);finalDataList.add(finalData);}return finalDataList;}
  • 常量
public class Constant {public static final String DATA_TYPE = "string";public static final int CLICKABLE = 1;public static final String RULE_REGS = null;public static final String PRO_ID = "common";public static final String PRO_NAME = "公共";public static final int STATUS = 1;
}

3.测试即可

//数据的转换
System.out.println("==========================================");
System.out.println("正在将原数据转换成写入excel的数据");
System.out.println("==========================================");
List<FinalData> finalDataList = parseXMLByDom4j.getFinalData(dataList,"hn001_event_checkreason");
System.out.println("转换成功,数据如下");
System.out.println("==========================================");for (FinalData finalData:finalDataList){System.out.println(finalData);
}

自动写入Excel

1.自动写excel我用了阿里云的easyexcel,先导入依赖

<!-- easyexcel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version>
</dependency>

2.编写一个excel表头部的实体类,最好保持跟最终录入数据的属性名一致,会自动匹配

public class ColumnName implements Serializable {@ExcelProperty(value = "conftype(字典类型)",index = 0)private String conftype;@ExcelProperty(value = "id(字典id)",index = 1)private String id;@ExcelProperty(value = "name(字典名称)",index = 2)private String name;@ExcelProperty(value = "nameUS(英文)",index = 3)private String nameUS;@ExcelProperty(value = "nameTW(繁体)",index = 4)private String nameTW;@ExcelProperty(value = "parentId(字典的父级id)",index = 5)private String parentId;@ExcelProperty(value = "dataType",index = 6)private String dataType;@ExcelProperty(value = "dataValue",index = 7)private String dataValue;@ExcelProperty(value = "sortNum(排序数字越小越靠前)",index = 8)private int sortNum;@ExcelProperty(value = "clickable",index = 9)private int clickable;@ExcelProperty(value = "ruleRegs",index = 10)private String ruleRegs;@ExcelProperty(value = "proId(域id)",index = 11)private String proId;@ExcelProperty(value = "proName(域名称)",index = 12)private String proName;@ExcelProperty(value = "status",index = 13)private int status;
}

3.写数据(其实就两行代码,阿里真牛逼)

//向excel中写入数据
String fileName="E:\\write\\write.xlsx";//调用aliyun的EasyExcel库完成向excel写值操作
//写入数据,filename为sheet的名字,ColumnName为刚刚编写的工具类,用来写表头
EasyExcel.write(fileName, ColumnName.class).sheet("数据录入").doWrite(finalDataList);}

Over!

批量导入文件并自动写入

  • 其实也没加多少东西,就是

    • 获取指定文件夹的文件名称存储为列表
    • 遍历列表获取文件名依次解析并转换
    • 剩下的就跟上述一致了
    • 对了,由于要实现多个文件的写入,我把写excel的过程中,写表头的部分分化了出来,并对mytest代码进行了简单的优化,其实优化完也比较乱,但是完成需求,足矣
  • 获取指定文件夹的文件名称存储为列表的方法

    //获取文件夹文件列表public List<String> getFileList(String path){File file = new File(path);List<String> fileList = new ArrayList<String>();;// 如果这个路径是文件夹if (file.isDirectory()) {// 获取路径下的所有文件File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {// 如果还是文件夹 递归获取里面的文件 文件夹if (files[i].isDirectory()) {System.out.println("已跳过文件夹:" + files[i].getPath());} else {fileList.add(files[i].getPath());}}} else {fileList.add(file.getPath());}return fileList;}

代码链接

Java解析XML并自动写入Excel相关推荐

  1. java解析xml文件并写入Excel表

    解析xml文件并写入Excel表 类似于如下格式的xml数据,解析之后将数据写入Excel中 <?xml version="1.0" encoding="UTF-8 ...

  2. 在java解析XML写入到数据库中遇到的问题

    用java程序解析XML写入到MYSQL中遇到了很多问题. 1,关于XML JAVA解析XML的时候,一定要处理没有读取到XML.读取到XML但是里面的元素节点不存在的问题,不然会出很多问题. 2.数 ...

  3. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  4. Java 解析 XML

    Java 解析 XML 标签: Java基础 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本等元素都封装成树的节点对象 优点 ...

  5. Java解析Xml的三种方式总结

    转自:http://blog.csdn.net/zjf280441589/article/details/50613881 XML解析技术有两种 DOM SAX DOM方式  根据XML的层级结构在内 ...

  6. Java解析XML(DOM解析和SAX解析)

    前言:在程序中访问和操作XML文件一般有两种模型:DOM(文档对象模型)和流模型:在本篇文章中分别对应DOM解析和SAX解析. 目录 1 .DOM解析与SAX解析的相关知识点 1.1 DOM 1.2 ...

  7. JAVA解析xml的五种方式比较

    1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分,是W3C的官方标准[优点]①允许应用 ...

  8. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  9. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax;import org.xml.sax.Attributes; import org.xml.sax.SAXEx ...

  10. xml教程之java解析xml文档

    1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...

最新文章

  1. qmainwindow键盘监听
  2. java db 10.4.13_Spring Data MongoDB 1.10.13和Mongo 3.4
  3. docker部署Redmine项目管理平台
  4. PoW 本质上是个去中心化的时钟
  5. c#中bin,obj,properties文件夹的作用
  6. windows7 安装MySQL 解决报错 服务没有响应控制功能
  7. OpenCV4每日一练day8:模型投影函数projectPoints()
  8. exchange2010查询用户邮箱配额、设置用户邮箱配置的方法
  9. 使用NAT网关挂载本地物理机
  10. PCL点云库:ICP算法
  11. Kotlin 1.0 正式版发布啦
  12. 【紫书第七章】暴力美学(能用暴力解决的事情为什么要动脑子?)
  13. id长度 雪花算法_GitHub - cloudyan/snowflake: Twitter的雪花算法(snowflake)分布式自增ID...
  14. 最新传奇游戏公司网站模板源码+带手机端/易优CMS内核
  15. Maven依赖冲突避坑指北
  16. 电脑键盘及excel快捷键
  17. BOC保护的色氨酸卟啉化合物(TAPP-Trp-BOC)桃红色固体162.8mg供应-齐岳供应
  18. 验证码集合_您网站的免费验证码集合
  19. 新技术表明通过观察灯泡振动可进行窃听,以后聊天得拉窗帘
  20. RealsenseD415/D435深度相机常用资料汇总

热门文章

  1. 安装Fortran语言编程环境全流程记录
  2. hadoop开发步骤
  3. 工具使用篇–typora+picGo实现图片上传
  4. 学校校园无盘教学系统
  5. 基于Paddle Serving百度智能边缘BIE的边缘AI解决方案
  6. Java语言程序设计(基础篇)
  7. 学科分类与代码_考研常识 | 2021硕士研究生学科门类、一级学科、二级学科、专业目录及代码查询...
  8. 怎么下c语言程序,最新VC++(c语言程序下载安装)下载地址电脑版-CC软件
  9. 电子通信计算机行业分类,电子信息产业行业分类目录
  10. 汇编语言 王爽 第四版 实验4