如何从Apache POI中了解文件是.docx还是.doc格式

时间:2017-01-18 04:55:19

标签: java apache-poi

我知道我们可以通过扩展或mime类型来完成它,我们是否有任何其他方式可以获得文件类型的概念,无论是.docx还是.doc。

5 个答案:

答案 0 :(得分:1)

如果只是确定一个已知的文件集合是res.df <- do.call(rbind, lapply(1:nrow(idx.mat), function(i){ gi.length <- length(l[[idx.mat[i,1]]]) gj.length <- length(l[[idx.mat[i,2]]]) set.diff.1 <- length(setdiff(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]])) set.diff.2 <- length(setdiff(l[[idx.mat[i,2]]],l[[idx.mat[i,1]]])) gi.gj.inter <- length(intersect(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]])) gi.gj.union <- length(unique(c(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]]))) p.value <- fisher.test(matrix(c(gi.length+gj.length- gi.gj.union,set.diff.1,set.diff.2,gi.gj.inter),nrow=2),alternative="greater")$p.value return(data.frame(gi=names(l)[idx.mat[i,1]], gj=names(l)[idx.mat[i,2]], gi.gj.inter=gi.gj.inter, gi.gj.union=gi.gj.union, gi.gj.iou=gi.gj.inter/gi.gj.union, gi.gj.iou.p.val=p.value, stringsAsFactors=F)) }))还是.doc但是没有相应标记扩展名的问题,您可以使用{{1}这一事实file是压缩文件集合。如下调整可能会有所帮助:

.docx

其中.docx是您要评估的任何文件或其他输入流。您可以通过查找关键boolean isZip = new ZipInputStream( fileStream ).getNextEntry() != null; 条目来进一步评估压缩文件。一个好的起始参考是Word Document (DOCX)。同样,如果您知道它只是一个二进制文件,您可以测试Word的文件信息块(请参阅Word (.doc) Binary File Format

答案 1 :(得分:0)

您可以使用Apache Tika进行内容检测。但是你应该意识到这对于这么小的任务来说是一个巨大的框架(许多必需的依赖项)。

答案 2 :(得分:0)

有一种方法,但没有前进的道路。但是使用Apache POI,您可以找到它。

尝试使用HWPFDocument Class读取.docx文件。它会给你以下错误

  

org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的   数据似乎在Office 2007+ XML中。你在呼唤这部分   POI处理OLE2 Office文档。你需要打电话给   POI的不同部分来处理这些数据(例如XSSF而不是HSSF)

String filePath = "C:\\XXXX\XXXX.docx";
FileInputStream inStream;
try {
    inStream = new FileInputStream(new File(filePath));
    HWPFDocument doc = new HWPFDocument(inStream);
    WordExtractor wordExtractor = new WordExtractor(doc);
    System.out.println("Getting words"+wordExtractor.getText());
} catch (Exception e) {
    System.out.print("Its not a .doc format");
}

.docx可以使用XWPFDocument Class读取。

答案 3 :(得分:0)

为什么不使用Apache Tika

File file = new File('File Here');

  Tika tika = new Tika();

  String filetype = tika.detect(file);
  System.out.println(filetype);

答案 4 :(得分:0)

假设您正在使用Apache POI,您有几个选择。

一个是获取文件的前几个字节,ask POIFSFileSystem with the hasPOIFSHeader(byte) method。如果您有支持标记/重置的流,则可以使用POIFSFileSystem.hasPOIFSHeader(InputStream)。如果这些人返回true,请尝试使用.doc将其作为HWPF打开,否则请.docxXWPF一起使用

否则,如果您更喜欢尝试/捕获方式,请尝试使用POIFSFileSystem打开它并捕获OfficeXmlFileException - 如果它打开正常,则为.doc,如果您获得异常,则为.docx {1}}

如果查看source code for WorkbookFactory,您将看到正在使用的第一个模式,您可以复制一组类似的逻辑形式