CSV 文件,其中“ID”作为第一项在 Excel 中已损坏

2022-08-31 16:20:01

我正在尝试使用java将数据写入csv文件,但是当我尝试使用excel打开生成的文件时,我收到一个错误,指出该文件已损坏。在记事本中打开文件后,它看起来格式正确,所以我不确定问题是什么。我正在使用 FileWriter 类将数据输出到该文件。

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

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

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

我是否需要使用Java中的一些库才能打印到csv文件?我认为只要你使用正确的格式,你就可以在java中本地执行此操作。

感谢您的帮助,


答案 1

基本上,这是因为MS Excel无法决定如何打开包含此类内容的文件。

当您将第一个字符放在电子表格类型文件中时,它与SYLK文件的规范相匹配,MS Excel(以及可能的其他电子表格应用程序)尝试将其作为SYLK文件打开。但与此同时,它不符合SYLK文件的完整规范,因为文件中的其余值是逗号分隔的。因此,将显示错误。ID

要解决此问题,请将“ID”更改为“id”,它应该按预期工作。

enter image description here

这很奇怪。但是,是的!

还尝试通过使用文件对象 less 来最小化文件访问。

我测试了,下面的代码工作完美。

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("Prashant Ghimire");
      sb.append('\n');

      writer.write(sb.toString());

      System.out.println("done!");

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

  }
}

答案 2
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class CsvFile {

    public static void main(String[]args){
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new File("NewData.csv"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        StringBuilder builder = new StringBuilder();
        String columnNamesList = "Id,Name";
        // No need give the headers Like: id, Name on builder.append
        builder.append(columnNamesList +"\n");
        builder.append("1"+",");
        builder.append("Chola");
        builder.append('\n');
        pw.write(builder.toString());
        pw.close();
        System.out.println("done!");
    }
}