RESOLVIDO: Como importar vários xmls de uma pasta e exportar para excel (um abaixo do outro nas linhas do xlsx)

Galera, preciso de ajuda, tenho uma classe que seleciono 1 arquivo xml e exporto para o Excel, até ai tudo funcionando perfeitamente.

Porém recebo dezenas de xml dia e gostaria de colocar todos eles numa pasta e alterar a classe para que ao selecionar a pasta a classe pegue todos os xmls que estão nela (1 a 1) e exporte num arquivo único de Excel, ou seja, vai incluindo um abaixo do outro no Excel, por favor, podem me ajudar nessa:

Abaixo minha classe:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import javax.swing.JFileChooser;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Created by Fabio Eduardo Argenton fabio.argenton@hotmail.com
 */
public class XmlToExcelConverter {

    public static void main(String[] args) throws Exception {
        //Iniciando a janela para selecionar o xml a converter
        String arquivo = null;
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int res = fc.showOpenDialog(null);
        if (res == JFileChooser.APPROVE_OPTION) {
            File planilha = fc.getSelectedFile();
            arquivo = planilha.getAbsoluteFile().toString();
        }
        //Passa o caminho do arquivo selecionado como parâmetro para o método getAndReadXml
        getAndReadXml(arquivo);
    }

    //Metodo para ler o xml e criar o excel
    private static void getAndReadXml(String arquivo) throws Exception {
        System.out.println("Lendo xml: " + arquivo);
        File xmlFile = new File(arquivo);

        //Gravando o cabeçalho da Planilha
        int rowNum = 0;

        NodeList nList;
        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            //Criando a aba xml no excel
            XSSFSheet sheet = workbook.createSheet("xml");

            ///Definindo formatos das células       
            XSSFCellStyle centro = workbook.createCellStyle();
            centro.setAlignment(HorizontalAlignment.CENTER);

            XSSFCellStyle esquerda = workbook.createCellStyle();
            esquerda.setAlignment(HorizontalAlignment.LEFT);

            XSSFCellStyle direita = workbook.createCellStyle();
            direita.setAlignment(HorizontalAlignment.RIGHT);

            //Criando a primeira linha do excel (titulo)
            Row rowTitulo = sheet.createRow(rowNum++);

            Cell cellTitulo = rowTitulo.createCell(0);
            cellTitulo.setCellValue("NF");
            cellTitulo.setCellStyle(centro);

            cellTitulo = rowTitulo.createCell(1);
            cellTitulo.setCellValue("Data");
            cellTitulo.setCellStyle(centro);

            cellTitulo = rowTitulo.createCell(2);
            cellTitulo.setCellValue("Fornecedor");
            cellTitulo.setCellStyle(esquerda);

            cellTitulo = rowTitulo.createCell(3);
            cellTitulo.setCellValue("Material");
            cellTitulo.setCellStyle(centro);

            cellTitulo = rowTitulo.createCell(4);
            cellTitulo.setCellValue("Descricao");
            cellTitulo.setCellStyle(esquerda);

            cellTitulo = rowTitulo.createCell(5);
            cellTitulo.setCellValue("UM");
            cellTitulo.setCellStyle(centro);

            cellTitulo = rowTitulo.createCell(6);
            cellTitulo.setCellValue("Quantidade");
            cellTitulo.setCellStyle(centro);

            cellTitulo = rowTitulo.createCell(7);
            cellTitulo.setCellValue("R$ Unit.");
            cellTitulo.setCellStyle(direita);

            cellTitulo = rowTitulo.createCell(8);
            cellTitulo.setCellValue("R$ Total");
            cellTitulo.setCellStyle(direita);

            //Após gravar o cabeçalho começa a gravas os detalhes da NF
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            nList = doc.getElementsByTagName("infNFe");

            //Passa pelo nó "infNFe" capturando o cabeçalho da NF            
            for (int i = 0; i < nList.getLength(); i++) {
                System.out.println("Processando elemento " + (i + 1) + "/" + nList.getLength());
                Node node = nList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {

                    //Captura o texto de cada tag do xml especificado abaixo (Cabeçalho da NF)
                    Element element = (Element) node;
                    String infNFeNF = element.getElementsByTagName("nNF").item(0).getTextContent();
                    String infNFeFornecedor = element.getElementsByTagName("xNome").item(0).getTextContent();

                    //Passa pelo nó "prod" capturando cada registro (detalhes da NF)
                    NodeList pns = element.getElementsByTagName("prod");
                    for (int j = 0; j < pns.getLength(); j++) {
                        Node prod = pns.item(j);
                        if (prod.getNodeType() == Node.ELEMENT_NODE) {

                            //Captura o texto de cada tag do xml especificado abaixo para gravar nas células
                            Element product = (Element) prod;
                            String pnMaterial = product.getElementsByTagName("cProd").item(0).getTextContent();
                            String pnDescricao = product.getElementsByTagName("xProd").item(0).getTextContent();
                            String pnUM = product.getElementsByTagName("uCom").item(0).getTextContent();
                            String pnQuantidade = product.getElementsByTagName("qCom").item(0).getTextContent();
                            String pnCustoUnitario = product.getElementsByTagName("vUnCom").item(0).getTextContent();
                            String pnCustoTotal = product.getElementsByTagName("vProd").item(0).getTextContent();

                            ///Definindo formatos das células        
                            XSSFDataFormat df = workbook.createDataFormat();

                            XSSFCellStyle moeda = workbook.createCellStyle();
                            moeda.setDataFormat(df.getFormat("[$R$-pt-BR] * #0.00"));
                            moeda.setAlignment(HorizontalAlignment.RIGHT);

                            XSSFCellStyle data = workbook.createCellStyle();
                            data.setDataFormat(df.getFormat("dd/mm/yyyy"));
                            data.setAlignment(HorizontalAlignment.CENTER);

                            //Criando as linhas e escrevendo os valores nas celulas
                            Row rowDetalhes = sheet.createRow(rowNum++);

                            Cell cellDetalhes = rowDetalhes.createCell(0);
                            cellDetalhes.setCellValue(infNFeNF);
                            cellDetalhes.setCellStyle(centro);

                            cellDetalhes = rowDetalhes.createCell(1);
                            cellDetalhes.setCellValue(new Date());
                            cellDetalhes.setCellStyle(data);

                            cellDetalhes = rowDetalhes.createCell(2);
                            cellDetalhes.setCellValue(infNFeFornecedor);
                            cellDetalhes.setCellStyle(centro);

                            cellDetalhes = rowDetalhes.createCell(3);
                            cellDetalhes.setCellValue(pnMaterial);
                            cellDetalhes.setCellStyle(centro);

                            cellDetalhes = rowDetalhes.createCell(4);
                            cellDetalhes.setCellValue(pnDescricao);
                            cellDetalhes.setCellStyle(esquerda);

                            cellDetalhes = rowDetalhes.createCell(5);
                            cellDetalhes.setCellValue(pnUM);
                            cellDetalhes.setCellStyle(centro);

                            cellDetalhes = rowDetalhes.createCell(6);
                            cellDetalhes.setCellValue(Float.parseFloat(pnQuantidade));
                            cellDetalhes.setCellStyle(centro);
                            cellDetalhes.setCellType(CellType.NUMERIC);

                            cellDetalhes = rowDetalhes.createCell(7);
                            cellDetalhes.setCellValue(Float.parseFloat(pnCustoUnitario));
                            cellDetalhes.setCellStyle(direita);
                            cellDetalhes.setCellStyle(moeda);

                            cellDetalhes = rowDetalhes.createCell(8);
                            cellDetalhes.setCellValue(Float.parseFloat(pnCustoTotal));
                            cellDetalhes.setCellStyle(direita);
                            cellDetalhes.setCellStyle(moeda);
                        }
                    }
                }
            }
            //Gera o arquivo excel na pasta selecionada
            try {
                FileOutputStream outputStream = new FileOutputStream("C:/Temp/Excel-Out-MWM.xlsx");
                workbook.write(outputStream);
                workbook.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Conversão finalizada, processado " + nList.getLength() + " infNFe!");
    }
}

Cara tah ficando comprido seu programa … tha na hora de aplicar mais OO.
Para o seu problema tenta abordar da seguinte forma:
usando File da para ter como referencia o diretorio e listar todos arquivos

public class ListDirectory {
public static void main(String[] args) {
File folder = new File(“your/path”);
File[] listOfFiles = folder.listFiles();

	for (int i = 0; i < listOfFiles.length; i++) {
		if (listOfFiles[i].isFile()) {
			System.out.println("Arquivo: " + listOfFiles[i].getName());
			System.out.println("Arquivo tipo: " + getExtencion(listOfFiles[i].getName()));

		} else if (listOfFiles[i].isDirectory()) {
			System.out.println("Diretorio " + listOfFiles[i].getName());
		}
	}
}


private static String getExtencion(String fileName) {
	int i = fileName.lastIndexOf('.');
	String extension = "";
	if (i > 0) {
	    extension = fileName.substring(i+1);
	}
	return extension;
}

}

depois faz um looping passando o arquivo para o processo de geração de linhas, tem que colocar o workbook em um contexto que ele não seja reescrito por conta da leitura de um novo arquivo
Tenta fazer e manda o cod caso tenha algum problema que te ajudamos.

@marco_aurelioo, novamente obrigado, me deu uma luz por onde começar, realmente ainda estou engatinhando mas vou chegar lá.

Então… consegui através do seu exemplo adaptar o método para selecionar a pasta, listar quantos arquivos tem na pasta e o caminho+nome+extensão dos arquivos, passo esses parâmetros ao método que faz a importação dos arquivos da pasta e exporta para o Excel.

Porém não estou conseguindo de forma alguma gerar o loop que importará todos os arquivos da pasta um após o outro, e não faço a mínima ideia de como fazer o próximo passo que será gravar os dados do xml na próxima linha do Excel abaixo do xml anterior já gravado.

Se eu tivesse algum modelo ou exemplo de código que faça isso eu me viro aqui, sou novato ainda e não tenho tanto conhecimento, na internet não tem nada completo pra me ajudar, já estou a uns 4 dias nisso e não sai.

Segue classe principal que abre a janela para seleção do diretório que contem os arquivos xml:

import static br.com.dashboard.util.XmlToExcelConverter.getAndReadXml;
import java.io.File;
import javax.swing.JFileChooser;

/**
 *
 * @author B02FEA
 */
public class ListDirectory {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        getListFilesDiretory();
    }

    public static void getListFilesDiretory() throws Exception {
        //Iniciando a janela para selecionar o xml a converter
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        //Inicia variável que verifica se foi selecionada uma pasta
        int res = fc.showOpenDialog(null);

        //Verifica se foi selecionado a pasta, caso sim executa o camando
        if (res == JFileChooser.APPROVE_OPTION) {
            //Captura o caminho da pasta selecionada
            File folder = new File(fc.getSelectedFile().getAbsolutePath().toString());

            //Captura os arquivos da pasta
            File[] listOfFiles = folder.listFiles();

            //Recebe a quantidade de arquivos da pasta e imprimi
            int qtde = listOfFiles.length;
            System.out.println("Quantidade: " + qtde);

            //Imprime o nome de cada arquivo da pasta
            for (int i = 0; i < listOfFiles.length; i++) {
                //Mostra o caminho do arquivo e o nome do arquivo
                System.out.println("Arquivo   : " + folder + "\\" + listOfFiles[i].getName());

                //Chama o metodo da classe reponsável por importar o xml e exportar para o Excel
                //Passando como parâmetro o caminho do arquivo e a quantidad de arquivos na pasta
                getAndReadXml(folder + "\\" + listOfFiles[i].getName(), qtde);
            }
        }
    }
} 

E aqui está a classe que recebe os parâmetros da pasta selecionada como quantidade de arquivos que será processado e o nome e extensão de cada arquivo:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Created by Fabio Eduardo Argenton fabio.argenton@hotmail.com
 */
public class XmlToExcelConverter {

    //Metodo para ler os xmls da pasta selecionada e criar o excel
    //Recebe o caminho+nome do arquivo e a quantidade de arquivos que deverá ser processado
    public static void getAndReadXml(String arquivo, int Qtde) throws Exception {
        System.out.println("Lendo xml: " + arquivo);

        //Loop para ler todos os arquivos da pasta e gerar o Excel/////////////////////////////////////////////
        //Porém ele sobrescreve o xml anterior////////////////////////////////////////////////////////////////////////////
        for (int a = 0; a < Qtde; a++) {
            File xmlFile = new File(arquivo);

            //Gravando o cabeçalho da Planilha
            int rowNum = 0;

            NodeList nList;
            try (XSSFWorkbook workbook = new XSSFWorkbook()) {
                //Criando a aba xml no excel
                XSSFSheet sheet = workbook.createSheet("xml");

                XSSFCellStyle centro = workbook.createCellStyle();
                centro.setAlignment(HorizontalAlignment.CENTER);

                XSSFCellStyle esquerda = workbook.createCellStyle();
                esquerda.setAlignment(HorizontalAlignment.LEFT);

                XSSFCellStyle direita = workbook.createCellStyle();
                direita.setAlignment(HorizontalAlignment.RIGHT);

                //Criando a primeira linha do excel (titulo)
                Row rowTitulo = sheet.createRow(rowNum++);

                Cell cellTitulo = rowTitulo.createCell(0);
                cellTitulo.setCellValue("NF");
                cellTitulo.setCellStyle(centro);

                cellTitulo = rowTitulo.createCell(1);
                cellTitulo.setCellValue("Data");
                cellTitulo.setCellStyle(centro);

                cellTitulo = rowTitulo.createCell(2);
                cellTitulo.setCellValue("Fornecedor");
                cellTitulo.setCellStyle(esquerda);

                cellTitulo = rowTitulo.createCell(3);
                cellTitulo.setCellValue("Material");
                cellTitulo.setCellStyle(centro);

                cellTitulo = rowTitulo.createCell(4);
                cellTitulo.setCellValue("Descricao");
                cellTitulo.setCellStyle(esquerda);

                cellTitulo = rowTitulo.createCell(5);
                cellTitulo.setCellValue("UM");
                cellTitulo.setCellStyle(centro);

                cellTitulo = rowTitulo.createCell(6);
                cellTitulo.setCellValue("Quantidade");
                cellTitulo.setCellStyle(centro);

                cellTitulo = rowTitulo.createCell(7);
                cellTitulo.setCellValue("R$ Unit.");
                cellTitulo.setCellStyle(direita);

                cellTitulo = rowTitulo.createCell(8);
                cellTitulo.setCellValue("R$ Total");
                cellTitulo.setCellStyle(direita);

                //Após gravar o cabeçalho começa a gravas os detalhes da NF
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(xmlFile);
                nList = doc.getElementsByTagName("infNFe");

                //Passa pelo nó "infNFe" capturando o cabeçalho da NF            
                for (int i = 0; i < nList.getLength(); i++) {
                    System.out.println("Processando elemento " + (i + 1) + "/" + nList.getLength());
                    Node node = nList.item(i);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {

                        //Captura o texto de cada tag do xml especificado abaixo (Cabeçalho da NF)
                        Element element = (Element) node;
                        String infNFeNF = element.getElementsByTagName("nNF").item(0).getTextContent();
                        String infNFeFornecedor = element.getElementsByTagName("xNome").item(0).getTextContent();

                        //Passa pelo nó "prod" capturando cada registro (detalhes da NF)
                        NodeList pns = element.getElementsByTagName("prod");
                        for (int j = 0; j < pns.getLength(); j++) {
                            Node prod = pns.item(j);
                            if (prod.getNodeType() == Node.ELEMENT_NODE) {

                                //Captura o texto de cada tag do xml especificado abaixo para gravar nas células
                                Element product = (Element) prod;
                                String pnMaterial = product.getElementsByTagName("cProd").item(0).getTextContent();
                                String pnDescricao = product.getElementsByTagName("xProd").item(0).getTextContent();
                                String pnUM = product.getElementsByTagName("uCom").item(0).getTextContent();
                                String pnQuantidade = product.getElementsByTagName("qCom").item(0).getTextContent();
                                String pnCustoUnitario = product.getElementsByTagName("vUnCom").item(0).getTextContent();
                                String pnCustoTotal = product.getElementsByTagName("vProd").item(0).getTextContent();

                                ///Definindo formatos das células        
                                XSSFDataFormat df = workbook.createDataFormat();

                                XSSFCellStyle moeda = workbook.createCellStyle();
                                moeda.setDataFormat(df.getFormat("[$R$-pt-BR] * #0.00"));
                                moeda.setAlignment(HorizontalAlignment.RIGHT);

                                XSSFCellStyle data = workbook.createCellStyle();
                                data.setDataFormat(df.getFormat("dd/mm/yyyy"));
                                data.setAlignment(HorizontalAlignment.CENTER);

                                //Criando as linhas e escrevendo os valores nas celulas
                                Row rowDetalhes = sheet.createRow(rowNum++);

                                Cell cellDetalhes = rowDetalhes.createCell(0);
                                cellDetalhes.setCellValue(infNFeNF);
                                cellDetalhes.setCellStyle(centro);

                                cellDetalhes = rowDetalhes.createCell(1);
                                cellDetalhes.setCellValue(new Date());
                                cellDetalhes.setCellStyle(data);

                                cellDetalhes = rowDetalhes.createCell(2);
                                cellDetalhes.setCellValue(infNFeFornecedor);
                                cellDetalhes.setCellStyle(centro);

                                cellDetalhes = rowDetalhes.createCell(3);
                                cellDetalhes.setCellValue(pnMaterial);
                                cellDetalhes.setCellStyle(centro);

                                cellDetalhes = rowDetalhes.createCell(4);
                                cellDetalhes.setCellValue(pnDescricao);
                                cellDetalhes.setCellStyle(esquerda);

                                cellDetalhes = rowDetalhes.createCell(5);
                                cellDetalhes.setCellValue(pnUM);
                                cellDetalhes.setCellStyle(centro);

                                cellDetalhes = rowDetalhes.createCell(6);
                                cellDetalhes.setCellValue(Float.parseFloat(pnQuantidade));
                                cellDetalhes.setCellStyle(centro);
                                cellDetalhes.setCellType(CellType.NUMERIC);

                                cellDetalhes = rowDetalhes.createCell(7);
                                cellDetalhes.setCellValue(Float.parseFloat(pnCustoUnitario));
                                cellDetalhes.setCellStyle(direita);
                                cellDetalhes.setCellStyle(moeda);

                                cellDetalhes = rowDetalhes.createCell(8);
                                cellDetalhes.setCellValue(Float.parseFloat(pnCustoTotal));
                                cellDetalhes.setCellStyle(direita);
                                cellDetalhes.setCellStyle(moeda);
                            }
                        }
                    }
                }
                //Gera o arquivo excel na pasta selecionada
                try {
                    FileOutputStream outputStream = new FileOutputStream("C:/Temp/Excel-Out-MWM.xlsx");
                    workbook.write(outputStream);
                    workbook.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Conversão finalizada, processado " + nList.getLength() + " infNFe!");
        }
    }
}

Opa, montei um exemplo simples para ver se te da uma luz não tah ideal por conta que fiz aqui rapidinho mas no final te falo o que tem que dar uma atenção:

public class ProcessadorDeArquivos {
private File diretorio;
private ExcellHelper helper;

public static void main(String[] args) throws Exception {
	System.out.println("Executando ProcessadorDeArquivos");
	System.out.println("uma forma facil de jogar xmls malucos em um excell profissional!!");
	if(args.length != 2) {
		System.out.println("para excecutar esse programa vc deve rodar da seguinte forma:");
		System.out.println("java -jar ProcessadorDeArquivos <diretoriosComXMLs> <nomeDoArquivoExcellSemExtencao>");
		return;
	}
	ProcessadorDeArquivos processador = new ProcessadorDeArquivos(args[0]);
	ExcellHelper helper =  new ExcellHelper(args[1]);
	processador.processarArquivos(helper);

	//gera o excell com todos os aquivos
	helper.geraArquivo();
	
}

private void processarArquivos(ExcellHelper helper) throws ParserConfigurationException, SAXException, IOException {
	File[] arquivos = this.diretorio.listFiles();
	for (int i = 0; i < arquivos.length; i++) {
		File file = arquivos[i];
		
		//legal validar se o arquivo é um xml e esta no formato adequado para o processo mas isso vc ve se é importante fazer
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(file);
        
        //aqui vc manda o conteudo para o helper no metodo de criar a linha
        //helper.criaLinha(nList);
	}
	//terminou de processar todos os arquivos
}

public ProcessadorDeArquivos(String pathFiles) throws Exception {
	this.diretorio = new File(pathFiles);
	if(!diretorio.isDirectory()) {
		System.out.println("total de arquivos para importar:"+diretorio.listFiles().length);
	}else {
		throw new Exception("O parametro deve ser um diretorio!!");
	}
}

}

Classe responsavel por criar as coisas no excell:

import org.w3c.dom.NodeList;

public class ExcellHelper {

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Tabela com Valores dos Arquivos");
FileOutputStream outputStream;

private int rowItem;
public ExcellHelper(String excellFileName) throws FileNotFoundException {
	gerarCabecalho();
	this.outputStream = new FileOutputStream(excellFileName+".xlsx");
}

private void gerarCabecalho() {
	// coloca as regras para criar a primeira linha da tabela
	//lembra que não da para usar um rowItem tem que ser rowEspecifico do cabeçalho 0
}

public void criaLinha(NodeList nList) {
	Row rowDetalhes = sheet.createRow(rowItem++);
	//cria a regra de popular a linhas de acordo com o nodelist que representa a linha
	//ao termino adisiona para focar a proxima linha
	rowItem++;
}

public void geraArquivo() throws IOException {
	try {
        workbook.write(this.outputStream);
        workbook.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
		this.outputStream.close();
	}
}

}

Dividindo a responsabilidade das coisas em classes distintas fica mais facil, o que não esta ideal no meu exemplo é que as 2 classes tem que entender sobre o conteudo do arquivo xml o ideal é ter uma classe para abstrair as infromações do arquivo, o motivo é ter as regras centralizadas em classes especificas … imagina se vc tem um modelo de arquivo X que vc esta exportando vc deixa cada classe entender uma parte deste arquivo caso aparece outro modelo de arquivo pronto vc vai ter que mudar em diversos lugares para adaptar a leitura do arquivo ou a validação de seu conteudo.
Então regra de ouro baixo acoplamento alta coesão

@marco_aurelioo
Cara fiquei a noite toda tentando hehehe
Olha só até onde cheguei, mas ainda não consegui compilar, onde será que estou errando?

Obs.: Não sabia como rodar como diz seu comentário:
System.out.println("java -jar ProcessadorDeArquivos <diretoriosComXMLs> <nomeDoArquivoExcellSemExtencao>" );

Então passei os parâmetros dentro dos construtores (acho que da certo também né?):
ProcessadorDeArquivos processador = new ProcessadorDeArquivos("C:\\temp\\");
ExcellHelper helper = new ExcellHelper("Excel-Out");
processador.processarArquivos(helper);

Abaixo como ficou as classes, cara se puder me ajudar fazer essa bagaça funcionar porque está difícil, estou anexando meu aquivo xml tamém:

Classe ProcessadorDeArquivos

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ProcessadorDeArquivos {

    private File diretorio;
    private ExcellHelper helper;

    public static void main(String[] args) throws Exception {
        System.out.println("Executando ProcessadorDeArquivos");
        System.out.println("uma forma facil de jogar xmls malucos em um excell profissional!!");
//        if (args.length != 2) {
//            System.out.println("para excecutar esse programa vc deve rodar da seguinte forma:");
//            System.out.println("java -jar ProcessadorDeArquivos <diretoriosComXMLs> <nomeDoArquivoExcellSemExtencao>");
//            return;
//        }
        //Aqui fiz a alteração para passar o diretório e o arquivo a gerar
        ProcessadorDeArquivos processador = new ProcessadorDeArquivos("C:\\temp\\");
        ExcellHelper helper = new ExcellHelper("Excel-Out");
        processador.processarArquivos(helper);

        //gera o excell com todos os aquivos
        helper.geraArquivo();

    }

    private void processarArquivos(ExcellHelper helper) throws ParserConfigurationException, SAXException, IOException {
        File[] arquivos = this.diretorio.listFiles();
        for (int i = 0; i < arquivos.length; i++) {
            File file = arquivos[i];

            //legal validar se o arquivo é um xml e esta no formato adequado para o processo mas isso vc ve se é importante fazer
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(file);

            //aqui vc manda o conteudo para o helper no metodo de criar a linha
            //Passa pelo nó "infNFe" capturando os detalhes da nf     
            NodeList nList = doc.getElementsByTagName("infNFe");
            for (int n1 = 0; n1 < nList.getLength(); n1++) {
                Node node = nList.item(n1);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;

                    //Passa pelo nó "prod" capturando cada registro (detalhes da nf)
                    NodeList nList2 = element.getElementsByTagName("prod");
                    for (int j = 0; j < nList2.getLength(); j++) {
                        Node prod = nList2.item(j);
                        if (prod.getNodeType() == Node.ELEMENT_NODE) {
                            Element product = (Element) prod;
                            helper.criaLinha(element, product);
                        }
                    }
                }
            }
        }
    }//terminou de processar todos os arquivos

    public ProcessadorDeArquivos(String pathFiles) throws Exception {
        this.diretorio = new File(pathFiles);
        if (!diretorio.isDirectory()) {
            System.out.println("total de arquivos para importar:" + diretorio.listFiles().length);
        } else {
            throw new Exception("O parametro deve ser um diretorio!!");
        }
    }
}

Classe ExcellHelper

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.w3c.dom.Element;

public class ExcellHelper {

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Tabela com Valores dos Arquivos");
    FileOutputStream outputStream;

    private int rowItem = 0;

    public ExcellHelper(String excellFileName) throws FileNotFoundException {
        gerarCabecalho();
        this.outputStream = new FileOutputStream(excellFileName + ".xlsx");
    }

    private void gerarCabecalho() {
        ///Definindo formatos das células        
        sheet.createFreezePane(0, 1);
        sheet.setZoom(80);

        XSSFCellStyle centro = workbook.createCellStyle();
        centro.setAlignment(HorizontalAlignment.CENTER);

        XSSFCellStyle esquerda = workbook.createCellStyle();
        esquerda.setAlignment(HorizontalAlignment.LEFT);

        XSSFCellStyle direita = workbook.createCellStyle();
        direita.setAlignment(HorizontalAlignment.RIGHT);

        XSSFDataFormat df = workbook.createDataFormat();

        XSSFCellStyle moeda = workbook.createCellStyle();
        moeda.setDataFormat(df.getFormat("[$R$-pt-BR] * #0.00"));
        moeda.setAlignment(HorizontalAlignment.RIGHT);

        XSSFCellStyle data = workbook.createCellStyle();
        data.setDataFormat(df.getFormat("dd/mm/yyyy"));
        data.setAlignment(HorizontalAlignment.CENTER);

        // coloca as regras para criar a primeira linha da tabela
        //lembra que não da para usar um rowItem tem que ser rowEspecifico do cabeçalho 0
        Row rowTitulo = sheet.createRow(0);

        Cell cellTitulo = rowTitulo.createCell(rowItem);
        cellTitulo.setCellValue("NF");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(1);
        cellTitulo.setCellValue("Data");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(2);
        cellTitulo.setCellValue("Fornecedor");
        cellTitulo.setCellStyle(esquerda);

        cellTitulo = rowTitulo.createCell(3);
        cellTitulo.setCellValue("Material");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(4);
        cellTitulo.setCellValue("Descricao");
        cellTitulo.setCellStyle(esquerda);

        cellTitulo = rowTitulo.createCell(5);
        cellTitulo.setCellValue("UM");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(6);
        cellTitulo.setCellValue("Quantidade");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(7);
        cellTitulo.setCellValue("R$ Unit.");
        cellTitulo.setCellStyle(direita);

        cellTitulo = rowTitulo.createCell(8);
        cellTitulo.setCellValue("R$ Total");
        cellTitulo.setCellStyle(direita);
    }

    public void criaLinha(Element element, Element product) {
        ///Definindo formatos das células        
        sheet.createFreezePane(0, 1);
        sheet.setZoom(80);

        XSSFCellStyle centro = workbook.createCellStyle();
        centro.setAlignment(HorizontalAlignment.CENTER);

        XSSFCellStyle esquerda = workbook.createCellStyle();
        esquerda.setAlignment(HorizontalAlignment.LEFT);

        XSSFCellStyle direita = workbook.createCellStyle();
        direita.setAlignment(HorizontalAlignment.RIGHT);

        XSSFDataFormat df = workbook.createDataFormat();

        XSSFCellStyle moeda = workbook.createCellStyle();
        moeda.setDataFormat(df.getFormat("[$R$-pt-BR] * #0.00"));
        moeda.setAlignment(HorizontalAlignment.RIGHT);

        XSSFCellStyle data = workbook.createCellStyle();
        data.setDataFormat(df.getFormat("dd/mm/yyyy"));
        data.setAlignment(HorizontalAlignment.CENTER);

        //cria a regra de popular a linhas de acordo com o nodelist que representa a linha
        //ao termino adisiona para focar a proxima linha
        String nf = element.getElementsByTagName("nNF").item(0).getTextContent();
        String fornecedor = element.getElementsByTagName("xNome").item(0).getTextContent();

        String material = product.getElementsByTagName("cProd").item(0).getTextContent();
        String descricao = product.getElementsByTagName("xProd").item(0).getTextContent();
        String um = product.getElementsByTagName("uCom").item(0).getTextContent();
        String quantidade = product.getElementsByTagName("qCom").item(0).getTextContent();
        String custoUnitario = product.getElementsByTagName("vUnCom").item(0).getTextContent();
        String custoTotal = product.getElementsByTagName("vProd").item(0).getTextContent();

        //Criando as linhas e escrevendo os valores nas celulas
        Row rowDetalhes = sheet.createRow(rowItem++);

        Cell cellDetalhes = rowDetalhes.createCell(0);
        cellDetalhes.setCellValue(nf);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(1);
        cellDetalhes.setCellValue(new Date());
        cellDetalhes.setCellStyle(data);

        cellDetalhes = rowDetalhes.createCell(2);
        cellDetalhes.setCellValue(fornecedor);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(3);
        cellDetalhes.setCellValue(material);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(4);
        cellDetalhes.setCellValue(descricao);
        cellDetalhes.setCellStyle(esquerda);

        cellDetalhes = rowDetalhes.createCell(5);
        cellDetalhes.setCellValue(um);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(6);
        cellDetalhes.setCellValue(Float.parseFloat(quantidade));
        cellDetalhes.setCellStyle(centro);
        cellDetalhes.setCellType(CellType.NUMERIC);

        cellDetalhes = rowDetalhes.createCell(7);
        cellDetalhes.setCellValue(Float.parseFloat(custoUnitario));
        cellDetalhes.setCellStyle(direita);
        cellDetalhes.setCellStyle(moeda);

        cellDetalhes = rowDetalhes.createCell(8);
        cellDetalhes.setCellValue(Float.parseFloat(custoTotal));
        cellDetalhes.setCellStyle(direita);
        cellDetalhes.setCellStyle(moeda);

        rowItem++;
    }

    public void geraArquivo() throws IOException {
        try {
            workbook.write(this.outputStream);
            workbook.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            this.outputStream.close();
        }
    }
}

Estou adicionando os dois xml:

ModeloXML2.xml (7,4 KB)
ModeloXML1.xml (8,4 KB)

tem um erro que eu deixei passar … a validação se é um diretorio esta com uma negação errada
if(!diretorio.isDirectory())
deveria ser
if(diretorio.isDirectory())
funcionou ok

Passou, compilou com sucesso, mas ainda não gerou o arquivo, cara onde será que estou errando? ja reli todo código umas 500x:

Saida:

run:
Executando ProcessadorDeArquivos
uma forma facil de jogar xmls malucos em um excell profissional!!
total de arquivos para importar:2
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

ExcellHelper.java (7,3 KB)
ModeloXML1.xml (8,4 KB)
ProcessadorDeArquivos.java (3,3 KB)
ModeloXML2.xml (7,4 KB)

vc esta rodando direto na sua ide, deve ter gerado um arquivo no diretório da sua aplicação
tenta colocar um caminho absoluto para o arquivo resultante aqui funcionou ok.

@marco_aurelioo você é o cara…
Deu certo mesmo, agora só preciso definir o caminho da planilha exportada estou tentando aqui, a ideia é após importar os xmls abrir uma caixa de diálogo perguntando onde queremos salvar a planilha (se não for pedir muito, caso você já tenha essa lógica pronta compartilha com nós) ai cara mata todas e posto aqui pra galera o resultado final.

coloca new ExcellHelper(“c:\seudiretoriodesaida\Excel-Out”);

ai gera o arquivo onde vc quer

@marco_aurelioo
Salvou minha vida, em minutos você resolveu algo que estou a dias, muito obrigado mesmo…você manja muito cara, um dia chego lá. Abaixo Classes finalizadas rodando 100%.

ProcessadorDeArquivos
Classe principal que deve ser executada:

import java.io.File;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ProcessadorDeArquivos {

    private final File diretorio;

    public static void main(String[] args) throws Exception {
        System.out.println("Importando XMLs...\n");

        //Iniciando a janela para selecionar a pasta que tem os xmls a converter
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        //Inicia variável que verifica se foi selecionada uma pasta
        int res = fc.showOpenDialog(null);

        //Verifica se foi selecionado a pasta, caso sim executa o camando
        if (res == JFileChooser.APPROVE_OPTION) {
            //Captura o caminho da pasta selecionada
            File folder = new File(fc.getSelectedFile().getAbsolutePath().toString());
            System.out.println("Pasta: " + folder);

            ProcessadorDeArquivos processador = new ProcessadorDeArquivos(folder + "\\");
            ExcellHelper helper = new ExcellHelper();
            processador.processarArquivos(helper);

            //Gera o Excel com todos os aquivos xml da pasta
            helper.geraArquivo();
        }

    }

    private void processarArquivos(ExcellHelper helper) throws ParserConfigurationException, SAXException, IOException {
        File[] arquivos = this.diretorio.listFiles();
        for (int i = 0; i < arquivos.length; i++) {
            File file = arquivos[i];

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(file);

            //Aqui vc manda o conteudo para o helper no metodo de criar a linha
            //Passa pelo nó "infNFe" capturando os detalhes da nf     
            NodeList nList = doc.getElementsByTagName("infNFe");
            for (int n1 = 0; n1 < nList.getLength(); n1++) {
                Node node = nList.item(n1);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;

                    //Passa pelo nó "prod" capturando cada registro (detalhes da nf)
                    NodeList nList2 = element.getElementsByTagName("prod");
                    for (int j = 0; j < nList2.getLength(); j++) {
                        Node prod = nList2.item(j);
                        if (prod.getNodeType() == Node.ELEMENT_NODE) {
                            Element product = (Element) prod;
                            helper.criaLinha(element, product);
                        }
                    }
                }
            }
        }
    }//terminou de processar todos os arquivos

    public ProcessadorDeArquivos(String pathFiles) throws Exception {
        this.diretorio = new File(pathFiles);
        if (diretorio.isDirectory()) {
            System.out.println("total de arquivos importados:" + diretorio.listFiles().length + "\n");
        } else {
            throw new Exception("O parametro deve ser um diretorio!!");
        }
    }
}

ExcellHelper
Classe auxiliar que faz a importação dos xmls e exportação do Excel final consolidado de todos os xmls:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import javax.swing.JFileChooser;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.w3c.dom.Element;

public class ExcellHelper {

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("XMLs importados");
    FileOutputStream outputStream;

    private int rowItem = 0;

    public ExcellHelper() throws FileNotFoundException {
        gerarCabecalho();

        JFileChooser fc = new JFileChooser();
        int option = fc.showSaveDialog(null);
        if (option == JFileChooser.APPROVE_OPTION) {
            String filename = fc.getSelectedFile().getName();
            String path = fc.getSelectedFile().getParentFile().getPath();
            String endereco = path + "/" + filename + ".xlsx";

            this.outputStream = new FileOutputStream(endereco);
        }
    }

    private void gerarCabecalho() {
        ///Formatando as células    
        sheet.createFreezePane(0, 1);
        sheet.setZoom(80);

        XSSFCellStyle centro = workbook.createCellStyle();
        centro.setAlignment(HorizontalAlignment.CENTER);

        XSSFCellStyle esquerda = workbook.createCellStyle();
        esquerda.setAlignment(HorizontalAlignment.LEFT);

        XSSFCellStyle direita = workbook.createCellStyle();
        direita.setAlignment(HorizontalAlignment.RIGHT);

        XSSFDataFormat df = workbook.createDataFormat();

        XSSFCellStyle moeda = workbook.createCellStyle();
        moeda.setDataFormat(df.getFormat("[$R$-pt-BR] * #0.00"));
        moeda.setAlignment(HorizontalAlignment.RIGHT);

        XSSFCellStyle data = workbook.createCellStyle();
        data.setDataFormat(df.getFormat("dd/mm/yyyy"));
        data.setAlignment(HorizontalAlignment.CENTER);

        //Cria a primeira linha da planilha (título)
        Row rowTitulo = sheet.createRow(rowItem++);

        Cell cellTitulo = rowTitulo.createCell(0);
        cellTitulo.setCellValue("NF");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(1);
        cellTitulo.setCellValue("Data");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(2);
        cellTitulo.setCellValue("Fornecedor");
        cellTitulo.setCellStyle(esquerda);

        cellTitulo = rowTitulo.createCell(3);
        cellTitulo.setCellValue("Material");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(4);
        cellTitulo.setCellValue("Descricao");
        cellTitulo.setCellStyle(esquerda);

        cellTitulo = rowTitulo.createCell(5);
        cellTitulo.setCellValue("UM");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(6);
        cellTitulo.setCellValue("Quantidade");
        cellTitulo.setCellStyle(centro);

        cellTitulo = rowTitulo.createCell(7);
        cellTitulo.setCellValue("R$ Unit.");
        cellTitulo.setCellStyle(direita);

        cellTitulo = rowTitulo.createCell(8);
        cellTitulo.setCellValue("R$ Total");
        cellTitulo.setCellStyle(direita);
    }

    //Cria as demais linhas abaixo do título
    public void criaLinha(Element element, Element product) {
        ///Formatando as células
        XSSFCellStyle centro = workbook.createCellStyle();
        centro.setAlignment(HorizontalAlignment.CENTER);

        XSSFCellStyle esquerda = workbook.createCellStyle();
        esquerda.setAlignment(HorizontalAlignment.LEFT);

        XSSFCellStyle direita = workbook.createCellStyle();
        direita.setAlignment(HorizontalAlignment.RIGHT);

        XSSFDataFormat df = workbook.createDataFormat();

        XSSFCellStyle moeda = workbook.createCellStyle();
        moeda.setDataFormat(df.getFormat("[$R$-pt-BR] * #0.00"));
        moeda.setAlignment(HorizontalAlignment.RIGHT);

        XSSFCellStyle data = workbook.createCellStyle();
        data.setDataFormat(df.getFormat("dd/mm/yyyy"));
        data.setAlignment(HorizontalAlignment.CENTER);

        //Popula as linhas de acordo com o nodelist que representa cada linha
        String nf = element.getElementsByTagName("nNF").item(0).getTextContent();
        String fornecedor = element.getElementsByTagName("xNome").item(0).getTextContent();

        String material = product.getElementsByTagName("cProd").item(0).getTextContent();
        String descricao = product.getElementsByTagName("xProd").item(0).getTextContent();
        String um = product.getElementsByTagName("uCom").item(0).getTextContent();
        String quantidade = product.getElementsByTagName("qCom").item(0).getTextContent();
        String custoUnitario = product.getElementsByTagName("vUnCom").item(0).getTextContent();
        String custoTotal = product.getElementsByTagName("vProd").item(0).getTextContent();

        //Criando as linhas e escrevendo os valores nas celulas
        Row rowDetalhes = sheet.createRow(rowItem++);

        Cell cellDetalhes = rowDetalhes.createCell(0);
        cellDetalhes.setCellValue(nf);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(1);
        cellDetalhes.setCellValue(new Date());
        cellDetalhes.setCellStyle(data);

        cellDetalhes = rowDetalhes.createCell(2);
        cellDetalhes.setCellValue(fornecedor);
        cellDetalhes.setCellStyle(esquerda);

        cellDetalhes = rowDetalhes.createCell(3);
        cellDetalhes.setCellValue(material);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(4);
        cellDetalhes.setCellValue(descricao);
        cellDetalhes.setCellStyle(esquerda);

        cellDetalhes = rowDetalhes.createCell(5);
        cellDetalhes.setCellValue(um);
        cellDetalhes.setCellStyle(centro);

        cellDetalhes = rowDetalhes.createCell(6);
        cellDetalhes.setCellValue(Float.parseFloat(quantidade));
        cellDetalhes.setCellStyle(centro);
        cellDetalhes.setCellType(CellType.NUMERIC);

        cellDetalhes = rowDetalhes.createCell(7);
        cellDetalhes.setCellValue(Float.parseFloat(custoUnitario));
        cellDetalhes.setCellStyle(direita);
        cellDetalhes.setCellStyle(moeda);

        cellDetalhes = rowDetalhes.createCell(8);
        cellDetalhes.setCellValue(Float.parseFloat(custoTotal));
        cellDetalhes.setCellStyle(direita);
        cellDetalhes.setCellStyle(moeda);
    }

    public void geraArquivo() throws IOException {
        try {
            //Aplicando redimensionamento nas colunas
            for (int z = 0; z < 10; z++) {
                sheet.autoSizeColumn(z);
            }
            //Congelando a primeira linha (título)
            sheet.createFreezePane(0, 1);
            //Aplicando zoom 80% na sheet
            sheet.setZoom(80);

            //Criando o arquivo Excel
            workbook.write(this.outputStream);
            workbook.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            this.outputStream.close();
        }
    }
}

Créditos para nosso parceiro @marco_aurelioo que me ajudou nessa empreitada, compartilho para que outros possam usufruir do conhecimento.

xmls de exemplo para usar caso precisem:

ModeloXML1.xml (7,4 KB)

1 curtida