如何在 spring mvc 中使用 java 导入 xls 和 xlsx 文件
How to import both xls and xlsx files using java in spring mvc
在这种方法中,我使用了 xssf class,它用于读取 xlsx 文件,但我们不能为 xls file.for xls 做,我们需要 Hssf class。用户可以导入那里有任何格式。我的要求,是否有任何 Class 可以用来代替 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 file.But 我只有一个导入按钮,用户可以上传任何类型的文件 xls、xlsx,但是对于导入按钮,我可以执行一个操作或者转到 xssf或 hssf method.So 我想知道是否有任何可能的方法让两者都在单个 method.Or 任何其他超级 class 中同时具有 Xssf 和 Hssf 属性 Class.
为了同时支持 HSSF
和 XSSF
读取和重写 *.xls
和 *.xlsx
,您将使用 WorkbookFactory for creating Workbook。这能够从 *.xls
的 InputStream
以及 *.xlsx
文件创建 Workbook
。
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();
在这种方法中,我使用了 xssf class,它用于读取 xlsx 文件,但我们不能为 xls file.for xls 做,我们需要 Hssf class。用户可以导入那里有任何格式。我的要求,是否有任何 Class 可以用来代替 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 file.But 我只有一个导入按钮,用户可以上传任何类型的文件 xls、xlsx,但是对于导入按钮,我可以执行一个操作或者转到 xssf或 hssf method.So 我想知道是否有任何可能的方法让两者都在单个 method.Or 任何其他超级 class 中同时具有 Xssf 和 Hssf 属性 Class.
为了同时支持 HSSF
和 XSSF
读取和重写 *.xls
和 *.xlsx
,您将使用 WorkbookFactory for creating Workbook。这能够从 *.xls
的 InputStream
以及 *.xlsx
文件创建 Workbook
。
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();