prosource

첫 번째 항목이 "ID"인 CSV 파일이 Excel에서 손상되었습니다.

probook 2023. 5. 8. 22:19
반응형

첫 번째 항목이 "ID"인 CSV 파일이 Excel에서 손상되었습니다.

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

CSV 파일로 인쇄하려면 Java의 일부 라이브러리를 사용해야 합니까?저는 당신이 올바른 포맷을 사용하기만 한다면 이것을 자바에서 기본적으로 할 수 있을 것이라고 생각했습니다.

도와주셔서 감사합니다

MS Excel이 그런 내용의 파일을 어떻게 열어야 할지 결정할 수 없기 때문입니다.

문제를 해결하려면 대체"ID"와 함께"id".

당신이 가지고 있는ID스프레드시트 유형 파일의 첫 번째 단어로, 이는 SYLK 파일의 사양과 일치하며 MS Excel(및 잠재적으로 다른 스프레드시트 앱)이 SYLK 파일로 열려고 시도합니다.그러나 파일의 나머지 값은 쉼표로 구분되어 있기 때문에 파일의 전체 사양을 충족하지 못합니다.따라서 오류가 표시됩니다.

이드 이름.
1 존 도우
2 제인 도우

추가적으로, 파일 개체를 적게 사용하여 파일 액세스를 최소화하려고 합니다.

테스트를 해보니 아래 코드가 작동할 것 같습니다.

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

  }
}
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!");
    }
}

이 코드를 컴파일한 후 CSV에 문자열 값을 표시하는 Java의 간단한 코드라고 생각합니다.

public class CsvWriter {
    public static void main(String args[]) {
        // File input path
        System.out.println("Starting....");
        File file = new File("/home/Desktop/test/output.csv");
        try {
            FileWriter output = new FileWriter(file);
            CSVWriter write = new CSVWriter(output);
            // Header column value
            String[] header = { "ID", "Name", "Address", "Phone Number" };
            write.writeNext(header);
            // Value
            String[] data1 = { "1", "First Name", "Address1", "12345" };
            write.writeNext(data1);
            String[] data2 = { "2", "Second Name", "Address2", "123456" };
            write.writeNext(data2);
            String[] data3 = { "3", "Third Name", "Address3", "1234567" };
            write.writeNext(data3);
            write.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("End.");
    }
}
 private static final String FILE_HEADER ="meter_Number,latestDate";
    private static final String COMMA_DELIMITER = ",";
    private static final String NEW_LINE_SEPARATOR = "\n";
    static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:m m:ss");

    private void writeToCsv(Map<String, Date> meterMap) {
        try {
            Iterator<Map.Entry<String, Date>> iter = meterMap.entrySet().iterator();
            FileWriter fw = new FileWriter("smaple.csv");
            fw.append(FILE_HEADER.toString());
            fw.append(NEW_LINE_SEPARATOR);
            while (iter.hasNext()) {
                Map.Entry<String, Date> entry = iter.next();
                try {
                    fw.append(entry.getKey());
                    fw.append(COMMA_DELIMITER);
                    fw.append(formatter.format(entry.getValue()));
                    fw.append(NEW_LINE_SEPARATOR);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    iter.remove();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

언급URL : https://stackoverflow.com/questions/30073980/csv-file-with-id-as-first-item-is-corrupt-in-excel

반응형