Java解析XML并自动写入Excel

Java解析XML并自动写入Excel实习期间导师给我分配了个小任务把xml文件中的字段内容腾到excel中,中间涉及一些对于数据的分析抽取等,但都有规可循,有道是懒是编程发展的原动力,所以我自己做了一个小demo实现了以上功能的自动化目录实现效果Java解析XML文件源数据到填入Excel数据的转换自动写入Excel实现效果xml文件大致是这样的手动录入大致是这样的程序实现控制台输出写入文件我把整个功能剖成三部分Java解析XML文件源数据到填入Excel数据的转换自动写入ExcelJava解析XM.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

实现效果

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);
}
}
//设置sortNum
data.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;
}

代码链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171954.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java序列化和反序列化以及序列化ID的作用分析

    java序列化和反序列化以及序列化ID的作用分析java序列化和反序列化以及序列化ID的作用分析

  • JSP热部署的实现原理[通俗易懂]

    JSP热部署的实现原理[通俗易懂]一.             概述名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个

  • 头文件string的作用_cstring头文件的作用

    头文件string的作用_cstring头文件的作用1.string与cstring有什么区别&lt;string&gt;是C++标准库头文件,包含了拟容器classstd::string的声明(不过classstring事实上只是basic_string&lt;char&gt;的typedef),用于字符串操作。&lt;cstring&gt;是C标准库头文件&lt;string.h&gt;的C++标准库版本,包含了C风格字符串(NUL即’\0…

  • 用计算机亩换算成平方,亩平米换算(平方米换算亩计算器)[通俗易懂]

    1平方米(㎡)=0.0015亩1亩=666.6666667平方米(㎡)平方米(㎡,英文:.方英里=10.763910417平方英尺=0.0015亩单位换算就是把平方米换算成平方分米、平方厘.使用国家规定的换算公式来进行换算。基本单位数量换算(按使用频率排序)。1亩=666.67平方米100平方米=0.15亩——就是农民朋友口语说的一分半地。1000平方米=1..1公顷=100公亩=10000平方…

  • vue 的双向绑定原理「建议收藏」

    vue 的双向绑定原理「建议收藏」vue采用“数据劫持”和“观察者模式(又叫做发布者-订阅者模式)”相结合的方式,通过Object.defineProperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。vue的双向绑定原理,分三步:第一步,“数据劫持”:vue用Object.defineProperty()方法实现数据劫持,为每个属性分配一个订阅者集合的管理数组dep; 第二步,“添加观察者”:在编译的时候在该属性的数组dep中添加订阅者,添加方式包括:v

  • 一码中_amp是什么意思

    一码中_amp是什么意思每日一码将每天看到的优秀的代码或者特别的实现,记录下来a&b赋值问题_2019218_Q&Aa.x//这时a.x的值是多少?b.x//这时b.x的值是多少

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号