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