CSV-Datei mit “ID” als erstes Element ist in Excel beschädigt

Lesezeit: 6 Minuten

Benutzer-Avatar
Schau

Ich versuche, Daten mit Java in eine CSV-Datei zu schreiben, aber wenn ich versuche, die erzeugte Datei mit Excel zu öffnen, erhalte ich eine Fehlermeldung, die besagt, dass die Datei beschädigt ist. Beim Öffnen der Datei im Editor scheint sie korrekt formatiert zu sein, daher bin ich mir nicht sicher, was das Problem ist. Ich verwende die FileWriter-Klasse, um die Daten in die Datei auszugeben.

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

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

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

Muss ich eine Bibliothek in Java verwenden, um in eine CSV-Datei zu drucken? Ich nahm an, Sie könnten dies einfach nativ in Java tun, solange Sie die richtige Formatierung verwenden.

Schätze die Hilfe,

Schau

  • Extrahieren Sie für den Anfang eine Methode zum Schreiben einer einzelnen Zeile und ersetzen Siewriter.append(‘\n’) durchwriter.newLine(). Denn newLine ist betriebssystemabhängig.

    – Beri

    6. Mai 2015 um 10:26 Uhr


  • Haben Sie versucht, die CSV-Datei mit Excel mit Text oder dem Datenimport-Assistenten auf der Registerkarte „Daten“ zu öffnen? Gleiche Corrput-Datei?

    – Exodus

    6. Mai 2015 um 10:40 Uhr

Benutzer-Avatar
Prashant G

Im Grunde liegt es daran, dass MS Excel nicht entscheiden kann, wie die Datei mit solchen Inhalten geöffnet werden soll.

Wenn Sie setzen ID als erstes Zeichen in einer Datei vom Typ Spreadsheet entspricht es der Spezifikation von a SYLK Datei und MS Excel (und möglicherweise andere Tabellenkalkulations-Apps) versuchen, sie als SYLK-Datei zu öffnen. Gleichzeitig erfüllt es jedoch nicht die vollständige Spezifikation einer SYLK-Datei, da die restlichen Werte in der Datei durch Kommas getrennt sind. Daher wird der Fehler angezeigt.

Um das Problem zu lösen, ändern Sie "ID" zu "id" und es sollte wie erwartet funktionieren.

Geben Sie hier die Bildbeschreibung ein

Das ist seltsam. Aber ja!

Versuchen Sie auch, den Dateizugriff zu minimieren, indem Sie weniger Dateiobjekte verwenden.

Ich habe es getestet und der folgende Code funktioniert perfekt.

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

  }
}

  • Wäre es in Ordnung, “pw.print” anstelle von “pw.write” zu verwenden?

    – Aqqqq

    1. April 2017 um 16:00 Uhr

  • Ja. stackoverflow.com/questions/14067843/…

    – Prashant G

    1. April 2017 um 17:27 Uhr

  • Wäre es besser zu verwenden try...finally um sicherzustellen, dass pw geschlossen ist?

    – ch271828n

    3. Februar 2019 um 6:21 Uhr

  • Es hat eine Ausnahme ausgelöst, aber ich habe den Code mit “versuchen mit Ressourcen” aktualisiert.

    – Prashant G

    4. Februar 2019 um 0:43 Uhr

Benutzer-Avatar
Tamil veera Cholan

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

Benutzer-Avatar
Samim Aktar

Ich denke, dies ist ein einfacher Code in Java, der den Zeichenfolgenwert in CSV anzeigt, nachdem dieser Code kompiliert wurde:

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

  • @suraj-rao können wir davon einen Inputstream bekommen?

    – Sumanth Varada

    21. Juli 2019 um 7:54 Uhr


  • Ja, Sie können dies tun, @Sumanth Varada, aber Sie sollten eine Bibliothek importieren müssen

    – Samim Aktar

    22. Juli 2019 um 12:22 Uhr

  • Sie müssen angeben, dass Sie eine OpenCSV-Abhängigkeit oder JAR-Datei verwendet haben. oder zeigen Sie den Benutzern zumindest, dass sie Klassen importieren sollen. geeksforgeeks.org/writing-a-csv-file-in-java-using-opencsv

    – Deva

    29. Juli 2020 um 13:00 Uhr

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

Benutzer-Avatar
Gabriel Arghire

Die Antwort auf diese Frage ist gut, wenn Sie Ihre Datei jedes Mal überschreiben möchten, wenn Sie Ihr Programm erneut ausführen, aber wenn Sie möchten, dass Ihre Aufzeichnungen nicht verloren gehen Wiederholung Ihr Programm, können Sie dies versuchen

public void writeAudit(String actionName) {
    String whereWrite = "./csvFiles/audit.csv";

    try {
        FileWriter fw = new FileWriter(whereWrite, true);
        BufferedWriter bw = new BufferedWriter(fw);
        PrintWriter pw = new PrintWriter(bw);

        Date date = new Date();

        pw.println(actionName + "," + date.toString());
        pw.flush();
        pw.close();

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

Benutzer-Avatar
GeheimagentMan

Ich sehe, Sie haben bereits eine Antwort, aber hier ist eine andere Antwort, vielleicht sogar noch schneller. Eine einfache Klasse, um eine Liste von Objekten zu übergeben und entweder eine CSV- oder Excel-Datei oder eine kennwortgeschützte ZIP-CSV-Datei oder Excel-Datei abzurufen.
https://github.com/ernst223/spread-sheet-exporter

SpreadSheetExporter spreadSheetExporter = new SpreadSheetExporter(List<Object>, "Filename");
File fileCSV = spreadSheetExporter.getCSV();

Benutzer-Avatar
Danny Escalante

Generate CSV file from List of Objects
Finally, following is an example showing how to generate a CSV file from List of objects. The example uses the MyUser class defined in the previous section -

import com.opencsv.CSVWriter;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;

import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class OpenCSVWriter {
    private static final String STRING_ARRAY_SAMPLE = "./example.csv";

    public static void main(String[] args) throws IOException,
            CsvDataTypeMismatchException,
            CsvRequiredFieldEmptyException {

        try ( Writer writer = Files.newBufferedWriter(Paths.get(STRING_ARRAY_SAMPLE));
        ) {
            StatefulBeanToCsv<MyUser> beanToCsv = new StatefulBeanToCsvBuilder(writer)
                    .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                    .build();

            List<MyUser> myUsers = new ArrayList<>();
            myUsers.add(new MyUser("Sundar Pichai ♥", "[email protected]", "+1-1111111111", "India"));
            myUsers.add(new MyUser("Satya Nadella", "[email protected]", "+1-`enter code here`1111111112", "India"));

            beanToCsv.write(myUsers);
        }
    }
}

1018330cookie-checkCSV-Datei mit “ID” als erstes Element ist in Excel beschädigt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy