在这个方法中,我使用xssf类来读取xlsx文件但是我们不能用于xls file.for xls我们需要有Hssf类。用户可以在那里导入任何格式。我的要求,是否有任何类可以用来代替xssf和hssf来读取这两种文件。在我的例子中,我使用了xssf。
@RequestMapping(value="/import",method = RequestMethod.POST)
public ModelAndView imports(Model model, @RequestParam("excelFile") MultipartFile excelfile){
try {
List<DepartmentModel> lstUser = new ArrayList<>();
int i = 0;
XSSFWorkbook workbook = new XSSFWorkbook(excelfile.getInputStream());
XSSFSheet worksheet = workbook.getSheetAt(0);
while (i <= worksheet.getLastRowNum()) {
DepartmentModel user = new DepartmentModel();
XSSFRow row = worksheet.getRow(i++);
user.setHrName(row.getCell(0).getStringCellValue());
user.setDepartmentName(row.getCell(1).getStringCellValue());
user.setParentDepartment(row.getCell(2).getStringCellValue());
lstUser.add(user);
}
departmentService.updateList(lstUser);
model.addAttribute("lstUser", lstUser);
} catch (Exception e) {
e.printStackTrace();
}
return new ModelAndView("redirect:/listOfDepartment");
}
我有另一种方法,我使用Hssf读取xls文件。但是我只有一个导入按钮用户可以上传任何类型的文件xls,xlsx但是对于导入按钮我可以有一个动作eigther转到xssf或hssf方法。所以我想知道是否有任何可能的方法在单个方法中使用bot.Or任何其他超类具有Xssf和Hssf类的属性。
答案 0 :(得分:3)
为了支持HSSF
以及XSSF
阅读和重写*.xls
和*.xlsx
,您将使用WorkbookFactory创建Workbook 。这样就可以从Workbook
InputStream
以及*.xls
个文件中创建*.xlsx
。
FileInputStream fileinputstream = new FileInputStream("pathToExcelFile.xls_or_.xlsx");
Workbook workbook = WorkbookFactory.create(fileinputstream);
然后,只要有可能,您将使用Package org.apache.poi.ss.usermodel的界面而不是特殊的HSSF
或XSSF
类。
这是不可能的,因为apache poi
一直在开发中。但如果不可能,您可以通过instanceof
检测到您正在使用的对象(HSSF
或XSSF
)。
对于写作,您将使用取决于instanceof
Workbook
的适当方法。
if (workbook instanceof XSSFWorkbook) {
workbook.write(new FileOutputStream("pathToExcelFile.xlsx"));
} else if (workbook instanceof HSSFWorkbook) {
workbook.write(new FileOutputStream("pathToExcelFile.xls"));
}
workbook.close();
最多apache poi 3.17
Workbook.write
已关闭OutputStream
。现在在apache poi 4.0.*
版本中,它不再关闭OutputStream
。所以我们需要使用
FileOutputStream out = null;
if (workbook instanceof XSSFWorkbook) out = new FileOutputStream("pathToExcelFile.xlsx");
else if (workbook instanceof HSSFWorkbook) out = new FileOutputStream("pathToExcelFile.xls");
if (out != null) {
workbook.write(out);
out.close();
}
workbook.close();