Java POI 读取Excel数据转换为XML格式

Java POI 读取Excel数据转换为XML格式,第1张

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,非常感谢。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/589183.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存