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 ...
随机推荐
- thinkphp5.0 模型的应用
<?php namespace app\admin\controller; use app\common\controller\BaseController; use think\Db;//数据 ...
- 十六, Oracle约束
前言 数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则,在oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性 ...
- 取 token 并查看 container 信息
curl -i -k \ -H "Content-Type: application/json" \ -d ' { "auth": { "identi ...
- [Qt] 文本文件读写, 摘自官方文档
Reading Files Directly The following example reads a text file line by line: QFile file("in.txt ...
- java中的daemon thread
java中的daemon thread java中有两种类型的thread,user threads 和 daemon threads. User threads是高优先级的thread,JVM将会等 ...
- 理解分布式一致性:拜占庭容错与PBFT
理解分布式一致性:拜占庭容错与PBFT 拜占庭问题 拜占庭容错BFT PBFT(Practical Byzantine Fault Tolerance) why 3f+1 ? PBFT 的优点 PBF ...
- Comparable 接口与Comparator的使用的对比
package com.yhqtv.java; import org.junit.Test; import java.util.Arrays; import java.util.Comparator; ...
- SAP WM TO Print Control设置里,Movement Type 的优先级更高
SAP WM TO Print Control设置里,Movement Type 的优先级更高 存储类型的配置: 从storage type GRM 搬到任何地方,都不需要打印TO单. 移动类型的配置 ...
- VS中的生成和重新生成的区别
2019独角兽企业重金招聘Python工程师标准>>> 生成 在上次编译的基础上,只对改动过的文件重新生成,没有改动过的文件不会重新生成. 重新生成 对所有的文件都重新生成.如果引用 ...
- Java之JVM(初学者)
学习Java的第一次总结 1.Java程序的编译和执行 通过上图,我们轻易得出java执行过程:由javac编译为字节码文件,通过JVM转换为底层操作系统可识别的命令操作. 注意:①Java跨平台的始 ...