报错:java.lang.NoSuchMethodError: ‘org.apache.poi.poifs.filesystem.DirectoryNode

最近做全文检索功能,使用Tika做的文件内容抽取,项目的其他位置使用了POI,Tika读取doc文件时报错提示:POI版本冲突

java.lang.NoSuchMethodError: 'org.apache.poi.poifs.filesystem.DirectoryNode

研究了一些资料

Apache Tika是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了POI, Pdfbox
并且为文本抽取工作提供了一个统一的界面。其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。

Tika提供了对如下文件格式的支持:

PDF - 通过Pdfbox、MS-* - 通过POI、HTML -使用nekohtml将不规范的html整理成为xhtml、OpenOffice 格式 - Tika提供、Archive - zip, tar, gzip, bzip等、RTF - Tika提供、Java class - Class解析由ASM完成、Image -只支持图像的元数据抽取。

因为Tika集成了POI,所以在使用的时候导致Tika和POI的版本发生了冲突,出现上面的报错。有些建议说若原工程内使用过POI工具,需要把原POI依赖先清空,避免依赖冲突。
但是我不想改变之前的代码,所以打算曲线救国,使用POI单独对doc格式的文件进行处理(因为Tika处理docx、pdf等文件时没有报错)
导入poi相关的jar包,pom.xml引入如下:

		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.8</version>
        </dependency>

通过poi获取word文本内容如下:

public static String parseContent(File f,String fileType){
        String content =null;
        try{
            InputStream stream = FileUtils.openInputStream(f);
             /* 判断类型是doc就使用poi,否则使用tika*/
            if (fileType.equals("doc")){
                content =parseDoc(stream);
            }
            if (content == null){
                content =parseContent(stream);
            }
        }catch (Exception e){
            System.err.println("error"+e);
        }
        return content;
    }
    
 /* poi读取file*/
public static String parseDoc(InputStream stream) throws IOException {
        try {
            HWPFDocument doc = new HWPFDocument(stream);
            /*String doc1 = doc.getDocumentText();
            System.out.println(doc1);
            StringBuilder doc2 = doc.getText();
            System.out.println(doc2);*/
            Range rang = doc.getRange();
            String doc3 = rang.text();
            System.out.println(doc3);
            return doc3;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

 /* tika读取file*/
public static String parseContent(InputStream stream){
        String content =null;
        try{
            AutoDetectParser parser = new AutoDetectParser();
            BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE);
            Metadata metadata = new Metadata();
            parser.parse(stream, handler, metadata);
            content = handler.toString();
        }catch (Exception e){
            System.err.println("tika parse error"+e);
        }
        return content;
    }
### 回答1: 要使用Java解析Word文件中的表格,可以使用Apache POIApache Tika库。 以下是一些基本步骤: 1. 导入Apache POIApache Tika库。 ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.0.0</version> </dependency> ``` 2. 使用Tika解析Word文件。 ``` FileInputStream inputStream = new FileInputStream(new File("file.docx")); Parser parser = new AutoDetectParser(); ContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); parser.parse(inputStream, handler, metadata); String content = handler.toString(); ``` 3. 使用POI解析表格。 ``` XWPFDocument doc = new XWPFDocument(new FileInputStream("file.docx")); List<XWPFTable> tables = doc.getTables(); for (XWPFTable table : tables) { // 处理表格数据 for (XWPFTableRow row : table.getRows()) { List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) { // 处理单元格数据 System.out.print(cell.getText() + "\t"); } System.out.println(); } } ``` 这些步骤可以帮助您开始解析Word文件中的表格。您可以根据自己的需求进行调整和扩展。 ### 回答2: 用Java解析Word文件中的表格可以使用Apache POI库来实现。Apache POI是一个开源的Java API库,提供了访问和操作Microsoft Office格式文件(如Word、Excel和PowerPoint)的功能。 首先需要导入Apache POI库的相关jar包,然后可以使用以下步骤来解析Word文件中的表格: 1. 创建一个Word文档对象,使用POIFSFileSystem类加载Word文件: ``` FileInputStream fis = new FileInputStream("path/to/word.doc"); POIFSFileSystem fileSystem = new POIFSFileSystem(fis); HWPFDocument document = new HWPFDocument(fileSystem); ``` 2. 获取文档的表格数量和表格内容: ``` Range range = document.getRange(); int tableCount = range.numTables(); for (int i = 0; i < tableCount; i++) { Table table = range.getTable(i); int rowCount = table.numRows(); for (int j = 0; j < rowCount; j++) { TableRow row = table.getRow(j); int cellCount = row.numCells(); for (int k = 0; k < cellCount; k++) { TableCell cell = row.getCell(k); String cellText = cell.text(); // 可以在这里对表格中的内容进行处理或输出 } } } ``` 3. 解析完表格后,记得关闭文件流: ``` document.close(); fis.close(); ``` 通过上述步骤,我们可以使用Java解析Word文件中的表格内容,并对表格内容进行处理或其他操作。请注意,以上代码仅适用于旧版的Word文档(.doc格式),如果是新版的Word文档(.docx格式),可以使用XWPFDocument类来解析。希望可以帮助到你! ### 回答3: 要用Java解析Word文件中的表格,可以使用Apache POI库来处理。Apache POI是一个开源的Java库,用于访问和操作各种Office文档,包括Word文件。 首先,需要引入Apache POI的相关依赖包,例如poipoi-ooxml和poi-ooxml-schemas。然后,可以通过XWPFDocument类加载Word文件,并使用XWPFTable类来获取表格。 以下是一个简单的代码示例,演示如何解析Word文件中的表格: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFTable; import java.io.FileInputStream; import java.io.IOException; public class WordTableParser { public static void main(String[] args) { try { FileInputStream file = new FileInputStream("word.docx"); // Word文件的路径 XWPFDocument document = new XWPFDocument(file); // 获取文档中的所有表格 for (XWPFTable table : document.getTables()) { // 解析表格数据 for (int i = 0; i < table.getRows().size(); i++) { for (int j = 0; j < table.getRow(i).getTableCells().size(); j++) { String cellText = table.getRow(i).getCell(j).getText(); System.out.print(cellText + "\t"); } System.out.println(); } } document.close(); file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例中,首先使用 FileInputStream 来读取Word文件,然后使用 XWPFDocument 加载文件。然后,使用 document.getTables() 方法获取文档中的所有表格,并使用嵌套循环遍历每个单元格获取表格中的数据。 这只是一个简单的示例,实际的需求可能会更加复杂,例如处理合并单元格、设置表格样式等。但通过这个示例可以了解如何使用Java解析Word文件中的表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值