關於EasyPoi導出Excel


如果你覺得Easypoi不好用,喜歡用傳統的poi,可以參考我的這篇博客:Springmvc導出Excel(maven)

當然了,萬變不離其宗。Easypoi的底層原理還是poi。正如MyBatis Plus的原理還是MyBatis那套。只不過它們的共同點是封裝起來。

關於Easypoi記得初次接觸的時候,給我的感覺是看起來很簡單很容易讓人理解,而且文檔也比較豐富,也是jeecg的開源項目下的子項目。

記得當初為了提高代碼開發效率,去碼雲和github上游盪游盪,突然發現了一個叫jeecg的玩意,於是研究了下,這個研究不是特別深,只是將其項目跑起來,看看它有哪些組件,順便看看源碼,和玩玩它強大的插件式開發和easypoi。

jeecg中的easypoi的項目地址為:https://gitee.com/jeecg/jeasypoi

jeecg中的easypoi的官方詳細文檔為:http://easypoi.mydoc.io/

 

大家要牢記一個經濟方面的格言:物質基礎決定上層建築。

對計算機專業的同志們而言,良好的計算機基礎,是以后編程世界的馳騁飛揚的基石。

所以在校的同志們,一定要好好學習天天向上。

閑話就不多說了,下面進入正題。

 

一、導入依賴

<!-- easypoi導入導出excel -->    
   <dependency>
          <groupId>cn.afterturn</groupId>
          <artifactId>easypoi-base</artifactId>
          <version>3.1.0</version>
      </dependency>
      <dependency>
          <groupId>cn.afterturn</groupId>
          <artifactId>easypoi-web</artifactId>
          <version>3.1.0</version>
      </dependency>
      <dependency>
          <groupId>cn.afterturn</groupId>
          <artifactId>easypoi-annotation</artifactId>
          <version>3.1.0</version>
      </dependency>
      

 

二、構建實體

@ExcelTarget("FinanceTrade")
@TableName("rms_finance_trade")
public class FinanceTrade extends Model<FinanceTrade> {

    private static final long serialVersionUID = 1L;

    @TableId("trade_no")
    private String tradeNo;
    
    @Excel(name="訂單號")
    @TableField("order_no")
    private String orderNo;
    /**
     * 用戶id
     */
    @TableField("user_id")
    private String userId;
    /**
     * 交易創建時間
     */
    @Excel(name="創建時間",width=30)
    @TableField("create_time")
    private String createTime;
    /**
     * 實際支付金額
     */
    @Excel(name="實際支付金額")
    private BigDecimal amount;
    /**
     * 交易狀態支付成功轉入退款未支付已關閉已撤銷支付失敗
     */
    private String status;
    /**
     * 流水標題
     */
    private String subject;
    
    @TableField("finish_time")
    private String finishTime;
    /**
     * 類型:余額支付balance、微信支付wx
     */
    private String type;
    /**
     * 資金流向:1:收入 ;0:支出
     */
    private String flows;
    /**
     * 備注
     */
    private String remarks;
    
   
    /**
     * 支付類型:余額,微信,混合支付等
     */
    @TableField(exist=false)
    @Excel(name="支付類型")
    private String payType;
    
    /**
     * 費用名稱
     */
    @TableField(exist=false)
    @Excel(name="費用名稱")
    private String amountType;
    
    @TableField(exist=false)
    private String leafNode;
    
    @TableField(exist=false)
    private String address;
    
    @TableField(exist=false)
    private String node;
    
    @TableField(exist=false)
    private String subNode;
    
    @TableField(exist=false)
    @Excel(name="賬戶",width=30)
    public String loginCode;
    
    @TableField(exist=false)
    @Excel(name="支付人")
    public String userName;
    

    
    
    /**
     * 公司編碼
     * @return
     */
    @TableField(value="company_code")
    private String companyCode;
    
    /**
     * 用戶
     */
    @TableField(exist=false)
    List<SysUser> sysUser;
    
    /**
     * 訂單
     */
    @TableField(exist=false)
    List<FinanceOrder> order;

    public String getLoginCode() {
        return loginCode;
    }

    public void setLoginCode(String loginCode) {
        this.loginCode = loginCode;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getLeafNode() {
        return leafNode;
    }

    public void setLeafNode(String leafNode) {
        this.leafNode = leafNode;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getNode() {
        return node;
    }

    public void setNode(String node) {
        this.node = node;
    }

    public String getSubNode() {
        return subNode;
    }

    public void setSubNode(String subNode) {
        this.subNode = subNode;
    }

    public String getPayType() {
        return payType;
    }

    public void setPayType(String payType) {
        this.payType = payType;
    }

    public String getAmountType() {
        return amountType;
    }

    public void setAmountType(String amountType) {
        this.amountType = amountType;
    }

    
    public String getCompanyCode() {
        return companyCode;
    }

    public void setCompanyCode(String companyCode) {
        this.companyCode = companyCode;
    }

    public String getTradeNo() {
        return tradeNo;
    }

    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getFinishTime() {
        return finishTime;
    }

    public void setFinishTime(String finishTime) {
        this.finishTime = finishTime;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getFlows() {
        return flows;
    }

    public void setFlows(String flows) {
        this.flows = flows;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    @Override
    protected Serializable pkVal() {
        return this.tradeNo;
    }

    public List<SysUser> getSysUser() {
        return sysUser;
    }

    public void setSysUser(List<SysUser> sysUser) {
        this.sysUser = sysUser;
    }

    public List<FinanceOrder> getOrder() {
        return order;
    }

    public void setOrder(List<FinanceOrder> order) {
        this.order = order;
    }

    @Override
    public String toString() {
        return "FinanceTrade [tradeNo=" + tradeNo + ", orderNo=" + orderNo + ", userId=" + userId + ", createTime="
                + createTime + ", amount=" + amount + ", status=" + status + ", subject=" + subject + ", finishTime="
                + finishTime + ", type=" + type + ", flows=" + flows + ", remarks=" + remarks
                + ", payType=" + payType + ", amountType=" + amountType + ", leafNode=" + leafNode + ", address="
                + address + ", node=" + node + ", subNode=" + subNode + ", companyCode=" + companyCode + "]";
    }
}
  • @Excel 作用到filed上面,是對Excel一列的一個描述
  • @ExcelCollection 表示一個集合,主要針對一對多的導出,比如一個老師對應多個科目,科目就可以用集合表示
  • @ExcelEntity 表示一個繼續深入導出的實體,但他沒有太多的實際意義,只是告訴系統這個對象里面同樣有導出的字段
  • @ExcelIgnore 和名字一樣表示這個字段被忽略跳過這個導導出
  • @ExcelTarget 這個是作用於最外層的對象,描述這個對象的id,以便支持一個對象可以針對不同導出做出不同處理

 

 

上面截圖我只是截取官方文檔上的一部分,大家想詳細知道,可參考官方文檔:http://easypoi.mydoc.io/#text_197835

 

三、編寫對應的Controller


@Controller
@RequestMapping(value = "easypoi")
public class ExportExcelTest {

     @Autowired
     private FinanceTradeService financeTradeService;
         
      /**
       * 導出Excel 營業收入支出明細
       * @param companyCode
       * @param flows
       * @param response
       * @return
       */
      @GetMapping(value="exportBillDatailInfo")
      @ResponseBody
      public String exportBillDatailInfo(HttpServletRequest request,HttpServletResponse response){
            String companyCode = request.getParameter("companyCode");
            String flows = request.getParameter("flows");
            System.out.println("companyCode:"+companyCode);
            System.out.println("flows:"+flows);
            // 獲取workbook對象
            // 單sheet或多sheet 只需要更改此處即可
            Workbook workbook = exportSheets(companyCode,flows) ;
            // 判斷數據
            if(workbook == null) {
                return "fail";
            }
            // 設置excel的文件名稱
            String excelName = "測試excel" ;
            // 重置響應對象
            response.reset();
            // 當前日期,用於導出文件名稱
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String dateStr = "["+excelName+"-"+sdf.format(new Date())+"]";
            // 指定下載的文件名--設置響應頭
            response.setHeader("Content-Disposition", "attachment;filename=" +dateStr+".xls");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            // 寫出數據輸出流到頁面
            try {
                OutputStream output = response.getOutputStream();
                BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
                workbook.write(bufferedOutPut);
                bufferedOutPut.flush();
                bufferedOutPut.close();
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "success";
     }
      
    
    /**
     * 多sheet導出
     * @return
     */
    public Workbook exportSheets(String companyCode,String flows){
       
        
        //將條件放入Map中
        Map<String,Object> conditionMap = new HashMap<String,Object>();
        
        conditionMap.put("companyCode", companyCode);
        conditionMap.put("flows", flows);
        conditionMap.put("start", 0);
        conditionMap.put("size", 100);
        
        //獲得營業明細(含收支)信息
        List<FinanceTrade> list = financeTradeService.getSpeedingDetailInfo(conditionMap);

        // 創建參數對象(用來設定excel得sheet得內容等信息)
        ExportParams params1 = new ExportParams() ;
        // 設置sheet得名稱
        params1.setSheetName("營業收支明細"); ;

        // 創建sheet1使用得map
        Map<String,Object> dataMap1 = new HashMap<>();
        // title的參數為ExportParams類型,目前僅僅在ExportParams中設置了sheetName
        dataMap1.put("title",params1) ;
        // 模版導出對應得實體類型
        dataMap1.put("entity",FinanceTrade.class) ;
        // sheet中要填充得數據
        dataMap1.put("data",list) ;
 
        // 將sheet1和sheet2使用得map進行包裝
        List<Map<String, Object>> sheetsList = new ArrayList<>() ;
        sheetsList.add(dataMap1);
        // 執行方法
        return ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF) ;
    }
    
}

 

小結:上面主要是關於Spring+MyBatis Plus+SpringMVC+EasyPoi+MySQL,更多簡單例子可以去官方文檔上看或者參照下面博客地址也可以:

EasyPoi導入導出:https://www.cnblogs.com/xiexy/p/8044393.html

EasyPoi導出示例:http://www.leftso.com/blog/329.html(該例非常簡單,很通俗易懂)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM