springboot poi匯出excel表格

sayWhat_sayHello發表於2018-07-12

第一步導包:
maven倉庫:https://mvnrepository.com/artifact/org.apache.poi/poi/3.17

maven方式:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>


gradle方式:
// https://mvnrepository.com/artifact/org.apache.poi/poi
compile group: 'org.apache.poi', name: 'poi', version: '3.17'

首先我們要構造一個excel表結構:由於很多其他的博文會給excel表的字型、樣式下功夫.導致小白會覺得有點畫蛇添足,我們先考慮完成匯出excel表這個需求才能考慮繼續深造。
構造一個表從兩方面考慮,一方面是結構,一方面是資料。
下面這個工具欄提供的方法很簡單,就是傳入一個excel表名,excel每一列的列名,一個資料集,以及在資料集中每個欄位對映的key,其實也可以不用傳這個key,但是為了表結構更加清晰,以及更容易獲取資料,我們傳多一個key陣列。

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.util.List;
import java.util.Map;

/**
 * 生成Excel檔案的工具類
 * @author weiyuwang
 */
public class ExcelUtil {

    /**
     * 建立excel文件,
     * @param excelName excel的表名
     * @param list 資料,相當於每一行,而map的key代表了單元格的欄位,value則是值
     * @param keys list中map的key陣列集合
     * @param columnNames excel的列名
     * */
    public static Workbook createWorkBook(String excelName,List<Map<String, Object>> list, String[] keys, String[] columnNames) {
        // 建立excel工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        // 建立第一個sheet(頁),並命名
        Sheet sheet = wb.createSheet(excelName);
        // 建立第一行
        Row firstRow = sheet.createRow(0);
        //設定列名
        for(int i=0;i<columnNames.length;i++){
            Cell cell = firstRow.createCell(i);
            cell.setCellValue(columnNames[i]);
        }
        //設定每行每列的值
        for (int i = 0; i < list.size(); i++) {
            // Row 行,Cell 方格 , Row從1開始,因為第一行用來存放了列名,cell從0開始
            // 建立一行,在頁sheet上
            Row row = sheet.createRow( i+1);
            // 在row行上建立一個方格
            for(int j=0;j<keys.length;j++){
                Cell cell = row.createCell(j);
                cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
            }
        }
        return wb;
    }

}

接下來是controller,這裡一開始我用的是post方法,但是這種方法本地不知道怎麼測試,後來我改成了get方法,將post方法註釋了。
其實表結構確定了,接下來主要是資料的封裝。也就是要構建一個List<Map<String, Object>> datas ,由於每個人要封裝的資料不一樣,這裡就不對mapper,entity 再做敘述。
其實我個菜雞一直不知道原來這裡也可以用response的,所以看了很多相關博文都不知道怎麼下手,然後走投無路嘗試了一下發現可以用hhh。這裡我點一下,避免一些和我一樣在努力學習但是還是比較菜的小夥伴不知道。

    /**
     * export excel
     */
    @RequestMapping(value = "/export")
//    public void export(@RequestBody GoalExportEntity request,HttpServletResponse response) {
        public void export(HttpServletResponse response) {

        String excelName = "公司指標";
        String[] columnName = new String[]{"考核物件","總計","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
        String[] keys = new String[]{"name","total","1","2","3","4","5","6","7","8","9","10","11","12"};

        try{

            //設定excel表的資料:
            List<Map<String, Object>> datas = new ArrayList<>();
//            List<GoalSettingEntity> list = goalMapper.findByIdAndYearCombine(request.getGoalId(), request.getYear());
            List<GoalSettingEntity> list = goalMapper.findByIdAndYearCombine(13, 2018);
            for (GoalSettingEntity entity : list) {
                Map<String, Object> map = JsonUtil.toObjectMap((entity.getGoalInfo()));
                Integer total = 0;
                for (Object s : map.values()) {
                    total += (Integer)s;
                }
                map.put("total", total.toString());
                map.put("name",entity.getName());
                datas.add(map);
            }

            Workbook workBook = ExcelUtil.createWorkBook(excelName, datas, keys, columnName);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-disposition", "attachment;filename=createList.xls");//預設Excel名稱
            response.flushBuffer();
            ServletOutputStream outputStream = response.getOutputStream();
            workBook.write(outputStream);
            workBook.close();
            outputStream.close();

        } catch (Exception e){
            e.printStackTrace();
        }

    }

這裡寫圖片描述

相關文章