使用Excel导出XML格式文件

生成XML的方式有很多:如果你是程序员,那么你可以通过变成快速生成你想要的XML格式;如果你是其他用户,你可能会使用记事本等文本编辑工具来手动写XML。这些都不是问题,但是数据量很大的时候,如果你不是程序猿会不会郁闷?本文介绍了一种方法不借助编程也可以高效、快速地生成XML配置文件。在看这篇文章之前,我先假定了你们都会用微软Office工具Excel,其实不会问题也不是很大:-D

假设现在有个任务,要生成一个班的学生XML配置,这个配置包含学生的学号、姓名、性别、年龄、出生年月信息,那么现在有两种XML格式可以选择:

1.把每个学生做成一个XML节点,相关信息描述到属性字段

<student id="" name="" sex="" age="" birth=""/>

2.把每个学生的相关信息分别做成一个单独XML节点

<student>
  <id></id>
  <name></name>
  <sex></sex>
  <age></age>
  <birth></birth>
</student>

可以很容易发现第一种描述更简洁,看起来有点小清新的感觉,我们现在就以第一种格式来介绍生成XML的方法。不过你真的很喜欢第二种方式,看到最后你惊喜地发现,我的方法也可解决你的问题。

现在回归正题,如果用Excel去录入这些数据,大家很可能是这样来做数据,这样做很容易理解,并且容易批量拖拽处理。

 

到这里我们可以发现,其实Excel可以完全把我们的数据描述清楚,那么如果Excel能把这些数据转成XML岂不是很好?是的,Excel可以做这些,但是Excel不知道你想要的XML格式,所以要给Excel定一个规则让它直到我们想要什么字段、输出什么格式。现在有两种方法给Excel指定输出规则:简单XML映射、SchemaXML映射,下面分别来做介绍。

简单XML映射

对于上面的数据我们用下面这段XML来描述,然后保存为rule.xml文件。

简单XML映射规则

<data>
  <student id="" name="" sex="" age="" birth=""/>
  <student id="" name="" sex="" age="" birth=""/>
</data>

data是输出XML的根节点,student是单个学生信息节点,这两个字段限定了XML输出的节点名称,<student></student>数据描述了单条XML节点属性的字段名称。这样整个输出规则就定制好了,是不是非常简单?可能会疑惑为什么有两条重复的student数据,这里我先不透露,大家可以看完这篇文章后自己试试看看什么效果。

接下来我们把这个XML规则导入Excel,进入“文件->选项->自定义功能区”,右边栏里面找到开发工具,确保其前面的复选框被勾上,并且确保XML前面的复选框也被勾上,如下图

然后返回主界面,在选项卡区域找到开发工具,点击按钮,这时Excel会出现一个左边栏,这时导入XML规则的入口操作界面,

点击“XML 映射…->添加”,把之前保存的rule.xml文件导入进来,这时右边栏会出现一个树形的属性列表,列表字段就是rule.xml规则里面定义的字段,这些自动都是可以拖拽的:把id拖拽到学号栏,一次类推,把所有的字段都映射到Excel的数据栏。 

这样就完成了所有的规则定义以及映射工作,接下来就是高潮来临的时刻:输出XML配置。这一步非常简单,只需要点击一个按钮“开发者工具->导出”,然后选择你要输出的文件位置保存即可。

XML导出结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data>
  <student id="5325035" name="name::01" sex="0" major="21" birth="33349"/>
  <student id="5325036" name="name::02" sex="1" major="22" birth="33208"/>
  <student id="5325037" name="name::03" sex="0" major="20" birth="33744"/>
  <student id="5325038" name="name::04" sex="0" major="20" birth="33914"/>
  <student id="5325039" name="name::05" sex="0" major="21" birth="33398"/>
  <student id="5325040" name="name::06" sex="1" major="21" birth="33403"/>
  <student id="5325041" name="name::07" sex="1" major="21" birth="33366"/>
  <student id="5325042" name="name::08" sex="0" major="23" birth="32712"/>
  <student id="5325043" name="name::09" sex="1" major="21" birth="33536"/>
  <student id="5325044" name="name::10" sex="1" major="20" birth="33672"/>
  <student id="5325045" name="name::11" sex="1" major="21" birth="33397"/>
</data>

整个操作是不是很简单?结果是不是很完美?!!细心的同学可能发现了出生日期导出的好像有点奇怪,其实不必诧异:这时Excel表示日期的原始数据。但是跟想象的结果好像有点出入,你是否想对输出的格式作进一步的限制?如果是,那么下一个章节是你需要关注的。

SchemaXML映射

其实我对Schema XML的了解也不太多,有一点我是可以确认的:SchemaXML是一个XML内容的规则,它描述了XML有什么样的内容,并限定了XML内容有什么格式;简单说它是一个XML的语法规范。为什么这样说呢?因为实际上我们为XML定义的没一个字段都是有其含义的,比如年龄字段只可能是一个整数,不可能是其他字符串之类的值;而出生日期就是一个日期格式,以此类推。这样你就会有点豁然开朗的感觉,是的,SchemaXML可以描述任意XML内容。到这里,我们可以用SchemaXML做Excel导出XML的规则就一点不奇怪了,应该说用它就最合适不过了!SchemaXML其实也是一个XML文件,但是写起来相对有点门槛。如果为上面的数据写一个SchemaXML规则,那么就应该类似下面这样

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="student">
                    <xs:complexType>
                        <xs:attribute name="id" type="xs:integer" use="required"/>
                        <xs:attribute name="name" type="xs:string" use="required"/>
                        <xs:attribute name="sex" type="xs:integer" use="required"/>
                        <xs:attribute name="age" type="xs:integer" use="required"/>
                        <xs:attribute name="birth" type="xs:date" use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

具体SchemaXML里面的这些字段表示什么意思,这就超出了本文介绍的范围,有兴趣的同学可以Google一些相关资料来学习一下。除了学习资料,也可以使用现成的可视化工具来生成配置,比如OxygenXML、LiquidXML等。下面是Oxygen可视化编辑工具的界面  这里就不对这些工具做过多的介绍,有兴趣的同学可以下来体验下。

把上面这段SchemaXML规则保存为rule.xsd文件,采用导入rule.xml的方式导入rule.xsd文件,导入后也会生成类似的树形字段列表,然后拖拽映射到相应的Excel数据列上,点击导出即可。

<data>
  <student id="5325035" name="name::01" sex="0" age="21" birth="1991-04-21"/>
  <student id="5325036" name="name::02" sex="1" age="22" birth="1990-12-01"/>
  <student id="5325037" name="name::03" sex="0" age="20" birth="1992-05-20"/>
  <student id="5325038" name="name::04" sex="0" age="20" birth="1992-11-06"/>
  <student id="5325039" name="name::05" sex="0" age="21" birth="1991-06-09"/>
  <student id="5325040" name="name::06" sex="1" age="21" birth="1991-06-14"/>
  <student id="5325041" name="name::07" sex="1" age="21" birth="1991-05-08"/>
  <student id="5325042" name="name::08" sex="0" age="23" birth="1989-07-23"/>
  <student id="5325043" name="name::09" sex="1" age="21" birth="1991-10-25"/>
  <student id="5325044" name="name::10" sex="1" age="20" birth="1992-03-09"/>
  <student id="5325045" name="name::11" sex="1" age="21" birth="1991-06-08"/>
</data>

这是使用SchemaXML导出的配置结果,在日期字段里面月份、日期如果是一位数字的前面会自动补0占位,看起来非常工整。

每个字段单独输出XML节点

这中方式映射与字段输出属性模式是非常类似,区别只是规则定义格式的差别,如果使用简单XML做规则,那么就应该是这样

<data>
  <student>
      <id></id>
      <name></name>
      <sex></sex>
      <age></age>
      <birth></birth>
  </student>
  <student>
      <id></id>
      <name></name>
      <sex></sex>
      <age></age>
      <birth></birth>
  </student>
</data>

这里的规则与上面类似,也是重复两段student,这个是必须的,原理也同上面类似。

如果使用SchemaXML,那么规则应该这样

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="student">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="id" type="xs:integer"/>
                            <xs:element name="name" type="xs:string"/>
                            <xs:element name="sex" type="xs:integer"/>
                            <xs:element name="age" type="xs:integer"/>
                            <xs:element name="birth" type="xs:date"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

相应的Oxygen可视化模型大致如下图

注意事项

  • 虽然XML、SchemaXML规则可以描述很复杂的XML内容,但是Excel只支持最多二级的XML配置导出
  • 使用XML做规则时,一定不能只使用一条数据来描述,否则生成的结果只有Excel标题栏文本,而不是数据本身
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
EasyExcel 是一个基于 Java 的简单、高效的 Excel 工具,可以方便地读取和写入 Excel 文件。下面是使用 EasyExcel 导出 Excel 文件的示例代码: 1. 导入 EasyExcel 相关的依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> ``` 2. 创建 Excel 内容模型类(例如 Student): ```java @Data public class Student { @ExcelProperty("学号") private String id; @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("性别") private String gender; } ``` 3. 创建导出 Excel 的方法: ```java public void exportExcel(List<Student> students) { // 文件输出流 OutputStream outputStream = null; try { // 设置响应头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("学生信息.xlsx", "UTF-8")); // 获取输出流 outputStream = response.getOutputStream(); // 创建 Excel 写入器 ExcelWriter excelWriter = EasyExcel.write(outputStream, Student.class).build(); // 创建工作表并写入数据 WriteSheet writeSheet = EasyExcel.writerSheet("学生信息").build(); excelWriter.write(students, writeSheet); // 关闭 Excel 写入器 excelWriter.finish(); } catch (IOException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在上面的示例代码中,我们首先设置了响应头信息,然后获取输出流,创建 Excel 写入器,创建工作表并写入数据,最后关闭 Excel 写入器。 4. 调用导出 Excel 的方法: ```java List<Student> students = new ArrayList<>(); // 添加学生信息 exportExcel(students); ``` 上面的示例代码将会生成一个名为“学生信息.xlsx”的 Excel 文件并下载到本地。 希望能帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值