1. 程式人生 > >【筆記】Spring整合EasyExcel

【筆記】Spring整合EasyExcel

EasyExcel

EasyExcel 由五部分組成,分別是配置讀取類(EasyExcelHalper)、匯出Excel類(EasyExcelExportUtil)、匯入Excel類(EasyExcelImportUtil)、匯入Excel返回結果類(EasyExcelImportResult)和xml配置檔案。

應用環境:

  1. 單執行緒、不牽扯到併發操作。同一時間只有一人做匯入操作,或只有管理員有匯入許可權。(受限於程式中的唯一性校驗)

  2. 匯入資料,列不超過26(受限於英文26個字母,不合法資料的定位),數量不大(受限於程式中資料校驗,不合法資料的定位,所謂越詳細就越複雜),支援常用的資料型別。

優點:

  1. 可以控制任意欄位的型別、是否可以為空及某個欄位的唯一性,避免重複匯入。

  2. 精確返回某一條不合法資料的某個欄位的位置,方便使用者根據提示修改Excel資料。例如:B3

  3. 有嚴格的資料校驗,避免匯入的資料不能轉成目標型別(資料庫欄位型別)。

  4. 可以凍結標題行。

缺點:

  1. 既要不合法資料精確定位,又要資料校驗,導致控制程式邏輯較多,以資料質量換取效能。

  2. 避免重複匯入功能要求不能併發操作。

  3. 資料量不能超過一個sheet頁,且資料儘量少。

  4. 需要準確在xml裡配置標籤、欄位、欄位資料型別、是否可以為空、是否唯一。

快速入門:

  1. 新增Maven依賴
<dependency>
    <groupId>commons-configuration</groupId>
    <artifactId>commons-configuration</artifactId>
    <version>1.10</version>
</dependency>

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId
>
<version>3.2.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency>
  1. xml配置

預設檔名【easyExcel-config.xml】,當然如果你覺得不爽,可以在EasyExcelHalper類中修改。
預設檔案放到src/main/resources根目錄下。
無需spring載入該配置檔案,EasyExcelHalper類自動去預設位置載入easyExcel-config.xml。
可以配置多個sheet頁,在程式中傳參選擇使用哪個資料模板。

xml的基本結構

<excel>
    <sheets>
        <sheet>
            <title>圖書</title>
        <freeze>true</freeze>
        <columns>
        <column>
                <name>書名</name>
                <type>java.lang.String</type>
                <notNull>true</notNull>
                <unique>true</unique>
            </column>

            <!-- column... -->

        </columns>
    </sheet>

    <!-- sheet... -->

    </sheets>
</excel>

其中,excel、sheets、sheet、title、columns、column、name、type節點是必有的。
3.jsp

<body>
    <a href="book/exportExcel">匯出Excel</a>
    <form action="book/importExcel" method="post" enctype="multipart/form-data">
        <input type="file" value="匯入Excel" name="bookExcel">
    <input type="submit"  value="匯入Excel" > 
    </form>
</body>

4.Controller


import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.sep6th.service.BookSrvImpl;
import com.sep6th.util.EasyExcelImportResult;

/** 
 * The Apache License 2.0
 * Copyright (c) 2018 sep6th
 */

@Controller
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookSrvImpl bookSrv;

    /**
     * 匯出
     */
    @RequestMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) throws Exception {
    String fileName = "書籍清單";
    bookSrv.exportExcel(response,fileName);
    }


    /**
     * 匯入
     * 返回的json格式:
     * {"dataCount":3,"errDataCount":0,"importDataCount":3,"xyOfNullList":[],"xyOfTypeNoMatchList":[],"xyOfRepList":[]}
     */
    @RequestMapping("/importExcel")
    @ResponseBody
    public EasyExcelImportResult importExcel(Model model, MultipartFile bookExcel){
    return bookSrv.importExcel(bookExcel);
    }

}
  1. Service
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.sep6th.util.EasyExcelExportUtil;
import com.sep6th.util.EasyExcelImportResult;
import com.sep6th.util.EasyExcelImportUtil;

/** 
 * The Apache License 2.0
 * Copyright (c) 2018 sep6th
 */

@Service
public class BookSrvImpl {

    /**
     * 匯出模板或資料
     */
    public void exportExcel(HttpServletResponse response, String fileName) {

    Map<Integer,List<Object[]>> map = new HashMap<Integer,List<Object[]>>();
    map.put(0, null);
    try {
        EasyExcelExportUtil.export(fileName, map, response);
    } catch (Exception e) {
        e.printStackTrace();
    }

    }

    /**
     * 匯入資料
     * @param bookExcel 
     */
    public EasyExcelImportResult importExcel(MultipartFile bookExcel) {

        List<List<Object>> dataList = new ArrayList<List<Object>>();

    // 模擬資料庫查出的唯一標識列
    Set<String> uniqueIdSet = new HashSet<String>();
    uniqueIdSet.add("11");
    uniqueIdSet.add("22");
    uniqueIdSet.add("33");

    EasyExcelImportResult result= EasyExcelImportUtil.readExcel(bookExcel, 0, dataList, uniqueIdSet);

    if(result.getErrDataCount()==0){
        System.out.println("模擬取資料,向資料庫新增資料中...");
        for (List<Object> list: dataList){
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+"  ");
        }
        System.out.println();
        }
        result.setImportDataCount((long) dataList.size());
    }
    return result;
    }

}