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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开源项目之架构分享[通俗易懂]

    开源项目之架构分享[通俗易懂]此次分享是我当初在开发某个系统时,参考的一些开源项目架构的思路和风格。第一个是Jeesite,它的架构风格如下:大家如果对jeesite感兴趣的话,可以百度搜索找到,不过那已经是半年多以前的事情,jeesite目前也发生较大的变化。当初我在参考jessite这个思路时,不知道是什么原因使我没有加入module,其实从现在的角度出发,加上module也是一件不错的事情,modu…

    2022年7月28日
    5
  • 列文伯格算法_最短路径matlab程序

    列文伯格算法_最短路径matlab程序  本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示。  一、A*算法简介    A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。    公式表示为:f(n)=g(n)+h(n),其中,f(n)是从初始状态经由状态n到目标状态的代价估计,g(n)是在状态空间中从初始状态到状态n的实际代价,h(n)是从状态n到目标状态的最佳路径的估计代价。

    2022年10月7日
    0
  • html css制作404页面,一款纯css3实现的漂亮的404页面

    html css制作404页面,一款纯css3实现的漂亮的404页面实现的代码。html代码:404ERRORLost?MaybeIcanhelp.required/>SearchMySuggestions.HomePortfoliocss3代码:body{background-color:#0A7189;color:#fff;font:100%”Lato”,sans-serif;font-size:1.8r…

    2022年7月27日
    1
  • MySQL自定义函数实例「建议收藏」

    MySQL自定义函数实例「建议收藏」关于MySQL函数的基本内容,网上有很多的资料,仅在此整理一些有价值的sql实例,以方便自己阅读,见例子便知内容。1.求两点之间的距离?DELIMITER//CREATEFUNCTIONdistance_fn(x1DOUBLE,y1DOUBLE,x2DOUBLE,y2DOUBLE)RETURNSDOUBLEBEGINSET@distanc…

    2022年9月7日
    0
  • 宽带猫改成桥接模式_电信光猫路由模式

    宽带猫改成桥接模式_电信光猫路由模式目前大多数家庭宽带默认是在光猫直接拨号上网的,如果你想要改为自己的路由器拨号比较麻烦,需要光猫的超级管理员账号才可以进后台修改,但是光猫的超级管理员账号会被运营商远程修改,一般也不会告诉用户,最简单的方式就是打电话给装维师傅,让他帮你把光猫修改为桥接模式,但是最近好多地方的运营商不给修改了,理由是目前的光猫都是智能光猫,业务自动下发的,无法修改,今天就教你修改光猫为桥接模式,而且不让运营商远程修改超级管理员密码,下面以移动光猫吉比特HG6543C4为例演示,其他光猫同理。1.找到光猫背面的设备i信息(管理地

    2022年10月8日
    0
  • STM32 DSP库MDK VC5\VC6编译错误: 256, (const float64_t *)twiddleCoefF64_256, armBitRevIndexTableF64_256,「建议收藏」

    STM32 DSP库MDK VC5\VC6编译错误: 256, (const float64_t *)twiddleCoefF64_256, armBitRevIndexTableF64_256,「建议收藏」D:/Keil_v5/Arm/Packs/ARM/CMSIS/5.7.0/CMSIS/DSP/Source/CommonTables/arm_const_structs.c(65):error:unknowntypename‘arm_cfft_instance_f64’;didyoumean‘arm_cfft_instance_f32’?constarm_cfft_instance_f64arm_cfft_sR_f64_len256={^~~~~~~~~~~~~~~~~~~~~

    2022年8月12日
    2

发表回复

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

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