springboot中使用poi導入excel文件

.xls和.xlsx兩種格式均可以java

IImportExcelService.java
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.multipart.MultipartFile;

public interface IImportExcelService {
    
    /**
     * 獲取導入的Excel表中數據
     * @param file 文件
     * @param req 
     * @param resp
     * @return 返回集合
     */
    public List<UserConsumeDetailRecord> importExcelWithSimple(MultipartFile file,HttpServletRequest req,HttpServletResponse resp);
}
ImportExcelServiceImpl.java
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Service
public class ImportExcelServiceImpl extends ImportExcelBaseService implements IImportExcelService{

    @Override
    public List<UserConsumeDetailRecord> importExcelWithSimple(MultipartFile file,HttpServletRequest req,HttpServletResponse resp) {
        int rowNum = 0;//已取值的行數
        int colNum = 0;//列號
        int realRowCount = 0;//真正有數據的行數
        
        //獲得工做空間
        Workbook workbook = null;
        try {
            workbook = super.getWorkbookByInputStream(file.getInputStream(), file.getOriginalFilename());
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        //獲得工做表
        Sheet sheet = super.getSheetByWorkbook(workbook, 0);
        if (sheet.getRow(2000) != null){
            throw new RuntimeException("系統已限制單批次導入必須小於或等於2000筆!");
        }
        
        realRowCount = sheet.getPhysicalNumberOfRows();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<UserConsumeDetailRecord> list = new ArrayList<>();
        UserConsumeDetailRecord UserConsumeDetailRecord = null;
        
        for(Row row:sheet) {
            if(realRowCount == rowNum) {
                break;
            }
            
            if(super.isBlankRow(row)) {//空行跳過
                continue;
            }
            
            if(row.getRowNum() == -1) {
                continue;
            }else {
                if(row.getRowNum() == 0) {//第一行表頭跳過
                    continue;
                }
            }
            
            rowNum ++;
            colNum = 1;
            UserConsumeDetailRecord = new UserConsumeDetailRecord();
            
            super.validCellValue(sheet, row, ++ colNum, "用戶姓名");
            UserConsumeDetailRecord.setUserName(super.getCellValue(sheet, row, colNum - 1));
            
            super.validCellValue(sheet, row, ++ colNum, "消費金額");
            UserConsumeDetailRecord.setConsumeAmount(Double.valueOf(super.getCellValue(sheet, row, colNum - 1)));
            
            super.validCellValue(sheet, row, ++ colNum, "消費時間");
            try {
                UserConsumeDetailRecord.setConsumeDate(sdf.parse(super.getCellValue(sheet, row, colNum - 1)));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            
            super.validCellValue(sheet, row, ++ colNum, "消費項目");
            UserConsumeDetailRecord.setConsumeTitle(super.getCellValue(sheet, row, colNum - 1));
            
            list.add(UserConsumeDetailRecord);
        }
            
        return list;
    }
}
ImportExcelBaseService.java
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;

@Component
public class ImportExcelBaseService {
    
    /**
     * 導入值校驗
     * @param sheet 工做表
     * @param row 行
     * @param colNum 列編號
     * @param errorHint 錯誤提示
     * @return 校驗經過返回空,不然拋出異常
     */
    public void validCellValue(Sheet sheet,Row row,int colNum,String errorHint) {
        if("".equals(this.getCellValue(sheet, row, colNum - 1))) {
            throw new RuntimeException("校驗 :第" + (row.getRowNum() + 1) + "行" + colNum +"列"+ errorHint + "不能爲空");
        }
    }

    /**
     * 從輸入流中獲取excel工做表
     * @param iStream 輸入流
     * @param fileName 帶 .xls或.xlsx 後綴的文件名
     * @return 文件名爲空返回空;
     *                  格式不正確拋出異常;
     *                  正常返回excel工做空間對象
     */
    public Workbook getWorkbookByInputStream(InputStream iStream, String fileName) {
        Workbook workbook = null;
        
        try {
            if(null == fileName) {
                return null;
            }
            
            if(fileName.endsWith(".xls")) {
                workbook = new HSSFWorkbook(iStream);
            }else if(fileName.endsWith(".xlsx")){
                workbook = new XSSFWorkbook(iStream);
            }else {
                throw new IOException("The document type don't support");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (iStream != null){
                try {
                    iStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        return workbook;
    }
    
    /**
     * 從Workbook中獲取一個sheet,若是沒有就建立一個
     * @param workbook 工做空間
     * @param index 第幾個sheet
     * @return 返回sheet
     */
    public Sheet getSheetByWorkbook(Workbook workbook,int index) {
        Sheet sheet = workbook.getSheetAt(index);
        if(null == sheet) {
            sheet = workbook.createSheet();
        }
        
        sheet.setDefaultRowHeightInPoints(20);//行高
        sheet.setDefaultColumnWidth(20);//列寬
        
        return sheet;
    }
    
    /**
     * 獲取指定sheet指定row中指定column的cell值
     * @param sheet 工做表
     * @param row 行
     * @param column 第幾列
     * @return 返回單元格的值或""
     */
    public String getCellValue(Sheet sheet,Row row,int column) {
        if(sheet == null || row == null) {
            return "";
        }
        
        return this.getCellValue(row.getCell(column));
    }
    
    /**
     * 從單元格中獲取單元格的值
     * @param cell 單元格
     * @return 返回值或""
     */
    public String getCellValue(Cell cell) {
        if(cell == null) {
            return "";
        }
        
        switch(cell.getCellType()) {
        case Cell.CELL_TYPE_NUMERIC:
            Number number = cell.getNumericCellValue();
            String numberStr = String.valueOf(number);
            
            if(numberStr.endsWith(".0")) {
                numberStr = numberStr.replace(".0", "");//取整數
            }
            if(numberStr.indexOf("E") >=0 ) {
                numberStr = new DecimalFormat("#").format(number);//取整數
            }
            
            return numberStr;
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue().trim();
        case Cell.CELL_TYPE_FORMULA://公式
            return "";
        case Cell.CELL_TYPE_BLANK:
            return "";
        case Cell.CELL_TYPE_BOOLEAN:
            return String.valueOf(cell.getBooleanCellValue());
        default :
            break;
        }
        
        return "";
    }
    
    /**
     * 判斷該行是否爲空行
     * @param row 行
     * @return 爲空行返回true,不爲空行返回false
     */
    public boolean isBlankRow(Row row) {
        if(row == null) {
            return true;
        }
        
        Iterator<Cell> iter = row.cellIterator();
        while(iter.hasNext()) {
            Cell cell = iter.next();
            if(cell == null) {
                continue;
            }
            
            String value = this.getCellValue(cell);
            if(!this.isNULLOrBlank(value)) {
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * 判斷一個對象是否爲空
     * @param obj 對象
     * @return 爲空返回true,不爲空返回false
     */
    public boolean isNULLOrBlank(Object obj) {
        if(obj != null && !"".equals(obj.toString())) {
            return false;
        }
        
        return true;
    }
}
ImportExcelController.java
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/importExlce")
public class ImportExcelController {
    
    @Autowired
    IImportExcelService iImportExcelService;
    
    @RequestMapping(value="/withSimple",method=RequestMethod.POST)
    public String withSimple(MultipartFile file,HttpServletRequest req,HttpServletResponse resp) {
        List<UserConsumeDetailRecord> list = iImportExcelService.importExcelWithSimple(file, req, resp);
        
        if(list == null || list.size() == 0 ) {
            return "fail";
        }
        
        for(UserConsumeDetailRecord bean:list) {
            System.out.println(bean.toString());
        }
        
        //批量插入list到數據庫
        
        return "success";
    }
    
}

  UserConsumeDetailRecord.javaweb

package com.wulss.jakartapoi.hssf;

import java.util.Date;

/**
 * 
 * @Descript TODO (用戶消費實體)
 * @author Administrator
 * @date 2019年5月24日
 *
 */
public class UserConsumeDetailRecord {
    private int id;
    
    private int userId;
    
    private String userName;
    
    private String userTel;
    
    private String consumeTitle;
    
    private Date consumeDate;
    
    private Double consumeAmount;

    @Override
    public String toString() {
        return "UserConsumeDetailRecord [id=" + id + ", userId=" + userId + ", userName=" + userName + ", userTel="
                + userTel + ", consumeTitle=" + consumeTitle + ", consumeDate=" + consumeDate + ", consumeAmount="
                + consumeAmount + "]";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserTel() {
        return userTel;
    }

    public void setUserTel(String userTel) {
        this.userTel = userTel;
    }

    public String getConsumeTitle() {
        return consumeTitle;
    }

    public void setConsumeTitle(String consumeTitle) {
        this.consumeTitle = consumeTitle;
    }

    public Date getConsumeDate() {
        return consumeDate;
    }

    public void setConsumeDate(Date consumeDate) {
        this.consumeDate = consumeDate;
    }

    public Double getConsumeAmount() {
        return consumeAmount;
    }

    public void setConsumeAmount(Double consumeAmount) {
        this.consumeAmount = consumeAmount;
    }
}
UserConsumeDetailRecord
相關文章
相關標籤/搜索