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