java - 如何在spring mvc中使用java导入xls和xlsx文件

标签 java spring-mvc apache-poi xssf hssf

在此方法中,我使用了 xssf 类,该类用于读取 xlsx 文件,但我们无法对 xls 文件执行此操作。对于 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,但对于导入按钮,我可以执行一个操作,转到 xssf 或 hssf 方法。所以我想知道是否有任何可能的方法可以在单一方法中同时拥有这两者。或者任何其他父类(super class)可以同时拥有 Xssf 和 Hssf 类的属性。

最佳答案

支持 HSSF 以及 XSSF 来读取和重写 *.xls*.xlsx ,您将使用WorkbookFactory用于创建Workbook 。这可以从 *.xls 以及 *.xlsx 文件的 InputStream 创建 Workbook。 p>

 FileInputStream fileinputstream = new FileInputStream("pathToExcelFile.xls_or_.xlsx");
 Workbook workbook = WorkbookFactory.create(fileinputstream);

然后,只要有可能,您将使用 Package org.apache.poi.ss.usermodel 的接口(interface)而不是特殊的 HSSFXSSF 类。

这并不总是可能的,因为 apache poi 到目前为止仍在开发中。但如果不可能,您可以通过 instanceof 检测您真正正在使用的对象(HSSFXSSF)。

为了编写,您将使用依赖于工作簿实例的适当方法。

  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();

关于java - 如何在spring mvc中使用java导入xls和xlsx文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751043/

相关文章:

java - Spring 和 Spring MVC——它们是两个不同的框架吗?

java - Java中有 'stoi()'之类的东西吗?

java - Apache-POI 忽略 Excel 工作表的行

java - 在数据库中存储由 Java 中的 List 表示的 'large' 数据的最佳实践是什么?

spring - 无法初始化上下文,因为已经存在根应用程序上下文(仅使用注释)

java - 如何将此代码从 jsp 页面更改为具有操作控制的 servlet 页面?

java - 如何使用 JMockit 模拟 FacesContext,所有测试都因 NullPointerException 而失败

java - Spring Boot 在无效的 If-Modified-Since 值上抛出异常

java - 如何使用 Apache POI 在 word 文档中插入图像?

java - 在 POI 中复制 Excel 工作表