接收MultipartFile直接轉化為Workbook
情況1:
直接這樣轉化
//不管2003 .xls還是2007 .xlsx 都是 //用 new XSSFWorkbook(file.getInputStream())將MultipartFile文件轉為Workbook文件 Workbook workbook = new XSSFWorkbook(file.getInputStream());
情況2:(錯誤)
剛開始以為需要2003的.xls要對應的HSSFWorkbook去接轉化,2007的.xlsx要對應XSSFWorkbook.
這樣做會報什么版本問題,如下:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
情況3:(錯誤)
網上說用這個 ,不過也是報了上面的錯誤。
Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream())); //錯誤寫法
應用場景:其實就是上傳Excel文件不在服務端生成文件,直接在運行內存中將MultipartFile轉化為Workbook,然后讀取數據。
下面寫個demo來測試:
控制層代碼:
package cn.mindgd.controller.background; import cn.mindgd.service.ExcelService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; /** * @author JiaXinMa * @description Excel測試控制層 * @date 2021/7/22 */ @Slf4j @RestController @RequestMapping("/excel") public class ExcelController { @Autowired private ExcelService excelService; @PostMapping("/uploadExcel") public void uploadExcel(@RequestParam("file") MultipartFile file) { log.info("/excel/uploadExcel"); excelService.uploadExcel01(file); // excelService.uploadExcel02(file); } }
業務層代碼:
package cn.mindgd.service; import cn.mindgd.util.ExcelUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; /** * @author JiaXinMa * @description Excel測試業務層 * @date 2021/7/22 */ @Service public class ExcelService { /** * @author: JiaXinMa * @description: 上傳excel文件同時寫入數據庫 * @date: 2021/7/22 */ public void uploadExcel01(MultipartFile file) { try { //1.獲取文件並讀取數據 //判斷是否為excel String originalFilename = file.getOriginalFilename(); boolean isExcel = ExcelUtils.validateExcel(originalFilename); if (isExcel) { /* 不管2003 .xls還是2007 .xlsx 都是 * 用 new XSSFWorkbook(file.getInputStream())將MultipartFile文件轉為Workbook文件 */ Workbook workbook = new XSSFWorkbook(file.getInputStream());//情況1
//情況3 // Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream())); List<List<String>> uploadExcelData = getUploadExcelData(workbook); System.out.println("讀取的文件數據為:" + uploadExcelData); //2.賦值對象並插入數據,每一行就是條數據 } } catch (Exception e) { e.printStackTrace(); } } /** * @author: JiaXinMa * @description: 上傳excel文件同時寫入數據庫 * @date: 2021/7/22 */ public void uploadExcel02(MultipartFile file) { try { //1.獲取文件並讀取數據 //判斷是否為excel String originalFilename = file.getOriginalFilename(); boolean isExcel = ExcelUtils.validateExcel(originalFilename); boolean isExcel2003 = ExcelUtils.isExcel2003(originalFilename); boolean isExcel2007 = ExcelUtils.isExcel2007(originalFilename); if (isExcel) { Workbook workbook = null; /* 不管2003 .xls還是2007 .xlsx 都是 * 用 new XSSFWorkbook(file.getInputStream())將MultipartFile文件轉為Workbook文件 */ if (isExcel2003) {//情況2 workbook = new HSSFWorkbook(file.getInputStream()); } else if (isExcel2007) { workbook = new XSSFWorkbook(file.getInputStream()); } List<List<String>> uploadExcelData = getUploadExcelData(workbook); System.out.println("讀取的文件數據為:" + uploadExcelData); //2.賦值對象並插入數據,每一行就是條數據 } } catch (Exception e) { e.printStackTrace(); } } /** * @author: JiaXinMa * @description: 獲取上傳的Excel文件的數據 * @date: 2021/7/22 */ public List<List<String>> getUploadExcelData(Workbook workbook) throws Exception { ExcelUtils excelUtils = new ExcelUtils(workbook); List<List<String>> list = excelUtils.read(); return list; } }
demo中的工具類可以看我這篇博客:如何使用POI下載、導出Excel模板以及設置樣式?
測試后效果:
情況2和3都是保證錯誤:
情況1:
想看更多精彩內容,可以關注我的CSDN