をすべてのテーブルをそのドキュメント本体に取り込みます。
このアプローチでは、 org.apache.xmlbeans.XmlCursorを使用し、w:tbl
のすべての要素をdocument.xml
に検索しています。見つかった場合はList<CTTbl>
に追加してください。
テキストボックスの長方形の形状は、document.xml
にフォールバックコンテンツを提供するため、mc:Fallback
要素をスキップする必要があります。それ以外の場合は、テキストボックス内のテーブルを2回使用します。
最後にList<CTTbl>
にアクセスして、すべてのテーブルの内容を取得します。
import java.io.*;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
import org.apache.xmlbeans.impl.values.XmlAnyTypeImpl;
import org.apache.xmlbeans.XmlCursor;
import javax.xml.namespace.QName;
import java.util.List;
import java.util.ArrayList;
public class WordReadAllTables {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("22.docx"));
CTBody ctbody = document.getDocument().getBody();
XmlCursor xmlcursor = ctbody.newCursor();
QName qnameTbl = new QName("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "tbl", "w");
QName qnameFallback = new QName("http://schemas.openxmlformats.org/markup-compatibility/2006", "Fallback", "mc");
List<CTTbl> allCTTbls = new ArrayList<CTTbl>();
while (xmlcursor.hasNextToken()) {
XmlCursor.TokenType tokentype = xmlcursor.toNextToken();
if (tokentype.isStart()) {
if (qnameTbl.equals(xmlcursor.getName())) {
if (xmlcursor.getObject() instanceof CTTbl) {
allCTTbls.add((CTTbl)xmlcursor.getObject());
} else if (xmlcursor.getObject() instanceof XmlAnyTypeImpl) {
allCTTbls.add(CTTbl.Factory.parse(xmlcursor.getObject().toString()));
}
} else if (qnameFallback.equals(xmlcursor.getName())) {
xmlcursor.toEndToken();
}
}
}
for (CTTbl cTTbl : allCTTbls) {
StringBuffer tableHTML = new StringBuffer();
tableHTML.append("<table>\n");
for (CTRow cTRow : cTTbl.getTrList()) {
tableHTML.append(" <tr>\n");
for (CTTc cTTc : cTRow.getTcList()) {
tableHTML.append(" <td>");
for (CTP cTP : cTTc.getPList()) {
for (CTR cTR : cTP.getRList()) {
for (CTText cTText : cTR.getTList()) {
tableHTML.append(cTText.getStringValue());
}
}
}
tableHTML.append("</td>");
}
tableHTML.append("\n </tr>\n");
}
tableHTML.append("</table>");
System.out.println(tableHTML);
}
document.close();
}
}
このコードはfaq-N10025で述べたように、スキーマooxml-schemas-1.3.jar
のすべての完全なjarファイルを必要とします。
うわー。誰がその方法でワードプロセッシングを悪用しているのですか?表のセルに含まれる表は十分に奇妙です。しかし、形に入ったテーブル?私は '* .docx/word/document.xml'を特別な構文解析なしにこのテーブルを得ることはできません。 –
はい、このケースは非常に奇妙ですが、このテーブルを解析する必要があります。 docx https://ufile.io/6xmqd – nickolson
をダウンロードできます。正確には何が必要ですか?テーブルの内容を読むだけですか?これは比較的簡単に可能です。または、四角形の中でテーブルを操作しますか?これも可能ですが、はるかに複雑です。 –