Java POI 读取Excel数据转换为XML格式
1、首先要下载poi相关的包:http://poi.apache.org/ ,以下是所需的jar包

2、贴上详细的代码
public class ExcelToXml {
/**
* 将excel的数据转换成xml格式
* @param excelPath
* @param xmlPath
* @throws Exception
*/
public static void generateXml(final String excelPath, final String xmlPath) throws Exception{
//格式化输出
final OutputFormat format = OutputFormat.createPrettyPrint();
//指定XML编码
format.setEncoding("UTF-8");
//用于指定显示和编码方式
final XMLWriter output = new XMLWriter(new FileWriter(xmlPath), format);
//定义一个XML文档对象
final Document document = DocumentHelper.createDocument();
//获取根节点
Element root = document.getRootElement();
//获取excel文件
final File tempFile =new File(excelPath.trim());
//获取带后缀的文件名,例如system.xlsx
final String fileName = tempFile.getName();
//获取后面的部分,例如.xlsx
final String prefix=fileName.substring(fileName.lastIndexOf("."));
//获取后面部分的长度
int num=prefix.length();
//获取去掉了后缀的文件名,例如system
final String fileOtherName=fileName.substring(0, fileName.length()-num);
//创建根节点
//e.g. <system position="system.xlsx">
if( root == null) {
root = document.addElement(fileOtherName);
root.addAttribute("position",fileName);
}
//利用工厂读取excel可以不需要关心excel的版本问题
final Workbook wb = WorkbookFactory.create(new File(excelPath));
//获取sheet页的数量
final int sheetNum = wb.getNumberOfSheets();
System.out.println("sheet页的数量:"+sheetNum);
//循环读取每一个页sheet的内容start
for(int i = 0; i < sheetNum; i++) {
//读取某一页sheet
final Sheet sheet = wb.getSheetAt(i);
//标记是否接下来的是否为FieldIdLabel(数据行是否为属性名)
boolean isFieldIdLabel = false;
//标记是否接下来的是否为FieldValue(数据行是否为值)
boolean isFieldValue = false;
//每一行具有数据值的列数量
int coloumNum = 0;
//定义一个集合存放FieldIdLabel
final List<String> fields = new ArrayList<String>();
//获取每一页sheet底下Tab的名字
final String sheetName = sheet.getSheetName();
System.out.println("一级节点:"+sheetName);
//定义prePosition,拼接存储位置,e.g. system.xlsx,role
final String prePosition=new String(fileName+","+sheetName);
//添加一级节点
//e.g <sheet id="role" position="system.xlsx,role">
final Element firstElm = root.addElement("sheet");
firstElm.addAttribute("id",sheetName);
firstElm.addAttribute("position",prePosition.toString());
//定义二级节点
Element secondElm = null;
//定义三级节点
Element thirdElm = null;
//循环读取每一行的内容start
for (final Row row : sheet) {
//获取每一行具有可读数据值的列数量
coloumNum = row.getPhysicalNumberOfCells();
System.out.println("列的数量:"+coloumNum);
//行数
final String rowNum=String.valueOf(row.getRowNum() + 1);
//定义四级节点
Element fourthElm = null;
//标志是否接下来row的FieldValue是数据行
boolean isNextRow = true;
//循环读取每一列的值start
for (final Cell cell : row) {
//将单元格的内容转换成字符串
final String cellStr = cellValueToString(cell);
//单元格的列索引
final int cellIndex = cell.getColumnIndex();
//各种不同的情况start
if (cellStr.startsWith("##")) { //第一种情况##Role
System.out.println("第一种情况##");
//获取##后面的值,例如##Role,截取之后是Role
final String cellElm = cellStr.substring(2);
System.out.println("二级节点:"+cellElm);
//添加二级节点
//e.g. <Role position="system.xlsx,role,1">
secondElm = firstElm.addElement(cellElm);
secondElm.addAttribute("position", prePosition+","+rowNum);
}else if (cellStr.startsWith("#begin")) {//第二种情况#begin_elem
System.out.println("第二种情况#begin_elem");
//添加三级节点
//e.g. <elements id="default">
thirdElm = secondElm.addElement("elements");
final String []arrayStr = cellStr.split(":");
if(arrayStr.length == 1) {
thirdElm.addAttribute("id", "default");
} else {
thirdElm.addAttribute("id", arrayStr[1]);
}
isFieldIdLabel = true;
} else if (isFieldIdLabel){//第三种情况字段名称roleId*,description存进fields集合
//System.out.println("cellIndex:"+cell.getColumnIndex()+"..."+cellStr);
System.out.println("第三种情况字段名称:"+cellStr+",索引:"+cellIndex);
if( !cellStr.isEmpty()){
if (coloumNum != 0) {
fields.add(cellStr);
coloumNum-=1;
}
}else{//如果为空
if (coloumNum != 0) {
coloumNum-=1;
}
}
if (coloumNum == 0) {
System.out.println("fields集合长度:"+fields.size());
printList(fields);
isFieldIdLabel = false;
isFieldValue = true;
}
} else if (cellStr.startsWith("#end")) {
System.out.println("这是结尾#end");
isFieldValue = false;
fields.clear();
}else if (isFieldValue) {//循环读取每一行数据
if(isNextRow) {
//添加四级节点
//e.g. <element position="system.xlsx,role,4">
fourthElm = thirdElm.addElement("element");
fourthElm.addAttribute("position",prePosition+","+rowNum);
//添加五级节点
//e.g. <roleId>$DEFAULT_ROLE</roleId> 先添加第一行数据
final Element fifthElm = fourthElm.addElement(fields.get(cellIndex));
fifthElm.setText(cellStr);
isNextRow = false;
} else {
//继续添加五级节点
//e.g. <description>Default Role</description> 第二行数据开始
if (cellIndex < fields.size()) {
final Element fifthElm = fourthElm.addElement(fields.get(cellIndex));
fifthElm.setText(cellStr);
}
}
} else {
System.out.println("这是其他的情况,行数是:"+String.valueOf(row.getRowNum()+1)+",列数是:"+String.valueOf(cellIndex+1));
}//各种不同的情况end
}//循环读取每一列的值end
}//循环读取每一行的内容end
}//循环读取每一个页sheet的内容end
System.out.println("恭喜你,excel转化为xml文件已经完成!");
output.write(document);
output.flush();
output.close();
}
/**
* 将单元格的内容全部转换成字符串
* @param cell
* @return
*/
private static String cellValueToString(final Cell cell) {
String str = "";
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
str = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
str = cell.getDateCellValue().toString();
}else {
str = String.valueOf(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
str = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
str = cell.getCellFormula();
break;
default:
str = cell.getRichStringCellValue().getString();
break;
}
return str;
}
/**
* 打印list集合
* @param list
*/
public static void printList(final List<String> list){
for(int k = 0;k < list.size(); k++){
System.out.println(list.get(k));
}
}
public static void main(final String[] args) throws Exception{
// TODO Auto-generated method stub
generateXml("excel/system.xlsx", "xml/system.xml");
}
}
3、转换后xml文件数据

本文参考自博客
Damon huang : https://www.cnblogs.com/jrsmith/archive/2013/03/30/2991042.html,非常感谢。
Java POI 读取Excel数据转换为XML格式的更多相关文章
- Java POI读取Excel数据,将数据写入到Excel表格
1.准备 首先需要导入poi相应的jar包,包括: 下载地址:http://pan.baidu.com/s/1bpoxdz5 所需要的包的所在位置包括: 2.读取Excel数据代码 package S ...
- 使用poi读取excel数据示例
使用poi读取excel数据示例 分两种情况: 一种读取指定单元格的值 另一种是读取整行的值 依赖包: <dependency> <groupId>org.apache.poi ...
- POI读取Excel数据
POI读取Excel表格数据 * {所需相关jar下载: * commons-collections4-4.4.jar * commons-compress-1.19.jar * poi-4.1.1. ...
- poi——读取excel数据
单元格类型 读取Excel数据 package com.java.test.poi; import java.io.File; import java.io.FileInputStream; impo ...
- java 使用POI读取excel数据
原文:http://doc.okbase.net/0201zcr/archive/161440.html 一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Ja ...
- POI读取Excel数据保存到数据库,并反馈给用户处理信息(导入带模板的数据)
今天遇到这么一个需求,将课程信息以Excel的形式导入数据库,并且课程编号再数据库中不能重复,也就是我们需要先读取Excel提取信息之后保存到数据库,并将处理的信息反馈给用户.于是想到了POI读取文件 ...
- java POI读取excel 2007/2003
2003版office excel读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io ...
- java poi 读取excel内容
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import or ...
- Java——poi读取Excel文件
1.创建文件流,打开EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...
随机推荐
- SweetAlert - 演示6种不同的提示框效果
http://www.sucaihuo.com/js/190.html http://www.cnblogs.com/beiz/p/5238124.html
- tensor的复制函数torch.repeat_interleave()
1. repeat_interleave(self: Tensor, repeats: _int, dim: Optional[_int]=None) 参数说明: self: 传入的数据为tensor ...
- 【集群实战】NFS网络文件共享服务3-相关知识补充(showmount,exports,rpc)
1. showmount命令说明 showmount命令一般用于从NFS客户端检查NFS服务器端共享目录的情况. 参数说明: -e,--exports 显示NFS服务器输出的目录列表 [root@we ...
- sed命令的正则表达式实践
1. 取系统ip [root@oldboy logs]# ifconfig eth3 eth3 Link encap:Ethernet HWaddr 08:00:27:4C:6F:AD inet ad ...
- Redis介绍及字符串操作
一.前言 不同程序之间实现通信的方法? A.通过不同程序之间建立socket,实现通信.实际应用适用于使用broker,如RabbitMQ,ZeroMQ. B.通过Json,Pickle,利用文件的写 ...
- 内蒙古特检院利用物联网/RFID技术提高电梯检测水平
随着电梯检验工作信息化进程的进一步深入,内蒙古特检院从检验工作中寻找新方法.新手段,为检验员新引入电梯检验手持终端设备,力求提高电梯检验水平,将"电梯安全惠民工程"落到实处. 电梯 ...
- 压缩工具gzip、bzip2、xz的使用
2019独角兽企业重金招聘Python工程师标准>>> 本文使用 为了要压缩 常见压缩格式 压缩工具 gzip压缩工具 bz2压缩工具 xz压缩工具 为什么要压缩 为什么要压缩?文件 ...
- 最小生成树之prime算法
public class Prime { public static void main(String[] args) { //路径矩阵 int arcs[][] = {{-1,6,1,5,-1,-1 ...
- ubuntu 和 centos 如何区分系统
Ubuntu Ubuntu有着漂亮的用户界面,完善的包管理系统,强大的软件源支持,丰富的技术社区,Ubuntu还对大多数硬件有着良好的兼容性,包括最新的图形显卡等等.这一切让Ubuntu越来越向大众化 ...
- kafka-eagle监控kafka
最近想做一个kafka监控,本来准备用zabbix来监控的,需要重复造轮子,本来准备用kafka-Manager的,在GitHub上无意发现了kafka-eagle,看了官方介绍准备试一下..... ...