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 ...
随机推荐
- MySQL基础知识和常用命令总结
说明:以下内容是阅读书籍<<MySQL必知必会>>的摘要和总结 检索数据 排序检索数据 过滤数据 使用通配符过滤 使用正则表达式进行搜索 创建计算字段 使用数据处理函数 汇总数 ...
- 必应每日图片api
https://cn.bing.com/HPImageArchive.aspx?format=xml&cc=jp&idx=0&n=1 format = 'xml' | 'j ...
- 超详细步骤---Linux下的最新Git版本安装
原文地址:https://blog.csdn.net/u010887744/article/details/53957613 [标注大头] 1.查看当前git版本:git --version 查看最新 ...
- 对于WebP格式入门解读
因为项目中需要用到大量动画效果,前期尝试过几种方案,比如GIF.帧动画.lottie.SVGA等格式的动画渲染方案,发现都存在各式各样的问题.比如: 1,GIF格式.5秒的动画,一张图大小可能就会达到 ...
- Win10 及 Google 浏览器显示界面异常
win10 和 google 界面显示异常 win10 个别 ui 组件花屏,google 界面直接黑屏 解决方式 更新集成显卡或者重装显卡驱动,最好使用 驱动人生 !!!
- Spring Cloud sleuth with zipkin over RabbitMQ教程
文章目录 Spring Cloud sleuth with zipkin over RabbitMQ demo zipkin server的搭建(基于mysql和rabbitMQ) 客户端环境的依赖 ...
- 基于jenkins自动打包并部署Tomcat环境
传统网站部署的流程 在运维过程中,网站部署是运维的工作之一.传统的网站部署的流程大致分为:需求分析->原型设计->开发代码->提交代码->内网部署->内网测试->确 ...
- 徐州A
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...
- 算法竞赛进阶指南--lowbit运算,找到二进制下所有是1的位
// lowbit运算,找到二进制下所有是1的位 int H[37]; // 预处理 for (int i = 0; i < 36; i++) H[(1ll << i) % 37] ...
- 如何使用thrift 服务引擎组件
在本文中将介绍如果通过thrift 组件集成到surging 微服务引擎中,然后可以选择dotnetty 或thrift作为服务远程调用RPC,也可以通过其它语言的thrift 调用surging 服 ...