easypoi實現表格導出(實現一對多,合併單元格)

easypoi教程文檔:http://easypoi.mydoc.io/#text_197817

教程寫的比零散,每次看都比較費勁。所以每次費勁之後就想整理一下。

1、pom依賴

        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--        我這裏用了lombok,根據個人情況選擇是否使用,此依賴與easypoi無關,只是許需要寫get set方法了-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2、導出對應的實體類(一對多中的“一”)

package sol.erms.model.entity.process.use;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 借閱記錄表/借閱主表導出表
 * </p>
 *
 * @author groot
 * @since 2020-03-18
 */
@Data
public class ErmsUseMainExport implements Serializable {

    private static final long serialVersionUID = 1L;


    /**
     * 借閱編號
     */
    @Excel(name = "借閱單編號", width = 20,needMerge = true)
    private String useNo;

    /**
     * 借閱人
     */
    @Excel(name = "申請人", width = 20,needMerge = true)
    private String ermsLender;

    /**
     * 借閱目的
     */
    @Excel(name = "借閱目的",width = 20, needMerge = true)
    private String ermsLendingpurpose;

    //子條目集合(這裏是實現一對多的關鍵。name=""是爲了不出現表頭,如果不爲空表頭會多一層合併的單元格)
    @ExcelCollection(name = "")
    private List<ERMSUseExport> archList;






}

3、子對象(一對多中的“多”)

package sol.erms.model.entity.process.use;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;

import java.util.Date;

@Data
public class ERMSUseExport {

    @Excel(name = "檔案名稱",width = 30)
    private String archName;

    @Excel(name = "檔案編號",width = 30)
    private String archNo;

    @Excel(name = "借閱方式",width = 20 ,replace = {"在線查看_0","現場查看_1","原件借出_2"})
    private String ermsApplymode;

    @Excel(name = "借出時間",width = 30)
    private Date startUseDate;

    @Excel(name = "借出受理人",width = 20)
    private String ermsLendhandler;

    @Excel(name = "借出審覈人",width = 20)
    private String ermsBorrowReviewer;

    @Excel(name = "歸還時間",width = 30)
    private Date ermsReturntime;

    @Excel(name = "歸還人",width = 20)
    private Date ermsReturner;

    @Excel(name = "歸還受理人",width = 20)
    private Date ermsReturnhandler;

    @Excel(name = "歸還複覈人",width = 20)
    private Date ermsReturnReviewer;

}

4、一對多導出的實現方法

    /**
     * excel導出時(一對多實現)
     * 
     *
     * @param response
     * @param workbook
     * @param fileName
     * @throws Exception
     */
    public Response exportUseRecord(HttpServletResponse response, List<Long> useIds) {
        try {
            if(ObjectUtils.isEmpty(useIds))return Response.fail("參數爲空");
            Map<String,Object> map = new HashMap<>();
            map.put("ids",useIds);
            //獲取導出數據
            List<ErmsUseMainExport> mainList = ermsUseMainService.getMainListUseCollectionByCondition(map);
            // 簡單模板導出方法
            ExportParams params = new ExportParams();
            params.setSheetName("借閱單");//設置sheet名
            Workbook workbook = ExcelExportUtil.exportExcel(params, ErmsUseMainExport.class, mainList);
            //返回頭設置下載,並設置文件名,返回
            setExportExcelFormat(response, workbook, "借閱單導出");
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return Response.fail("系統錯誤!");
        }
        return Response.success();
    }

    /**
     * excel導出時
     * 返回頭設置下載,並設置文件名
     * 注意:以下設置編碼格式是爲了ie,當前項目是ie下使用的。360或者谷歌可能會文件名會亂碼。根據自己需要調整編碼。或者不用設置這麼多,直接outStream輸出得了。
     * @param response
     * @param workbook
     * @param fileName
     * @throws Exception
     */
    private void setExportExcelFormat(HttpServletResponse response, Workbook workbook, String fileName) throws Exception {
        response.reset();
        response.setContentType("application/x-msdownload");//下載
        fileName = fileName + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("gb2312"), "ISO-8859-1") + ".xls");
        ServletOutputStream outStream = null;
        try {
            outStream = response.getOutputStream();
            workbook.write(outStream);
        } finally {
            outStream.close();
        }
    }

5、效果圖

 

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