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;
    }

代码链接

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java关键字:fianl的一些简单的用法

    java关键字:fianl的一些简单的用法

    2021年5月24日
    219
  • aspnet登录验证_云盾网络验证源码

    aspnet登录验证_云盾网络验证源码由于比较简单,话不多说,直接上菜!1.Employee类publicclassEmployee{publicintId{set;get;}[StringLength(10,MinimumLength=10)]publicstringName{set;get;}[RegularExpre

    2022年9月29日
    2
  • 10款常用Java测试工具

    10款常用Java测试工具 10款常用Java测试工具1.美国Segue公司的Silk系列产品   Segue公司一直专注于软件质量优化领域。在Segue的产品套件中,拥有业内最强劲且最容易使用的、用于企业应用测试、调优和监测的自动化工具,能够帮助用户保障应用在其生命周期内的可靠性和性能。  (1)SilkPerformer——企业级性能测试工具  企业级自动化测试工具能够支持多种系统,如Java、….

    2022年10月17日
    3
  • 【python】如何使用pip安装、卸载包

    【python】如何使用pip安装、卸载包1、在安装python的时候要把pip勾选上(默认安装时勾选的)。这样你就已经安装了pip。2、打开命令提示符窗口开始→所有程序→附件→运行(快捷键Win+R),在对话框中输入cmd,回车确认即可3.安装想要的包。具体名称可以上PyPI或输入pipsearchXX确认一下,比如numpy。平常使用的过程中经常将其简写成np,在这里安装的时候不能简写,只能用numpy。

    2022年10月16日
    2
  • MySQL数据库优化的八种方式(经典必看)

    MySQL数据库优化的八种方式(经典必看)MySQL数据库优化的八种方式(经典必看)引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助 1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库…

    2022年5月25日
    133
  • linux tar压缩文件命令,tar打包压缩文件命令

    linux tar压缩文件命令,tar打包压缩文件命令tar命令tar命令用于将多个文件合成1个文件,wiki中把这个命令和cpio、shar等一起叫做archive文件,个人理解是归档,合成一个文件,后就可以用gzip、bz2、xz等工具进行压缩,同时也能方便在各个计算机间传输,有点类似windows下共享的zip文件。wiki上这个图比较形象,tar把零散的文件合拢,gzip把合拢的文件压缩。一、命令语法tar[选项…][FILE]…..

    2022年5月22日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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