大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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账号...