如何使用SpringBoot結合POI進行Excel文件導入導出

   Hello,大家好,我是Steafan,今天爲大家帶來如何使用POI操作Excel文件,話不多說,直入正題。

   本片博文默認讀者已經搭建好了SpringBoot的架子,還沒有搭建springBoot的朋友,請先搭建好SpringBoot框架。

一、引入POI依賴       

    引入的POI依賴要和你的SpringBoot版本保持兼容,否則無法使用POI。

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
            <scope>compile</scope>
        </dependency>

二、Excel導出工具類封裝

    工具類中幾乎每行都有對代碼的詳細解釋,這裏不再贅述。注意一下使用POI中各類引入的包,不要導錯包了。這個工具類最後是將處理好的Excel文件已流的形式輸出並提供給用戶下載,即當用戶點擊導出按鈕時會彈出下載框,供用戶下載,且文件名稱是用戶自定義的,格式爲Excel格式。

import java.io.IOException;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 
 * @author steafan
 *
 */
public class ExcelUtil {
    
    /**
     * 將條件數據寫入Excel並導出,提供文件下載
     * 
     */
    public static void excelExport(HttpServletResponse response, String[] cellTitle, 
            List<Map<String, Object>> dataList, List<String> keyList) throws IOException {
        // 取到所有數據,創建Excel
        // 創建Excel文件
        XSSFWorkbook myWorkbook = new XSSFWorkbook();
        // 創建sheet
        XSSFSheet excelSheet = myWorkbook.createSheet("sheet");
        // 創建待用row
        XSSFRow row = excelSheet.createRow(0);
        XSSFCellStyle cellStyle = myWorkbook.createCellStyle();
        // 創建一個居中格式
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        XSSFCell cell = null;
        // 填充列名並設置樣式
        for(int i = 0; i < cellTitle.length; i++) {
            // 創建標題數量的單元格
            cell = row.createCell(i);
            // 填充該單元格數據爲列標題
            cell.setCellValue(cellTitle[i]);
            cell.setCellStyle(cellStyle);   
        }
        Map map = null;
        for(int i = 0; i < dataList.size(); i++) {
            // 創建數據條數
               row = excelSheet.createRow(i + 1);
               map = dataList.get(i);
               for(int j = 0; j < keyList.size(); j++) {
                 // 創建數據單元格數量
                 row.createCell(j).setCellValue(map.get(keyList.get(j)).toString());
               }
        }
        // 將導出的Excel進行下載
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + "EXCELFILE" + ".xls");
        response.flushBuffer();
        OutputStream outputStream = response.getOutputStream();
        myWorkbook.write(outputStream);
        myWorkbook.close();
        outputStream.flush();
        outputStream.close();
    }


}

三、導入Excel並對Excel中的數據進行解析工具類封裝

    Excel導入是將Excel文件以輸入流的方式進行導入,即InputStream形式,注意一下使用POI中各類引入的包,不要導錯包了。

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.*;

public class ResolveExcel {

    public static Map<String,List<List<String>>> getServerBasedSheetInfo(InputStream is, String suffix) throws Exception {
        // 獲取到需要解析的Excel文件
        Workbook workbook = getWorkbook(is, suffix);
        Map<String,List<List<String>>> map = new HashMap<>();
        // 獲取到需要解析的sheet頁,索引從0開始
        Sheet sheet0 = workbook.getSheetAt(0);
        List<List<String>> first = new ArrayList();
        // 獲取一共有幾行
        for (int i = 0; i <= sheet0.getLastRowNum(); i++) {
            Row row = sheet0.getRow(i);
            List<String> cellList = new ArrayList<>();
            // 獲取所有單元格的數量
            for (int j = 0; j <= row.getLastCellNum() - 1; j++) {
                // 獲取每一行的所有單元格
                if(row.getCell(j) != null) {
                    cellList.add(getCellValue(row.getCell(j)));
                }else{
                    cellList.add(null);
                }
            }
            first.add(cellList);
        }
        map.put("first",first);
        return map;
    }

    // Excel中不同類型的值的處理
    public static String getCellValue(Cell cell){
        String cellValue = "未知類型";
        switch (cell.getCellType()){
            case Cell.CELL_TYPE_NUMERIC: //數字
                cellValue = new DecimalFormat("#").format(cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_STRING: //字符串
                cellValue = String.valueOf(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_BOOLEAN: //Boolean
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA: //公式
                cellValue = String.valueOf(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_BLANK: //空值
                cellValue = "";
                break;
            case Cell.CELL_TYPE_ERROR: //故障
                cellValue = "非法字符";
                break;
        }
        return cellValue;
    }


    // 獲取Excel統一方法封裝
    public static Workbook getWorkbook(InputStream is, String suffix) throws IOException {
        Workbook workbook = null;
        if (suffix.equals(".xlsx")){
            workbook = new XSSFWorkbook(is);
        }else if (suffix.equals(".xls")){
            workbook = new HSSFWorkbook(is);
        }
        return workbook;
    }
}

    有不懂的地方歡迎留言,我會及時回覆,感謝各位關注!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章