簡體   English   中英

如何從Apache POI中了解文件是.docx還是.doc格式

[英]how to know whether a file is .docx or .doc format from Apache POI

我知道我們可以通過擴展或mime類型來完成它,我們是否有任何其他方式可以獲得文件類型的概念,無論是.docx還是.doc。

如果只是確定已知的文件集合是.doc還是.docx但是沒有使用擴展名進行相應標記,則可以使用.docx文件是壓縮文件集合的事實。 如下調整可能會有所幫助:

boolean isZip = new ZipInputStream( fileStream ).getNextEntry() != null;

其中fileStream是您要評估的任何文件或其他輸入流。 您可以通過查找關鍵的.docx條目來進一步評估壓縮文件。 一個很好的起始參考是Word Document(DOCX) 同樣,如果您知道它只是一個二進制文件,您可以測試Word的文件信息塊(請參閱Word(.doc)二進制文件格式

您可以使用Apache Tika進行內容檢測。 但是你應該意識到這對於這么小的任務來說是一個巨大的框架(許多必需的依賴項)。

有一種方法,但沒有直截了當。 但是使用Apache POI,您可以找到它。

嘗試使用HWPFDocument類讀取.docx文件。 它會給你以下錯誤

org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的數據似乎在Office 2007+ XML中。 您正在調用處理OLE2 Office文檔的POI部分。 您需要調用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");
}

可以使用XWPFDocument類讀取.docx。

為什么不使用Apache Tika

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

  Tika tika = new Tika();

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

假設您正在使用Apache POI,您有幾個選擇。

一種方法是獲取文件的前幾個字節,並使用hasPOIFSHeader(byte)方法詢問POIFSFileSystem 如果您有支持標記/重置的流,則可以改為使用POIFSFileSystem.hasPOIFSHeader(InputStream) 如果那些返回true則嘗試使用HWPF將其作為.doc HWPF ,否則嘗試使用XWPF作為.docx

否則,如果您更喜歡try / catch方式,請嘗試使用POIFSFileSystem打開它並捕獲OfficeXmlFileException - 如果它打開正常它是.doc ,如果您得到異常它是.docx

如果查看WorkbookFactory源代碼,您將看到正在使用的第一個模式,您可以復制一組類似的邏輯表單,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM