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 [email removido]
*/
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!");
}
}