我正在使用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中提取值并将其存储在我创建的行中。
答案 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);
}
如果您已经解决了问题:
将a
,b
和c
放入一个集合并使用一个循环来迭代它们(代替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);
}
}