Como escrever arquivos CSV em java


Existem várias formas de escrever arquivos CSV em Java. Neste post vamos ver como criar arquivos CSV em java com o auxílio da biblioteca open-source OpenCSV.

>> Como ler arquivos CSV em java

OpenCSV como dependência (maven)

Para utilizar o OpenCSV você precisa importá-lo como dependência no seu projeto. Se você estiver utilizando o Maven, basta adicionar a seguinte dependência no seu arquivo pom.xml.

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>4.2</version>
</dependency>

Escrevendo CSV como uma lista de String[]

Uma situação simples é quando você tem uma lista de arrays de String, ou seja List<String[]>, e quer escrever esses arrays como registros de um csv. Veja no código abaixo como fazer isso com o OpenCSV.

package br.com.dicasdejava.util.csv;

import com.opencsv.CSVWriter;

import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class CriarCsvComStringsOpenCsv {

    public static void main(String[] args) throws IOException {

        String[] cabecalho = {"nome", "idade", "telefone"};

        List<String[]> linhas = new ArrayList<>();
        linhas.add(new String[]{"Joao","35","joao@dicasdejava.com.br"});
        linhas.add(new String[]{"Maria","23","maria@dicasdeprogramacao.com.br"});
        linhas.add(new String[]{"Ana","25","ana@dicasdejava.com.br"});

        Writer writer = Files.newBufferedWriter(Paths.get("pessoas.csv"));
        CSVWriter csvWriter = new CSVWriter(writer);

        csvWriter.writeNext(cabecalho);
        csvWriter.writeAll(linhas);

        csvWriter.flush();
        writer.close();

    }

}

Escrevendo CSV como um objeto

Outra forma interessante de criar um CSV é quando você tem uma lista de objetos de uma Classe que deve representar uma linha no csv.

Para isto, vamos criar como exemplo a classe CsvPessoa com os atributos contidos no CSV.

package br.com.dicasdejava.csv;

public class CsvPessoa {
    private String nome;
    private Integer idade;
    private String email;

    public CsvPessoa(String nome, Integer idade, String email) {
        this.nome = nome;
        this.idade = idade;
        this.email = email;
    }

    // Gets e Sets omitidos para ficar menor

}

Agora vamos escrever o CSV com uma lista de pessoas, ou seja List<CsvPessoa>.

package br.com.dicasdejava.util.csv;

import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;

import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class CriarCsvComObjetosOpenCsv {

    public static void main(String[] args) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {

        List<CsvPessoa> pessoas = new ArrayList<>();
        pessoas.add(new CsvPessoa("Joao",35,"joao@dicasdejava.com.br"));
        pessoas.add(new CsvPessoa("Maria",23,"maria@dicasdeprogramacao.com.br"));
        pessoas.add(new CsvPessoa("Ana",25,"ana@dicasdejava.com.br"));

        Writer writer = Files.newBufferedWriter(Paths.get("pessoas.csv"));
        StatefulBeanToCsv<CsvPessoa> beanToCsv = new StatefulBeanToCsvBuilder(writer).build();

        beanToCsv.write(pessoas);

        writer.flush();
        writer.close();

    }

}

A Saída dos dois programas acima é um arquivo pessoas.csv com o conteúdo abaixo:

email,idade,nome
joao@dicasdejava.com.br,35,Joao
maria@dicasdeprogramacao.com.br,23,Maria
ana@dicasdejava.com.br,25,Ana

Referências:

  1. OpenCSV
  2. Códigos-fonte deste post