基礎上的lib實施org.apache.poi.ss.usermodel.WorkbookFactory#create(java.io.InputStream)
我們可以模仿WorkbookFactory
的邏輯,去除不相關的位,返回文件類型來代替。
public static TYPE fileType(File file) {
try (
InputStream inp = new FileInputStream(file)
) {
if (!(inp).markSupported()) {
return getNotMarkSupportFileType(file);
}
return getType(inp);
} catch (IOException e) {
LOGGER.error("Analyse FileType Problem.", e);
return TYPE.INVALID;
}
}
private static TYPE getNotMarkSupportFileType(File file) throws IOException {
try (
InputStream inp = new PushbackInputStream(new FileInputStream(file), 8)
) {
return getType(inp);
}
}
private static TYPE getType(InputStream inp) throws IOException {
byte[] header8 = IOUtils.peekFirst8Bytes(inp);
if (NPOIFSFileSystem.hasPOIFSHeader(header8)) {
NPOIFSFileSystem fs = new NPOIFSFileSystem(inp);
return fileType(fs);
} else if (DocumentFactoryHelper.hasOOXMLHeader(inp)) {
return TYPE.XSSF_WORKBOOK;
}
return TYPE.INVALID;
}
private static TYPE fileType(NPOIFSFileSystem fs) {
DirectoryNode root = fs.getRoot();
if (root.hasEntry("EncryptedPackage")) {
return TYPE.XSSF_WORKBOOK;
}
return TYPE.HSSF_WORKBOOK;
}
public enum TYPE {
HSSF_WORKBOOK, XSSF_WORKBOOK, INVALID
}
爲什麼你需要知道前面?你不能只使用WorkbookFactory並讓它爲你創建合適的類型嗎? – Gagravarr
這也是一個很好的變體,謝謝。 –