我实现了 Microsoft Excel 文件的上传服务,但无法确定上传的文件类型。有时,用户会上传包含 xlsx 内容的 xls 扩展名的文件。 为了解析文件,我使用 Apache Poi,目前我首先尝试将上传的文件解析为 HSSFWorkbook,如果捕获异常,那么我会尝试创建 XSSFWorkbook。
有没有更智能的方法来检测需要什么版本?
/** should parse the uploaded file */
private void handleUpload(File file) {
Workbook wb = tryToHandleHSSF(file);
if (wb==null)
wb = tryToHandleXSSF(file);
if (wb!=null) {
// ... do the parsing stuff
}
}
/** helper for HSSF */
private Workbook tryToHandleHSSF(File file) {
try {
return new HSSFWorkbook(new FileInputStream(file));
}
catch(Exception e) {
return null;
}
}
/** helper for XSSF */
private Workbook tryToHandleXSSF(File file) {
Workbook workbook;
try {
InputStream fin = new FileInputStream(file);
BufferedInputStream in = new BufferedInputStream(fin);
try {
if (POIFSFileSystem.hasPOIFSHeader(in)) {
// if the file is encrypted
POIFSFileSystem fs = new POIFSFileSystem(in);
EncryptionInfo info = new EncryptionInfo(fs);
Decryptor d = Decryptor.getInstance(info);
d.verifyPassword(Decryptor.DEFAULT_PASSWORD);
workbook = new org.apache.poi.xssf.usermodel.XSSFWorkbook(d.getDataStream(fs));
}
else
return new org.apache.poi.xssf.usermodel.XSSFWorkbook(in);
}
finally {
in.close();
}
}
catch(Exception e) {
return null;
}
}
最佳答案
您可以使用 SS 用户模型,它可以处理 XSSF 和 HSSF 工作簿。
要以类型无关的方式从文件加载工作簿,您可以使用 WorkbookFactory 中的 create 方法。
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.Workbook;
...
...
// SS Workbook object
Workbook workbook;
// Handles both XSSF and HSSF automatically
workbook = WorkbookFactory.create(new FileInputStream(file));
//Do your parsing using the workbook object
关于java - 确定 Apache POI 中是否需要 HSSF 还是 XSSF 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295788/