如何在Java中动态将数据打印到MS Word表

问题描述

我有一个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);
    }
}