6

我有一个可能有 n 个表格的 word 文档。该表由写在第一个单元格中作为标题的表名标识。现在我必须找到带有表名的表并在该表的一个单元格中写入。我尝试使用 apache-poi,但无法弄清楚如何将它用于我的目的。如果我无法解释文档的外观,请参阅随附的屏幕截图。

谢谢如屏幕截图所示,表格名称为 S1 和 S2

    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());  
                }  
            }  
        }  
    } 

这是我尝试过的,但这仅读取第一个表。

4

2 回答 2

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());
            }
        }
    }
于 2012-12-25T05:23:08.250 回答
2

我认为Apache POI是要走的路。它没有很好的文档记录,但是花在研究如何使用它上的时间可能是值得的。Word 文档基本上是一个分层(树)结构,您需要遍历并找到所需的数据。

于 2012-09-24T10:40:31.683 回答