2016-06-09 61 views
0

我正在尝试使用openCSV java库在csv文件中编写一些公式数据,但它只写了每个单元格中大约90%的字符串。有没有可能导致这种行为的已知问题?OpenCSV写入限制

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { 

     FileOutputStream fosW = new FileOutputStream("C:\\Users\\Desktop\\formula.csv"); 
     OutputStreamWriter osw = new OutputStreamWriter(fosW, "UTF-8"); 
     CSVWriter writerCSW = new CSVWriter(osw); 

     int k = 0; 
     String[] b = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT"}; 
     String[] line = new String[100]; 
     for (int i = 0; i < b.length - 1; i++) { 
      String a = "=IF(legend!" + b[i] + "$3='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$3,IF(legend!" + b[i] + "$4='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$4,IF(legend!" + b[i] + "$5='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$5,IF(legend!" + b[i] + "$6='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$6,IF(legend!" + b[i] + "$7='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$7,IF(legend!" + b[i] + "$8='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$8,#error#))))))"; 
      System.out.println(a); 
      line[k] = a; 
      k++; 
     } 
     writerCSW.writeNext(line); 

    } 
+0

嗨。我认为你认为行[]中的每个索引在你的csv中是1行。实际上,您使用它的方式,line []在您的CSV文件中实际上是1个条目。查看API文档,writeNext获取CSV文件中代表1行的数组。所以基本上,您需要重构您的代码以在for循环中编写每行。 – pandaadb

+0

@pandaadb我知道它会写在一行中的所有内容,这就是我的意图 –

回答

2

我相信你的问题是你使用的库错了。 (虽然这可能是我误会。

你B有46 CSV文件的长度将有45项。

行[K]正好是1行。我想你是假设每个指标在线阵列中。这是错误的数字1(也许)。

但是,您的文件没有完全填充的原因是因为你没有关闭流,所以一旦你的程序存在数据会丢失。想要关闭你的作者,或者更好的是,使用try-with-resources块。我已经重写你的代码来做到这一点:

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

     FileOutputStream fosW = new FileOutputStream("/home/artur/tmp/test.csv"); 
     OutputStreamWriter osw = new OutputStreamWriter(fosW, "UTF-8"); 
     try (CSVWriter writerCSW = new CSVWriter(osw)) { 

      String[] b = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 
        "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", 
        "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT" }; 

      System.out.println(b.length); 
      for (int i = 0; i < b.length - 1; i++) { 
       String a = "=IF(legend!" + b[i] + "$3='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$3,IF(legend!" + b[i] + "$4='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$4,IF(legend!" + b[i] + "$5='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$5,IF(legend!" + b[i] + "$6='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$6,IF(legend!" + b[i] + "$7='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$7,IF(legend!" + b[i] + "$8='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] 
         + "$8,#error#))))))"; 
       String[] line = a.split(","); 
       writerCSW.writeNext(line); 
       System.out.println(i); 
      } 
     } 

    } 

请注意,我已经改变了一些东西,所以它可能不会完全按照您的要求进行。但是,你应该能够看到这个例子中出了什么问题。

请注意:看看我如何用逗号分隔你的字符串?这是为CSV输入生成一个数组。它会自动为您插入您选择的分隔符。如果你不想这样做,摆脱CSVWriter,并使用正常的Filewriter。您通过构建字符串手动生成您的CSV行。使用OpenCSV时这不是必需的。

我希望帮助,

阿图尔

+0

感谢您的回答,因为我在上面的评论中陈述了我的理解,输出将在1行上,这是我的意图,因为我只是在excel中生成计算公式。无论如何,你是对的,我忘记关闭作家,这解决了我的问题。 Tnx –

+0

好啊:)我只是想指出行的事情,因为我发现你的例子混乱。如果那是你的意图,那很好。你可以接受答案,然后如果它解决了你的问题:) – pandaadb