2015-05-06 19 views
16

Tôi đang cố gắng ghi dữ liệu vào tệp csv bằng java, tuy nhiên khi tôi thử mở tệp được tạo bằng excel, tôi nhận được lỗi khi tệp bị hỏng. Sau khi mở tập tin trong notepad nó trông được định dạng đúng vì vậy tôi không chắc chắn vấn đề là gì. Tôi đang sử dụng lớp FileWriter để xuất dữ liệu ra tệp.Java - Viết chuỗi vào tệp CSV

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

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

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

Tôi có cần sử dụng một số thư viện trong java để in ra tệp csv không? Tôi cho rằng bạn chỉ có thể làm điều này nguyên bản trong java miễn là bạn sử dụng định dạng chính xác.

Đánh giá cao sự giúp đỡ,

Shaw

+2

Đối với người mới bắt đầu trích xuất một phương pháp để viết một dòng duy nhất, và thay thế writer.append ('\ n') với writer.newLine(). Bởi vì newLine là đáng tin cậy trên hệ điều hành. – Beri

+0

Bạn đã cố mở tệp csv bằng Excel bằng Trình hướng dẫn nhập văn bản hoặc dữ liệu từ tab dữ liệu chưa? Cùng một tập tin chỉnh sửa? – exoddus

+0

@Shaw, kiểm tra giải pháp của tôi và cho tôi biết nếu làm việc cho bạn. –

Trả lời

46

Về cơ bản đó là vì MS Excel không thể quyết định làm thế nào để mở file với nội dung như vậy.

Khi bạn đặt ID làm ký tự đầu tiên trong tệp loại bảng tính, nó khớp với đặc điểm của tệp SYLK và MS Excel (và các ứng dụng bảng tính khác) cố gắng mở tệp dưới dạng tệp SYLK. Nhưng đồng thời, nó không đáp ứng đầy đủ đặc điểm kỹ thuật của một tệp SYLK vì phần còn lại của các giá trị trong tệp được phân cách bằng dấu phẩy. Do đó, lỗi được hiển thị.

Để giải quyết vấn đề, hãy thay đổi "ID" thành "id" và nó sẽ hoạt động như mong đợi.

enter image description here

Đây là kỳ lạ. Nhưng, yeah!

Đồng thời cố giảm thiểu quyền truy cập tệp bằng cách sử dụng đối tượng tệp ít hơn.

Tôi đã kiểm tra và mã bên dưới hoạt động hoàn hảo.

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

Bạn có thể sử dụng "pw.print" thay vì "pw.write" không? – Aqqqq

+0

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