Search code examples
javaexcelcsvexport-to-csv

CSV file with "ID" as first item is corrupt in Excel


I am trying to write data to a csv file with java, however when I try opening the produced file with excel I am getting an error saying the file is corrupt. Upon opening the file in notepad it looks to be formatted correctly so I'm not sure what the issue is. I am using the FileWriter class to output the data to the file.

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

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

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

Do I need to use some library in java in order to print to a csv file? I presumed you could just do this natively in java as long as you used the correct formatting.

Appreciate the help,

Shaw


Solution

  • It's because MS Excel can't decide how to open the file with such content.

    To solve the issue, replace "ID" with "id".

    When you have ID as the first word in a SpreadSheet type file, it matches the specification of a SYLK file and MS Excel (and potentially other SpreadSheet Apps) attempts to open as a SYLK file. However, it does not meet the complete specification of a SYLK file since rest of the values in the file are comma separated. Hence, the error is shown.

    id Name
    1 Jon Doe
    2 Jane Doe

    As a bonus, trying to minimize file access by using file object less.

    I tested and the code below should work.

    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());
        }
    
      }
    }