2015-05-06 13 views
16

Próbuję zapisać dane do pliku csv za pomocą języka Java, jednak gdy próbuję otworzyć wygenerowany plik za pomocą programu Excel, pojawia się błąd informujący, że plik jest uszkodzony. Po otwarciu pliku w notatniku wygląda na sformatowany poprawnie, więc nie jestem pewien, co to jest problem. Używam klasy FileWriter do wyprowadzania danych do pliku.Java - Zapisywanie ciągów do pliku CSV

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

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

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

Czy muszę użyć biblioteki w java, aby wydrukować plik csv? Sądziłem, że możesz to zrobić natywnie w Javie, o ile używałeś właściwego formatowania.

Docenić pomocy,

Shaw

+2

Na początek wyodrębnić metodą do pisania jednej linii i zastąpić writer.append (\ n ') z writer.newLine(). Ponieważ newLine jest niezawodne w systemie operacyjnym. – Beri

+0

Czy próbowałeś otworzyć plik csv w programie Excel za pomocą Kreatora importu tekstu lub danych z zakładki Dane? Ten sam plik corrput? – exoddus

+0

@Shaw, sprawdź moje rozwiązanie i daj mi znać, czy działa dla Ciebie. –

Odpowiedz

46

Zasadniczo to dlatego, MS Excel nie może zdecydować, jak otworzyć plik z taką zawartością.

Po umieszczeniu ID jako pierwszego znaku w pliku typu Arkusz kalkulacyjny, jest zgodny ze specyfikacją pliku SYLK, a program MS Excel (i potencjalnie inne aplikacje arkusza kalkulacyjnego) próbuje otworzyć go jako plik SYLK. Ale jednocześnie nie spełnia kompletnej specyfikacji pliku SYLK, ponieważ pozostałe wartości w pliku są rozdzielane przecinkami. W związku z tym wyświetlany jest błąd.

Aby rozwiązać problem, zmień "ID" na "id" i powinien działać zgodnie z oczekiwaniami.

enter image description here

To jest dziwne. Ale tak!

Próbuje również zminimalizować dostęp do pliku, używając mniejszego pliku.

Testowałem i poniższy kod działa idealnie.

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 


public class CSV { 
    public static void main(String[]args) throws FileNotFoundException{ 
     PrintWriter pw = new PrintWriter(new File("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'); 

     pw.write(sb.toString()); 
     pw.close(); 
     System.out.println("done!"); 
    } 
} 
+0

Czy można użyć "pw.print" zamiast "pw.write"? – Aqqqq

+0

Tak. http://stackoverflow.com/questions/14067843/difference-between-printwriter-and-filewriter-class –

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