springboot+easyExcel實(shí)現(xiàn)導(dǎo)出操作

目的

根據(jù)業(yè)務(wù)需求對數(shù)據(jù)進(jìn)行導(dǎo)出excel操作,該excel包括4個模版(sheet)席镀,每一個模板代表一個實(shí)體對象。如圖:


sheet

開始

本項(xiàng)目使用的是springboot + vue +elementUI 實(shí)現(xiàn)夏漱,由于需要使用導(dǎo)出excel功能豪诲,所以淺入了easyExcel模塊。

1挂绰、導(dǎo)入easyExcel坐標(biāo)依賴
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>

easyExcel官方文檔:https://www.yuque.com/easyexcel/doc/quickstart

2屎篱、實(shí)體類編寫

在這里使用了lombok插件服赎,使用easyExcel只需要設(shè)置導(dǎo)出的excel表列名,使用@ExcelProperty(value="")注解交播。具體配置列名重虑、數(shù)據(jù)轉(zhuǎn)換,日期格式秦士,自定義excel表格樣式缺厉,請去官網(wǎng)查看。


實(shí)體類部分圖
3隧土、controller編寫
/**
     * 導(dǎo)出檔案
     */
    @RequestMapping("/export")
    public void export(@RequestParam Map<String, Object> params, HttpServletResponse response) throws IOException {
        OutputStream outputStream = response.getOutputStream();
        // 獲取數(shù)據(jù)
        PageUtils page = archService.getStatistics(params);
        // 獲取農(nóng)合檔案信息
        List<ArchEntity> archEntityList = (List<ArchEntity>) page.getList();
        // 遍歷設(shè)置List
        if (archEntityList.size() > 0) {
            List<FamilyEntity> familyEntityList = new ArrayList<>();
            List<CardEntity> cardEntityList = new ArrayList<>();
            List<PayEntity> payEntityList = new ArrayList<>();
            for (int i = 0; i < archEntityList.size(); i++) {
                // 獲取家庭檔案
                familyEntityList.add(i, archEntityList.get(i).getFamilyEntity());
                // 獲取慢性病卡檔案
                cardEntityList.add(i, archEntityList.get(i).getCardEntity());
                // 獲取慢性病報銷信息
                payEntityList.add(i, archEntityList.get(i).getPayEntity());
            }
            try {
                // 設(shè)置response
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
                // 這里URLEncoder.encode可以防止中文亂碼 當(dāng)然和easyexcel沒有關(guān)系
                String fileName = URLEncoder.encode("統(tǒng)計信息", "UTF-8");
                response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
                //新建ExcelWriter
                ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
                //獲取archSheet對象
                WriteSheet archSheet = EasyExcel.writerSheet(0, "農(nóng)合信息檔案").head(ArchEntity.class).build();
                //獲取參合人員信息,向archSheet寫入數(shù)據(jù)
                excelWriter.write(archEntityList, archSheet);
                //獲取archSheet對象
                WriteSheet familySheet = EasyExcel.writerSheet(1, "參合家庭檔案").head(FamilyEntity.class).build();
                //獲取家庭參合信息,向familySheet寫入數(shù)據(jù)
                excelWriter.write(familyEntityList, familySheet);
                //獲取cardSheet對象
                WriteSheet cardSheet = EasyExcel.writerSheet(2, "慢性病卡信息").head(CardEntity.class).build();
                //獲取家庭參合信息,向cardSheett寫入數(shù)據(jù)
                excelWriter.write(cardEntityList, cardSheet);
                //獲取paySheet對象
                WriteSheet paySheet = EasyExcel.writerSheet(3, "報銷記錄").head(PayEntity.class).build();
                //獲取家庭參合信息,向paySheet寫入數(shù)據(jù)
                excelWriter.write(payEntityList, paySheet);
                //關(guān)閉流
                excelWriter.finish();
                outputStream.flush();
            } catch (IOException e) {
                log.error("導(dǎo)出異常{}", e.getMessage());
            }
        }
    }
  • 1提针、創(chuàng)建OutputStream對象
OutputStream outputStream = response.getOutputStream();
  • 2、設(shè)置頭曹傀、類型辐脖、編碼格式
// 設(shè)置response
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 這里URLEncoder.encode可以防止中文亂碼 當(dāng)然和easyexcel沒有關(guān)系
String fileName = URLEncoder.encode("統(tǒng)計信息", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
  • 3、創(chuàng)建ExcelWriter對象
//新建ExcelWriter
ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
  • 4皆愉、創(chuàng)建WriteSheet對象嗜价,調(diào)用EasyExcel.writerSheet()方法寫入?yún)?shù)
//獲取archSheet對象
WriteSheet archSheet = EasyExcel.writerSheet(0, "農(nóng)合信息檔案").head(ArchEntity.class).build();

0為第一個模板(sheet),名稱是農(nóng)合信息檔案亥啦。head()中傳入的參數(shù)為實(shí)體類

  • 5炭剪、調(diào)用excelWriter.write()向sheet模板寫入?yún)?shù)
//獲取參合人員信息,向archSheet寫入數(shù)據(jù)
excelWriter.write(archEntityList, archSheet);

向excelWriter.write()方法中傳入List數(shù)據(jù)與WriteSheet對象

  • 6、關(guān)閉excelWriter.finish()
//關(guān)閉流
excelWriter.finish();
  • 7 翔脱、關(guān)閉outputStream.flush();
 outputStream.flush();
3、前端界面編寫
// 導(dǎo)出檔案
    exportHandle () {
      this.$nextTick(() => {
        this.$http({
          url: this.$http.adornUrl('/mxbbx/arch/export'),
          method: 'get',
          responseType: 'blob',
          params: this.$http.adornParams({
            'page': this.pageIndex,
            'limit': this.pageSize,
            'groupId': this.dataForm.groupId,
            'apName': this.dataForm.apName,
            'areaTime': this.dataForm.areaTime,
            'drName': this.dataForm.drName
          })
        }).then(({data}) => {
          // 創(chuàng)建Blob對象
          let blob = new Blob([data], { type: 'application/vnd.ms-excel;charset=utf-8' })
          // 獲取路徑
          let url = window.URL.createObjectURL(blob)
          // 創(chuàng)建a標(biāo)簽
          const link = document.createElement('a')
          // 設(shè)置a標(biāo)簽鏈接參數(shù)
          link.href = url
          // 重命名文件
          link.download = '報銷信息.xlsx'
          link.click()
          // 下載完成釋放URL 對象
          URL.revokeObjectURL(url)
          // 移除a標(biāo)簽
          document.body.removeChild(link)
        })
      })
    },

注意事項(xiàng)
1媒鼓、這里我使用的axios異步調(diào)用處理(和ajax沒啥大區(qū)別)
2届吁、請求參數(shù)中設(shè)置:responseType: 'blob',將返回響應(yīng)類型設(shè)置為blob
3绿鸣、在返回成功then()中疚沐,創(chuàng)建a標(biāo)簽,并為a標(biāo)簽設(shè)置超鏈接潮模,并設(shè)置點(diǎn)擊下載文件流亮蛔。如果不使用創(chuàng)建a標(biāo)簽的方式,將不會顯示下載彈窗G嫦帷>苛鳌!(大坑动遭,后端成功了芬探,前端一直沒有出現(xiàn)下載文件的彈窗,可能是vue的原因厘惦,在html中無需設(shè)置)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偷仿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酝静,老刑警劉巖节榜,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異别智,居然都是意外死亡宗苍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門亿遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浓若,“玉大人,你說我怎么就攤上這事蛇数∨驳觯” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵耳舅,是天一觀的道長碌上。 經(jīng)常有香客問我,道長浦徊,這世上最難降的妖魔是什么馏予? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮盔性,結(jié)果婚禮上霞丧,老公的妹妹穿的比我還像新娘。我一直安慰自己冕香,他們只是感情好蛹尝,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悉尾,像睡著了一般突那。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上构眯,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天愕难,我揣著相機(jī)與錄音,去河邊找鬼惫霸。 笑死猫缭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的它褪。 我是一名探鬼主播饵骨,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茫打!你這毒婦竟也來了居触?” 一聲冷哼從身側(cè)響起妖混,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轮洋,沒想到半個月后制市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弊予,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年祥楣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汉柒。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡误褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碾褂,到底是詐尸還是另有隱情兽间,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布正塌,位于F島的核電站嘀略,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乓诽。R本人自食惡果不足惜帜羊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸠天。 院中可真熱鬧讼育,春花似錦、人聲如沸稠集。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巍杈。三九已至,卻和暖如春扛伍,著一層夾襖步出監(jiān)牢的瞬間筷畦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工刺洒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳖宾,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓逆航,卻偏偏與公主長得像鼎文,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子因俐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容