接收MultipartFile直接轉化為Workbook(Excel文件對象)及其應用場景


接收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

我的CSDN

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM