Java導出Excel完整例子+完整代碼,使用easypoi導出Excel+通用工具類

前言:

在之前寫Excel導入導出功能的時候,使用更多的可能是apache的poi,相信用過poi的應該都會感覺poi使用起來還是有點點麻煩的,所以,如果你是:不太熟悉poi的、不想寫太多重複太多的、只是簡單的導入導出的。那麼相信我,使用easypoi絕對很適合。

easypoi,正如同它的名字一樣,主打的功能就是容易,讓一個沒見接觸過poi的人員,就可以很方便的寫出Excel導出、Excel導入,通過簡單的註解就可以完成以前複雜的寫法。

so,今天就用easypoi來做一個導出Excel的完整案例,項目是SpringBoot的項目

一、引入pom依賴

<!-- excle導入導出依賴包 start -->
<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>
<!-- excle導入導出依賴包 end -->

注意:有的文章或者博客可能說可以不用上邊三個依賴這麼麻煩,直接用 easypoi-spring-boot-starter 一個依賴就可以了

但是,用easypoi-spring-boot-starter 這個可能會導致你的springboot項目jar包依賴衝突,所以還是推薦使用上邊的三個依賴

二、定義需要導出的實體對象User

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;

/**
 * 導出對應的實體類
 *
 * @author caoju
 */
@ExcelTarget("user")
@Data
public class User implements Serializable {

    @Excel(name = "id",width=7)
    private Integer id;

    @Excel(name = "姓名",width=15)
    private String name;

    @Excel(name = "性別",replace = { "男_1", "女_2" },width=10)
    private Integer sex;

    @Excel(name = "創建時間",exportFormat = "yyyy-MM-dd HH:mm:ss",width=25)
    private Date createTime;

}

三、Excel導出工具類 和 導出自定義樣式類

不要看下面的兩個類這麼長,好像多複雜似的

別擔心!就是個工具類而已啦~

你懂的,直接ctrl c、ctrl v(我也懂的,熱愛編程的你,最喜歡的就是這個 c v大法,簡單粗暴,不多bibi!hia hia hia~~~)

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.xiaoleilu.hutool.date.DateUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Excel導出工具類
 *
 * @author caoju
 */
@Slf4j
public class ExcelUtils {

    /** 允許導出的最大條數 */
    private static final Integer EXPORT_EXCEL_MAX_NUM = 10000;

    /**
     * 導出Excel
     *
     * @param workbook workbook流
     * @param fileName 文件名
     * @param response 響應
     */
    public static void exportExcel(Workbook workbook, String fileName, HttpServletResponse response) {
        //給文件名拼接上日期
        fileName = fileName + StrUtil.UNDERLINE + DateUtil.today();
        //輸出文件
        try (OutputStream out = response.getOutputStream()) {
            //獲取文件名並轉碼
            String name = URLEncoder.encode(fileName, "UTF-8");
            //設置編碼
            response.setCharacterEncoding("UTF-8");
            //設置http響應頭告訴瀏覽器,以下載的形式處理響應的數據
            response.setContentType("application/force-download");
            //設置下載文件的默認名稱
            response.setHeader("Content-Disposition", "attachment;filename=" + name + ".xlsx");
            //輸出表格
            workbook.write(out);
        } catch (IOException e) {
            log.error("文件導出異常,詳情如下:", e);
        } finally {
            try {
                if (workbook != null) {
                    //關閉輸出流
                    workbook.close();
                }
            } catch (IOException e) {
                log.error("文件導出異常,詳情如下:", e);
            }
        }
    }

    /**
     * 獲取導出的 Workbook對象
     *
     * @param title     大標題
     * @param sheetName 頁簽名
     * @param object    導出實體
     * @param list      數據集合
     * @return Workbook
     */
    public static Workbook getWorkbook(String title, String sheetName, Class object, List list) {
        //判斷導出數據是否爲空
        if (list == null) {
            list = new ArrayList<>();
        }
        //判斷導出數據數量是否超過限定值
        if (list.size() > EXPORT_EXCEL_MAX_NUM) {
            title = "導出數據行數超過:" + EXPORT_EXCEL_MAX_NUM + "條,無法導出、請添加查詢條件後再進行導出!";
            list = new ArrayList<>();
        }
        //導出參數
        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        //設置導出樣式,可以不設置使用默認的樣式,這裏用的是自定義樣式
        exportParams.setStyle(ExcelStyle.class);
        //輸出Workbook流
        return ExcelExportUtil.exportExcel(exportParams, object, list);
    }

    /**
     * 獲取導出的 Workbook對象
     *
     * @param path 模板路徑
     * @param map  導出內容map
     * @return Workbook
     */
    public static Workbook getWorkbook(String path, Map<String, Object> map) {
        //獲取導出模板
        TemplateExportParams params = new TemplateExportParams(path);
        //設置導出樣式
        params.setStyle(ExcelStyle.class);
        //輸出Workbook流
        return ExcelExportUtil.exportExcel(params, map);
    }

}
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl;
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
import org.apache.poi.ss.usermodel.*;

/**
 * Excel導出自定義樣式類
 *
 * @author caoju
 */
public class ExcelStyle extends ExcelExportStylerDefaultImpl implements IExcelExportStyler {

    private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");

    private static final short FONT_SIZE_TEN = 10;

    private static final short FONT_SIZE_ELEVEN = 11;

    private static final short FONT_SIZE_TWELVE = 12;

    /**
     * 大標題樣式
     */
    private CellStyle headerStyle;

    /**
     * 每列標題樣式
     */
    private CellStyle titleStyle;

    /**
     * 數據行樣式
     */
    private CellStyle styles;

    public ExcelStyle(Workbook workbook) {
        super(workbook);
        this.init(workbook);
    }

    /**
     * 初始化樣式
     *
     * @param workbook
     */
    private void init(Workbook workbook) {
        //大標題樣式
        this.headerStyle = initHeaderStyle(workbook);
        //每列標題樣式
        this.titleStyle = initTitleStyle(workbook);
        //數據行樣式
        this.styles = initStyles(workbook);
    }

    /**
     * 大標題樣式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getHeaderStyle(short color) {
        return headerStyle;
    }

    /**
     * 每列標題樣式
     *
     * @param color
     * @return
     */
    @Override
    public CellStyle getTitleStyle(short color) {
        return titleStyle;
    }

    /**
     * 數據行樣式
     *
     * @param parity 可以用來表示奇偶行
     * @param entity 數據內容
     * @return 樣式
     */
    @Override
    public CellStyle getStyles(boolean parity, ExcelExportEntity entity) {
        return styles;
    }

    /**
     * 獲取樣式方法
     *
     * @param dataRow 數據行
     * @param obj     對象
     * @param data    數據
     */
    @Override
    public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) {
        return getStyles(true, entity);
    }

    /**
     * 模板使用的樣式設置
     */
    @Override
    public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
        return null;
    }

    /**
     * 初始化--大標題樣式
     *
     * @param workbook
     * @return
     */
    private CellStyle initHeaderStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
        return style;
    }

    /**
     * 初始化--每列標題樣式
     *
     * @param workbook
     * @return
     */
    private CellStyle initTitleStyle(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false));
        //背景色 POI IndexedColors 編碼 與 顏色枚舉類 對照 : https://blog.csdn.net/ju_362204801/article/details/106079171
        style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return style;
    }

    /**
     * 初始化--數據行樣式
     *
     * @param workbook
     * @return
     */
    private CellStyle initStyles(Workbook workbook) {
        CellStyle style = getBaseCellStyle(workbook);
        style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
        style.setDataFormat(STRING_FORMAT);
        return style;
    }

    /**
     * 基礎樣式
     *
     * @return
     */
    private CellStyle getBaseCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        //下邊框
        style.setBorderBottom(BorderStyle.THIN);
        //左邊框
        style.setBorderLeft(BorderStyle.THIN);
        //上邊框
        style.setBorderTop(BorderStyle.THIN);
        //右邊框
        style.setBorderRight(BorderStyle.THIN);
        //水平居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //上下居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        //設置自動換行
        style.setWrapText(true);
        return style;
    }

    /**
     * 字體樣式
     *
     * @param size   字體大小
     * @param isBold 是否加粗
     * @return
     */
    private Font getFont(Workbook workbook, short size, boolean isBold) {
        Font font = workbook.createFont();
        //字體樣式
        font.setFontName("宋體");
        //是否加粗
        font.setBold(isBold);
        //字體大小
        font.setFontHeightInPoints(size);
        return font;
    }

}

再說一下哈,上邊面兩個類雖然很長,但就是個工具類而已啦~

不多說!你懂的!直接ctrl c、ctrl v

四、測試導出方法的Controller

import com.google.common.collect.Lists;
import com.qtyc.utils.ExcelUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;

/**
 * 導出Excel測試Controller
 * 
 * @author caoju
 */
@RestController
public class ExcelExportController {

    /**
     * 導出Excel測試
     */
    @RequestMapping(value = "/exportExcelTest", method = RequestMethod.GET)
    public void exportExcelTest(HttpServletResponse response) {
        List<User> personList = this.findUser();
        ExcelUtils.exportExcel(ExcelUtils.getWorkbook("用戶信息列表", "用戶信息", User.class, personList), "用戶信息列表導出", response);
    }

    /**
     * 模擬數據庫查詢返回用戶信息
     */
    private List<User> findUser() {
        List<User> list = Lists.newArrayList();
        User user = new User();
        user.setId(10);
        user.setName("張三");
        user.setSex(1);
        user.setCreateTime(new Date());
        list.add(user);
        User user1 = new User();
        user1.setId(26);
        user1.setName("李四");
        user1.setSex(1);
        user1.setCreateTime(new Date());
        list.add(user1);
        User user2 = new User();
        user2.setId(28);
        user2.setName("王麗");
        user2.setSex(2);
        user2.setCreateTime(new Date());
        list.add(user2);
        return list;
    }    

}

五、測試

瀏覽器輸入:http://localhost:8082/exportExcelTest

可以看到瀏覽器左下角彈出了下載窗口,自動下載了Excel

打開下載的文件夾可以看到剛纔下載的Excel

打開Excel看下里邊的內容

可以看到咱們想要導出的內容已經導出了,其中的標題,表頭,以及每行每列的背景顏色,字體等等都可以通過代碼根據自己的需求來自定義的。它的顏色設置是個枚舉類,但是通過枚舉類不能夠直觀的看到對應的顏色,所以我寫了一篇博客,上邊有顏色枚舉類對應的顏色,看起來很直觀,需要的話,可以打開看看:easypoi或者POI導出Excel時 IndexedColors 編碼枚舉值 與 顏色 對照

覺得對你有幫助的話,可以點個關注,點個贊,3Q~

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