前言:
在之前寫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~