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 ...
随机推荐
- ApiPost的预执行脚本和后执行脚本
ApiPost的预执行脚本和后执行脚本主要是用来定义变量.但是它们有什么区别呢? 预执行脚本 在当前接口发送请求前执行的脚本,可以理解为beforeSend的时候执行. 一般在这里,我们可以设置一些前 ...
- webpack3 babel相关
babel 链接地址 在index.js中写入js6的语法如 let fn = (){ console.log('this is es6') } 执行npm run build 在打包出来的js文件中 ...
- Windows 自动登录
https://serverfault.com/questions/840557/auto-login-a-user-at-boot-on-windows-server-2016 Use Sysint ...
- 5.Python是怎么解释的?
Python是怎么解释的? Python language is an interpreted language. Python program runs directly from the sour ...
- Python下redis包安装
找到Python的第三方包安装路径,在dos命令行中切换到该目录,输入: pip install redis 最后在Python解释器中即可.
- PHP的闭包和匿名函数
闭包函数是创建时,封装周围状态的函数,而匿名函数是没有名称的函数,匿名函数可以被赋值给变量,也就是所谓的函数式编程,也可以传递参数,经常作为回调函数.(理论上讲:匿名函数和闭包不算是一个概念,php却 ...
- #Week3 Linear Regression with Multiple Variables
一.Multiple Features 这节课主要引入了一些记号,假设现在有n个特征,那么: 为了便于用矩阵处理,令\(x_0=1\): 参数\(\theta\)是一个(n+1)*1维的向量,任一个训 ...
- python(类多态)
一.多态 (以封装和继承为前提)不同的子类调用相同的方法,产生不同的结果 class Dog(): def __init__(self,name): self.name = name def game ...
- 配置 Ant 执行 Jmeter 脚本
1.将 Jmeter 下 extras 目录中 ant-jmeter-1.1.1.jar 包拷贝至 ant 安装目录下的lib目录中,否则会报错 ant-jmeter-1.1.1 不存在 2.创建 ...
- muduo网络库源码学习————线程本地单例类封装
muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...