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)


相关推荐

  • JDK安装与环境变量配置「建议收藏」

    JDK安装与环境变量配置「建议收藏」下载JDK到Oracle官网下载JDK安装JDK安装JDK时,除了修改安装目录,其他的一路【下一步】,傻瓜式安装。注:当提示安装JRE时,可以选择不要安装。因为JDK已经自带了JRE。安装JDK测试JDK是否安装成功在配置好环境变量后,可以进入cmd中检查Java是否安装正确,检查的命令为java-versionJDK安装成功环境变量详解JAVA_HOME…

  • Java stream 求和_JAVA求和

    Java stream 求和_JAVA求和BigDecimal:BigDecimalbb=list.stream().map(Plan::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add);int、double、long:doublemax=list.stream().mapToDouble(User::getHeight).sum();…

  • FASTAI_AI领域

    FASTAI_AI领域Fastai简介在深度学习领域,最受学生欢迎的MOOC课程平台有三个:Fast.ai、deeplearning.ai/Coursera和Udacity。Fastai作为其中之一,是一个课程平台,一个讨论社区,也是一个PyTorc的顶层框架。Fastai的理念就是:Makingneuralnetsuncoolagain,让神经网络没那么望而生畏,其课程也是采用项目驱动的方式教学。经过Fa…

  • SVN服务器部署「建议收藏」

    SVN服务器部署「建议收藏」1,关闭防火墙或者开放对应端口3690,2,Yum下载安装subversion检查SVN是否安装成功svnserve–version3,建立SVN版本库3.1因为大磁盘挂载在/home下,所以我是在/home下创建的版本库,mkdir/home/svn创建一个文件夹(所有项目库都在此目录下创建)3.2创建svn版本库svnadmincreate/home/svn/liangz_artliangz_art才是项目版本库的名字,后面开发人员checkout时就要用这个名称,项

  • mysql 拼接字符_mysql将字符串和数字拼接

    mysql 拼接字符_mysql将字符串和数字拼接数据准备CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`account`varchar(100)DEFAULTNULL,`password`varchar(100)DEFAULTNULL,`type`tinyint(4)DEFAULTNULL,PRIMARYKEY(`id`),UNIQUEKEY`acc…

  • 【离散数学】平面图

    【离散数学】平面图介绍图论中的平面图

发表回复

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

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