使用Java将XML转换为自定义Excel

使用Java将XML转换为自定义Excel,java,excel,xml-parsing,apache-poi,Java,Excel,Xml Parsing,Apache Poi,我需要关于如何使用Java将XML转换为自定义Excel的建议 我需要使用自定义布局将XML转换为Excel。我找到了一个,它似乎可以帮助完成这项任务。但我没有这样的经验,据我所知,POI在内存树(如DOM)中工作得最好。我开始分析我的XML(我可以展示其中的一小部分,它非常大而且深入) 名称1 姓名2 名字3 名字4 名字6 1. 2. 3. 4. 6. 通过使用DOM,就像我在一个在线教程中看到的那样 Document xmlDoc = getDocument("./sr

我需要关于如何使用Java将XML转换为自定义Excel的建议 我需要使用自定义布局将XML转换为Excel。我找到了一个,它似乎可以帮助完成这项任务。但我没有这样的经验,据我所知,POI在内存树(如DOM)中工作得最好。我开始分析我的XML(我可以展示其中的一小部分,它非常大而且深入)


名称1
姓名2
名字3
名字4
名字6
1.
2.
3.
4.
6.
通过使用DOM,就像我在一个在线教程中看到的那样

        Document xmlDoc = getDocument("./src/xmlForTest.xml");
        xmlDoc.getDocumentElement().normalize();
        System.out.println("Root element of the doc is :\" "+ xmlDoc.getDocumentElement().getNodeName() + "\"");

        NodeList listOfAdvantage = xmlDoc.getElementsByTagName("advantage"); //first we need to find total number of Advantage blocks
        int totalAdvantage = listOfAdvantage.getLength();

        System.out.println("Total no of advantage : " + totalAdvantage);
        for (int s = 0; s < listOfAdvantage.getLength(); s++) //get into advantage
        {
            Node AdvantageNode = listOfAdvantage.item(s);
            System.out.println("advantage number : " + s);
            if (AdvantageNode.getNodeType() == Node.ELEMENT_NODE)
            {
                Element AdvantageElement = (Element) AdvantageNode;
                NodeList CompanyList = AdvantageElement.getElementsByTagName("companies"); // find node companies
                System.out.println("companies number : " + CompanyList.getLength());
                for(int cl = 0; cl < CompanyList.getLength(); cl++) {
                    NodeList CompanyNameList = CompanyList.item(cl).getChildNodes();  //AdvantageElement.getElementsByTagName("name");
                    for (int j = 0; j < CompanyNameList.getLength(); j++) {
                        Node childNode = CompanyNameList.item(j);
                        if ("name".equals(childNode.getNodeName())) {
                            for (int nl = 0; nl < CompanyNameList.getLength(); nl++) {
                                Element CompanyNameElement = (Element) CompanyNameList.item(nl);
                                NodeList textFNList = CompanyNameElement.getChildNodes();
                                System.out.println("Company: " + nl + " :" + (textFNList.item(0)).getNodeValue().trim());
                                CompaniesNames.add((textFNList.item(0)).getNodeValue().trim());
                            }
                        }
                    }
                }

            }// end of if clause

        }// end of for loop with s var  
documentxmldoc=getDocument(“./src/xmlForTest.xml”);
xmlDoc.getDocumentElement().normalize();
System.out.println(“文档的根元素是:\”“+xmlDoc.getDocumentElement().getNodeName()+”\”);
NodeList listOfAdvantage=xmlDoc.getElementsByTagName(“advantage”)//首先,我们需要找到优势区块的总数
int totalAdvantage=listOfAdvantage.getLength();
System.out.println(“优势总数:+totalAdvantage”);
对于(int s=0;s
现在我有几个问题

  • 如何使解析更容易?我的文件很大,在某些地方,不同的东西有相同的标签,比如公司、产品或个人的名字。但是,要像我那样一个接一个地找回它越来越难了
  • 以后如何将这些数据输入POI,以便我可以开始使用此POI构建Excel文件?因为现在我有一组ArrayList,其中包含来自不同标签的数据,我不知道接下来需要使用它做什么

  • 因此,您向我们提出的问题是:如何将我们不知道确切结构的XML转换为我们也不知道其结构的Excel文件?我唯一能告诉您的是:首先确定XML的确切结构和所需Excel工作表的确切结构。例如:您的XML有不同的公司。每个公司是否应在Excel表格中显示一行?如果是,其他数据如何分配给公司行?然后,您的程序将使用解析器读取XML,并使用POI编写Excel工作表。顺便说一句:“POI最适用于内存中的树,如DOM”:否,需要写入包含数据所在单元格的行。因此,Excel工作表和POI的结构更像是一个数据库表,其中包含数据记录行和单元格,这些行类似于数据记录中的数据字段。因此,您向我们提出的问题是:如何将一个我们不知道确切结构的XML转换为一个我们也不知道其结构应该是什么样的Excel文件?我唯一能告诉您的是:首先确定XML的确切结构和所需Excel工作表的确切结构。例如:您的XML有不同的公司。每个公司是否应在Excel表格中显示一行?如果是,其他数据如何分配给公司行?然后,您的程序将使用解析器读取XML,并使用POI编写Excel工作表。顺便说一句:“POI最适用于内存中的树,如DOM”:否,需要写入包含数据所在单元格的行。因此,Excel工作表和POI的结构更像是一个数据库表,其中包含数据记录行和单元格,这些行类似于数据记录中的数据字段。
            Document xmlDoc = getDocument("./src/xmlForTest.xml");
            xmlDoc.getDocumentElement().normalize();
            System.out.println("Root element of the doc is :\" "+ xmlDoc.getDocumentElement().getNodeName() + "\"");
    
            NodeList listOfAdvantage = xmlDoc.getElementsByTagName("advantage"); //first we need to find total number of Advantage blocks
            int totalAdvantage = listOfAdvantage.getLength();
    
            System.out.println("Total no of advantage : " + totalAdvantage);
            for (int s = 0; s < listOfAdvantage.getLength(); s++) //get into advantage
            {
                Node AdvantageNode = listOfAdvantage.item(s);
                System.out.println("advantage number : " + s);
                if (AdvantageNode.getNodeType() == Node.ELEMENT_NODE)
                {
                    Element AdvantageElement = (Element) AdvantageNode;
                    NodeList CompanyList = AdvantageElement.getElementsByTagName("companies"); // find node companies
                    System.out.println("companies number : " + CompanyList.getLength());
                    for(int cl = 0; cl < CompanyList.getLength(); cl++) {
                        NodeList CompanyNameList = CompanyList.item(cl).getChildNodes();  //AdvantageElement.getElementsByTagName("name");
                        for (int j = 0; j < CompanyNameList.getLength(); j++) {
                            Node childNode = CompanyNameList.item(j);
                            if ("name".equals(childNode.getNodeName())) {
                                for (int nl = 0; nl < CompanyNameList.getLength(); nl++) {
                                    Element CompanyNameElement = (Element) CompanyNameList.item(nl);
                                    NodeList textFNList = CompanyNameElement.getChildNodes();
                                    System.out.println("Company: " + nl + " :" + (textFNList.item(0)).getNodeValue().trim());
                                    CompaniesNames.add((textFNList.item(0)).getNodeValue().trim());
                                }
                            }
                        }
                    }
    
                }// end of if clause
    
            }// end of for loop with s var