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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM