Un fichier CSV avec "ID" comme premier élément est corrompu dans Excel

J’essaie d’écrire des données dans un fichier CSV avec Java, cependant quand j’essaie d’ouvrir le fichier produit avec Excel, j’obtiens une erreur disant que le fichier est corrompu. En ouvrant le fichier dans le bloc-notes, il semble être correctement formaté, donc je ne suis pas sûr de ce qui pose problème. J’utilise la classe FileWriter pour envoyer les données vers le fichier.

FileWriter writer = new FileWriter("test.csv");

writer.append("ID");
writer.append(',');
writer.append("name");
writer.append(',');
...
writer.append('\n');

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

Ai-je besoin d’utiliser une bibliothèque en Java pour écrire dans un fichier CSV ? Je supposais qu’on pouvait simplement le faire nativement en Java tant qu’on utilisait le bon formatage.

Cordialement,

Shaw


Source : [Stack Overflow](Symbolic Link (SYLK) - Wikipedia

C’est parce que MS Excel ne peut pas décider comment ouvrir le fichier avec un tel contenu.

Pour résoudre le problème, remplacez "ID" par "id".

Lorsque vous avez ID comme premier mot dans un fichier de type tableur, cela correspond à la spécification d’un fichier SYLK et MS Excel (et potentiellement d’autres applications de tableur) tente de l’ouvrir comme un fichier SYLK. Cependant, il ne répond pas à la spécification complète d’un fichier SYLK puisque le reste des valeurs dans le fichier sont séparées par des virgules. D’où l’erreur affichée.

id
Name

1
Jon Doe

2
Jane Doe

En bonus, pour essayer de minimiser les accès au fichier en utilisant moins l’objet fichier.

J’ai testé et le code ci-dessous devrait fonctionner.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class CsvWriter {
  public static void main(String[] args) {

    try (PrintWriter writer = new PrintWriter("test.csv")) {

      StringBuilder sb = new StringBuilder();
      sb.append("id");
      sb.append(',');
      sb.append("Name");
      sb.append('\n');

      sb.append("1");
      sb.append(',');
      sb.append("Jon Doe");
      sb.append('\n');

      sb.append("2");
      sb.append(',');
      sb.append("Jane Doe");
      sb.append('\n');

      writer.write(sb.toString());

      System.out.println("write success.");

    } catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    }

  }
}