基础上的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
这也是一个很好的变体,谢谢。 –