6

n 個のテーブルを持つ単語文書があります。テーブルは、見出しとして最初のセルに書かれているテーブル名によって識別されます。ここで、テーブル名を持つテーブルを見つけて、そのテーブルのセルの 1 つに書き込む必要があります。同じために 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

ポイで誤解されていることがわかりました。テーブルを読み取るだけの場合は、TableIterator を使用してテーブルのコンテンツをフェッチするか、テーブルの開始ではない例外が発生します。

すべての表のセルには 1 つの段落しかないと思います。

    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 に答える