【问题标题】:Java - Writing strings to a CSV fileJava - 将字符串写入 CSV 文件
【发布时间】:2015-07-16 10:15:06
【问题描述】:

我正在尝试使用 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 中本地执行此操作。

感谢帮助,

【问题讨论】:

  • 对于初学者来说,提取一个写单行的方法,并将 writer.append('\n') 替换为 writer.newLine()。因为 newLine 依赖于操作系统。
  • 您是否尝试使用带有文本的 Excel 或数据选项卡中的数据导入向导打开 csv 文件?相同的 corput 文件?
  • @Shaw,检查我的解决方案,如果适合你,请告诉我。

标签: java excel csv export-to-csv


【解决方案1】:

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

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

要解决此问题,请将"ID" 更改为"id",它应该可以正常工作。

这很奇怪。但是,是的!

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

我测试过,下面的代码运行良好。

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

  }
}

【讨论】:

  • 可以用“pw.print”代替“pw.write”吗?
  • 使用try...finally来确保pw关闭会更好吗?
  • 它确实引发了异常,但我已将代码更新为“尝试使用资源”。
【解决方案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!");
    }
}

【讨论】:

    【解决方案3】:
        String filepath="/tmp/employee.csv";
        FileWriter sw = new FileWriter(new File(filepath));
        CSVWriter writer = new CSVWriter(sw);
        writer.writeAll(allRows);
    
        String[] header= new String[]{"ErrorMessage"};
        writer.writeNext(header);
    
        List<String[]> errorData = new ArrayList<String[]>();
        for(int i=0;i<1;i++){
            String[] data = new String[]{"ErrorMessage"+i};
            errorData.add(data);
        }
        writer.writeAll(errorData);
    
        writer.close();
    

    【讨论】:

    • 这个真的不清楚,不能编译。 CSVWriter 来自哪里?
    • 幸好是OpenCSV
    【解决方案4】:

    我认为这是 java 中的一个简单代码,它会在编译此代码后以 CSV 格式显示字符串值。

    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) {
                // TODO: handle exception
                e.printStackTrace();
    
            }
    
            System.out.println("End.");
    
        }
    }
    

    【讨论】:

    【解决方案5】:
     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();
            }
        }
    

    【讨论】:

    • 欢迎来到 SO!当你只用代码回答问题时,请稍微解释一下。
    【解决方案6】:

    如果您想在每次重新运行程序时都覆盖您的文件,这个问题的答案很好,但是如果您希望在重新运行程序时您的记录不会丢失,您可能想试试这个

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

    【讨论】:

      【解决方案7】:

      我看到你已经有了答案,但这里有另一个答案,也许更快 一个简单的类,用于传入对象列表并检索 csv 或 excel 或受密码保护的 zip csv 或 excel。 https://github.com/ernst223/spread-sheet-exporter

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

      【讨论】:

        【解决方案8】:
        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 ♥", "sundar.pichai@gmail.com", "+1-1111111111", "India"));
                    myUsers.add(new MyUser("Satya Nadella", "satya.nadella@outlook.com", "+1-`enter code here`1111111112", "India"));
        
                    beanToCsv.write(myUsers);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-06-15
          • 1970-01-01
          • 2016-10-22
          • 1970-01-01
          • 2016-05-27
          • 1970-01-01
          • 2013-02-02
          • 2012-07-29
          • 1970-01-01
          相关资源
          最近更新 更多