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