3
respostas

Converter Lista de Objetos para CSV

Eu criei uma list do meu objeto codigo:

    public List<Codigo> listaCo = new List<Codigo>();

Para adicionar um objeto a essa lista eu uso três argumentos:

    listaCo.Add(new Codigo(codigoLista, login, cracha));

Até ai tudo bem, eu consigo adicionar valores a minha list e também ler esse valores (criei um método para isso).

Eu consigo criar meu arquivo CSV

public void CriarArquivo()
    {
        using (var fluxoDeArquivo = new FileStream(enderecoDeArquivo, FileMode.Create)) //trocar para CreatNew
        using (var escritor = new StreamWriter(fluxoDeArquivo))
        {
            escritor.Write(listaCo);
        }
    }

Porém ai fazer isso o arquivo sai com a mensagem: System.Collections.Generic.List`1[CodificacaoPeca.Codigo]

Eu quero que no arquivo apareçam os valores dos argumentos: codigoLista, login, cracha.

3 respostas

Eai Nicolas, Beleza?

Esta saindo no arquivo exatamente o que você esta pedindo. Isso acontece porque o metodo Write de StreamWriter precisa receber como parametro uma string. Ele até aceita outros valores mas ele o converte para string após isso. Se você tentar pegar a sua List e dar um ToString nela, verá que tera o mesmo resultado que está sendo impresso no seu arquivo .csv

Console.Write(listaCo.ToString()); //saida será System.Collections.Generic.List`1[CodificacaoPeca.Codigo]

Beleza então, agora entendendo isso agora fica mais fácil não é? Basta dar um ToString em cada item da sua lista. Vou te dar dois exemplos:

Aqui apenas adicionamos um foreach para percorrer a sua lista e ir escrevendo cada item dela. Perceba que eu troquei o metodo Write por WriteLine para que pule a linha após escrever o item. E também eu adicionei o ponto e vírgula para separar as propriedades para você abrir em um arquivo excel e ele ficar certinho em cada coluna.

 using (var escritor = new StreamWriter(fluxoDeArquivo))
 {
       foreach (var item in listaCo) 
       {
             escritor.WriteLine($"{item.CodigoLista}; {item.Login}; {item.Cracha}");
      }
}

Outra maneira você pode sobrescrever o metodo ToString da Classe Codigo, seria quase o mesmo que você estava tentando fazer dando um ToString na sua Lista.

public class Codigo
{
    public int CodigoLista { get; set; }
    public string Login { get; set; }
    public string Cracha { get; set; }

    public override string ToString()
    {
        return $"{CodigoLista}; {Login}; {Cracha}";
     }
}

Então sempre que você tiver um objeto do tipo Codigo e dar um ToString nela, terá como retorno essa string que você definiu ali. Isso ajuda se você precisar fazer a escrita do arquivo em mais de um lugar no seu código.

Ai nesse caso, não será necessário fazer a concatenação das propriedades

 using (var escritor = new StreamWriter(fluxoDeArquivo))
 {
       foreach (var item in listaCo) 
       {
             escritor.WriteLine(item);
      }
}

Espero ter ajudado.

Cara eu tentei das duas formas, e o resultado é o mesmo.

Meu arquivo .csv sai vazio! Em branco...

Eu também já tentei escrever os valores da list na tela e da certo, a impressão de que é de que o foreach não é executado, mas não sei verificar isso.

Posta seu codigo inteiro novamente para a gente ver o que pode ser, inclusive a parte que você carrega os valores da lista