问题描述
我有一个tail -n 40 <your-computers-name.some.domain>.err
,我从CSV文件中填充了它。
List<String[]>
因此,我需要将这些数据放入一个表,该表具有许多行,具体取决于CSV列表的大小,但只有2列。因此,我需要按照List<String[]> csvData = ReadCSV.readAll();
的顺序将这些数据打印到word文档中。
Zig-Zag
因此,我对如何执行此操作以及一次获取两个_______________________________
| Data One | Data Two |
_______________________________
| Data Three | Data Four |
_______________________________
| Data Five | Data Six |
_______________________________
数据感到困惑。由于String[]
如下所示,
List<String[]>
所以我尝试按以下方式打印数据,
[1st,Data One]
[2nd,Data Two]
[3rd,Data Three]
[4th,Data Four]
但是使用这种方法,如果CSV文件中的数据数量奇数,并且for (int i = 0; i < csvData.size(); i = i + 2) {
String[] arrayOne = csvData.get(i);
String[] arrayTwo = csvData.get(i + 1);
// Print in word
table.getRow(i).getCell(0).setParagraph(paragraph that contains arrayOne data);
table.getRow(i).getCell(1).setParagraph(paragraph that contains arrayTwo data);
}
也无法正常工作,我会出错。我也尝试了数组合并,但是当CSV列表中数据的数量为奇数时,它不起作用。那么做我需要的最好的方法是什么?有人可以帮助我实现这一目标吗?预先感谢。
解决方法
如果表应具有两列,则它需要int rows = (int)Math.ceil(csvData.size()/2d);
。
要填充表,您需要对行使用迭代器r
,对列需要迭代器c
,以及对列表进行迭代的迭代器i
。如果i < csvData.size()
,则只能设置一个单元格值。
完整的工作示例:
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;
import java.util.*;
public class CreateWordTableFromList {
public static void main(String[] args) throws Exception {
List<String[]> csvData = new ArrayList<String[]>();
csvData.add(new String[]{"1st","Data One"});
csvData.add(new String[]{"2nd","Data Two"});
csvData.add(new String[]{"3rd","Data Three"});
csvData.add(new String[]{"4th","Data Four"});
csvData.add(new String[]{"5th","Data Five"});
csvData.add(new String[]{"6th","Data Six"});
csvData.add(new String[]{"7th","Data Seven"});
//csvData.add(new String[]{"8th","Data Eight"});
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("The table");
int cols = 2;
int rows = (int)Math.ceil(csvData.size()/2d);
XWPFTable table = document.createTable(rows,cols);
XWPFTableRow row;
XWPFTableCell cell;
int i = 0;
for (int r = 0; r < rows; r++) {
row = table.getRow(r);
for (int c = 0; c < cols; c++) {
cell = row.getCell(c);
if (i < csvData.size()) cell.setText(csvData.get(i)[1]);
i++;
}
}
FileOutputStream out = new FileOutputStream("CreateWordTableFromList.docx");
document.write(out);
out.close();
document.close();
}
}
,
要扩展我的评论,您可以使用if
语句来避免出现奇数数据的问题:
for (int i = 0; i < csvData.size(); i = i + 2) {
String[] arrayOne = csvData.get(i);
// Print in word
table.getRow(i).getCell(0).setParagraph(paragraph that contains arrayOne data);
//Check if the second bit of data in a row exists,otherwise ignore it
if (csvData.size() > i){
String[] arrayTwo = csvData.get(i + 1);
table.getRow(i).getCell(1).setParagraph(paragraph that contains arrayTwo data);
}
}