在同一工作簿中按列打印数据 - java poi

时间:2017-02-14 15:57:57

标签: java excel apache-poi

我正在使用Java和POI将一些数据打印到excel文件。我想我只是缺少一个解决这个问题的小逻辑。我将数据存储在数组列表中,格式如下:

a = [1,2,3] // arraylist
b = [4,5,6] // arraylist
c = [7,8,9] // arraylist

我想以下面给出的格式将此数据按列打印到excel文件:

1 | 4 | 7
2 | 5 | 8
3 | 6 | 9

我使用的代码如下:

public final_out = new FileOutputStream(new File(final_output_path));

public XSSFWorkbook workbook = new XSSFWorkbook();

public XSSFSheet sheet = workbook.createSheet("data_vertical_final");

public Row row;

for (int i=0; i < a.size(); i++) {

     String value = a.get(i);
     row = sheet.createRow(i);
     Cell cell = row.createCell(13);
     cell.setCellValue(value);

}

for (int i=0; i < b.size(); i++) {

     String value = b.get(i);
     row = sheet.createRow(i);
     Cell cell = row.createCell(15);
     cell.setCellValue(value);

}

for (int i=0; i < c.size(); i++) {

     String value = a.get(i);
     row = sheet.createRow(i);
     Cell cell = row.createCell(17);
     cell.setCellValue(value);

}

workbook.write(final_out);
workbook.close();
final_out.close();

我收到错误:

没有错误,但是在新的excel文件中所有内容都被覆盖,最终输出看起来很糟糕。我是否需要为每个循环制作新的工作簿?或者有一些我想念的东西。

P.S:

下面显示的数据只是一个例子。我使用的一些原始文件介于1000到2000之间,或者更多。

我想动态创建行并从arraylists中提取值并将其存储在我创建的行中。

1 个答案:

答案 0 :(得分:2)

仅创建a.size()行, 不是a.size() squared行 不要在代码中覆盖它们。

我假设a.size() == b.size()b.size() == c.size()

public List<Row> rows = new ArrayList<Row>(a.size());

for (int i=0; i < a.size(); i++) {
    rows.add(sheet.createRow(i));
}

for (int i=0; i < a.size(); i++) {
     String value = a.get(i);
     Cell cell = rows.get(i).createCell(13);
     cell.setCellValue(value);
}

for (int i=0; i < b.size(); i++) {
     String value = b.get(i);
     Cell cell = rows.get(i).createCell(15);
     cell.setCellValue(value);
}

for (int i=0; i < c.size(); i++) {
     String value = a.get(i);
     Cell cell = rows.get(i).createCell(17);
     cell.setCellValue(value);
}

如果您已经解决了问题: 将abc放入一个集合并使用一个循环来迭代它们(代替3个单独的循环)会更加清晰。

我认为a是最长的列表。 看看这个:

public List<Row> rows = new ArrayList<>(a.size());
for (int i=0; i < a.size(); i++) {
    rows.add(sheet.createRow(i));
}
List<List<String>> alphabet = new ArrayList<>();
alphabet.add(a);
alphabet.add(b);
alphabet.add(c);
for(int i=0; i < alphabet.size(); i++) {
    for (int j=0; j < alphabet.get(i).size(); j++) {
        String value = alphabet.get(i).get(j);
        Cell cell = rows.get(j).createCell(13 + i*2); //<- 13, 15, 17...
        cell.setCellValue(value);
    }
}