我有一个word文档,可能有n个表。该表由表名标识,该表名在第一个单元格中写为标题。现在我必须找到带有表名的表,并在该表的一个单元格中写入。我尝试使用apache-poi,但无法弄清楚如何将它用于我的目的。如果我无法解释文档的外观,请参阅随附的屏幕截图。
感谢
String fileName = "E:\\a1.doc";
if (args.length > 0) {
fileName = args[0];
}
InputStream fis = new FileInputStream(fileName);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HWPFDocument doc = new HWPFDocument(fs);
Range range = doc.getRange();
for (int i=0; i<range.numParagraphs(); i++){
Paragraph tablePar = range.getParagraph(i);
if (tablePar.isInTable()) {
Table table = range.getTable(tablePar);
for (int rowIdx=0; rowIdx<table.numRows(); rowIdx++) {
for (int colIdx=0; colIdx<row.numCells(); colIdx++) {
TableCell cell = row.getCell(colIdx);
System.out.println("column="+cell.getParagraph(0).text());
}
}
}
}
这是我尝试过的,但这只是第一张表。
答案 0 :(得分:3)
我发现你在poi中遇到了误解。 如果你只是想读一个表。只需要使用TableIterator来获取表的内容,否则你将得到一个没有表开始的异常。
我想每个表格单元格中只有一个段落。
InputStream fis = new FileInputStream(fileName);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HWPFDocument doc = new HWPFDocument(fs);
Range range = doc.getRange();
TableIterator itr = new TableIterator(range);
while(itr.hasNext()){
Table table = itr.next();
for(int rowIndex = 0; rowIndex < table.numRows(); rowIndex++){
TableRow row = table.getRow(rowIndex);
for(int colIndex = 0; colIndex < row.numCells(); colIndex++){
TableCell cell = row.getCell(colIndex);
System.out.println(cell.getParagraph(0).text());
}
}
}
答案 1 :(得分:2)
我认为Apache POI是要走的路。它没有详细记录,但花在研究如何使用它的时间可能是值得的。 Word文档基本上是一个分层(树)结构,您需要遍历并找到所需的数据。