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

  • 相关阅读:
    mysql系列~mysqldump使用技巧
    mysql系列~logrotate
    最详细的经典双向电平转换电路的工作原理图文分析
    《USB应用分析精粹:从设备硬件、固件到主机程序设计》已经完稿
    Windows x86环境下使用QEMU安装arm架构银河麒麟V10操作系统
    不动产测绘包含哪些内容
    java问题收集
    java调用接口(rest-assured)
    java调用接口(okhttp )
    testng+allure
  • 原文地址:https://www.cnblogs.com/liuzhenping/p/8043101.html
Copyright © 2020-2023  润新知