您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關SpringBoot中怎么利用easyexcel導出Excel,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
首先我們創建一個springboot(版本是 2.1.4.RELEASE)項目,在此就不過多的啰嗦,創建好之后,首先需要引入easyexcel的maven坐標。
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beta5</version> </dependency>
導入好了之后,我們接下來需要創建一個導出的模板類,首先要集成BaseRowModel,set、get省略,@ExcelProperty注解中的value就是表頭的信息,index是在第幾列,沒有加注解的不會導出。
public class OrderExcelBO extends BaseRowModel { @ExcelProperty(value = {"訂單ID"}, index = 0) private String id; /** * 訂單描述 */ @ExcelProperty(value = {"訂單描述"}, index = 2) private String description; /** * 訂單對應產品id */ @ExcelProperty(value = {"產品ID"}, index = 2) private Integer productId; /** * 支付方式描述,如:apple pay */ @ExcelProperty(value = {"支付方式"}, index = 3) private String payMethod; /** * create_time */ @ExcelProperty(value = {"時間"}, index = 4) private String createTime; /** * update_time */ private String updateTime; /** * 產生訂單的用戶 */ @ExcelProperty(value = {"用戶ID"}, index = 5) private Integer userId; /** * 支付狀態:0 未支付、1支付成功支付完成、-1支付失敗 */ @ExcelProperty(value = {"支付狀態"}, index = 6) private String status; /** * 訂單來源描述,如:ios 安卓 */ @ExcelProperty(value = {"手機型號"}, index = 7) private String platform; /** * 訂單流水 */ @ExcelProperty(value = {"訂單流水號"}, index = 8) private String flowNum; /** * 訂單金額 */ @ExcelProperty(value = {"金額"}, index = 9) private BigDecimal price; // @ExcelProperty(value = {"收據字段"}, index = 10) private String receipt; @ExcelProperty(value = {"APP來源"}, index = 10) private String sources; }
導出的模板定義好之后,接下來就是一些封裝好的工具類的調用
查出我們需要導出的數據;
生成Excel文件名和sheet名稱;
直接調用封裝好的工具類導出文件即可;
我們來看下導出的效果
如果你的表頭比較復雜,那么根據需求,你也可自行定義,例如如下這種復雜的表頭,應該如何設置
首先要修改模板類,如果合并的單元格最大為2,那么所有的表格都需要設置為2,不合并的單元格用空字符串填充,需要合并的單元格將合并部分寫上相同的名稱,并且排列的序號要連續,不能分開。
我們來看下導出的效果,這樣就可以滿足我們平時開發需要的excel導出功能。簡單易上手。
工具類:
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList; import java.util.List; public class ExcelListener extends AnalysisEventListener { /** * 自定義用于暫時存儲data。 * 可以通過實例獲取該值 */ private List<Object> datas = new ArrayList<>(); /** * 通過 AnalysisContext 對象還可以獲取當前 sheet,當前行等數據 */ @Override public void invoke(Object object, AnalysisContext context) { //數據存儲到list,供批量處理,或后續自己業務邏輯處理。 datas.add(object); //根據業務自行 do something doSomething(); /* 如數據過大,可以進行定量分批處理 if(datas.size()<=100){ datas.add(object); }else { doSomething(); datas = new ArrayList<Object>(); } */ } /** * 根據業務自行實現該方法 */ private void doSomething() { } @Override public void doAfterAllAnalysed(AnalysisContext context) { /* datas.clear(); 解析結束銷毀不用的資源 */ } public List<Object> getDatas() { return datas; } public void setDatas(List<Object> datas) { this.datas = datas; } }
import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.BaseRowModel; import com.alibaba.excel.metadata.Font; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.TableStyle; import com.alibaba.excel.support.ExcelTypeEnum; import com.mochu.exception.ExcelException; import org.apache.poi.poifs.filesystem.FileMagic; import org.apache.poi.ss.usermodel.IndexedColors; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; public class ExcelUtil { /** * 讀取 Excel(多個 sheet) * * @param excel 文件 * @param rowModel 實體類映射,繼承 BaseRowModel 類 * @return Excel 數據 list */ public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel) { ExcelListener excelListener = new ExcelListener(); ExcelReader reader = getReader(excel, excelListener); if (reader == null) { return null; } for (Sheet sheet : reader.getSheets()) { if (rowModel != null) { sheet.setClazz(rowModel.getClass()); } reader.read(sheet); } return excelListener.getDatas(); } /** * 讀取某個 sheet 的 Excel * * @param excel 文件 * @param rowModel 實體類映射,繼承 BaseRowModel 類 * @param sheetNo sheet 的序號 從1開始 * @return Excel 數據 list */ public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo) { return readExcel(excel, rowModel, sheetNo, 1); } /** * 讀取某個 sheet 的 Excel * * @param excel 文件 * @param rowModel 實體類映射,繼承 BaseRowModel 類 * @param sheetNo sheet 的序號 從1開始 * @param headLineNum 表頭行數,默認為1 * @return Excel 數據 list */ public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo, int headLineNum) { ExcelListener excelListener = new ExcelListener(); ExcelReader reader = getReader(excel, excelListener); if (reader == null) { return null; } reader.read(new Sheet(sheetNo, headLineNum, rowModel.getClass())); return excelListener.getDatas(); } /** * 導出 Excel :一個 sheet,帶表頭 * * @param response HttpServletResponse * @param list 數據 list,每個元素為一個 BaseRowModel * @param fileName 導出的文件名 * @param sheetName 導入文件的 sheet 名 * @param object 映射實體類,Excel 模型 */ public static void writeExcel(HttpServletResponse response, List<? extends BaseRowModel> list, String fileName, String sheetName, BaseRowModel object) { ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX); Sheet sheet = new Sheet(1, 0, object.getClass()); sheet.setSheetName(sheetName); TableStyle tableStyle = new TableStyle(); tableStyle.setTableContentBackGroundColor(IndexedColors.WHITE); Font font = new Font(); font.setFontHeightInPoints((short) 9); tableStyle.setTableHeadFont(font); tableStyle.setTableContentFont(font); sheet.setTableStyle(tableStyle); writer.write(list, sheet); writer.finish(); } /** * 導出 Excel :多個 sheet,帶表頭 * * @param response HttpServletResponse * @param list 數據 list,每個元素為一個 BaseRowModel * @param fileName 導出的文件名 * @param sheetName 導入文件的 sheet 名 * @param object 映射實體類,Excel 模型 */ public static ExcelWriterFactory writeExcelWithSheets(HttpServletResponse response, List<? extends BaseRowModel> list, String fileName, String sheetName, BaseRowModel object) { ExcelWriterFactory writer = new ExcelWriterFactory(getOutputStream(fileName, response), ExcelTypeEnum.XLSX); Sheet sheet = new Sheet(1, 0, object.getClass()); sheet.setSheetName(sheetName); sheet.setTableStyle(getTableStyle()); writer.write(list, sheet); return writer; } /** * 導出融資還款情況表 * * @param response * @param list * @param fileName * @param sheetName * @param object */ public static void writeFinanceRepayment(HttpServletResponse response, List<? extends BaseRowModel> list, String fileName, String sheetName, BaseRowModel object) { ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX); Sheet sheet = new Sheet(1, 0, object.getClass()); sheet.setSheetName(sheetName); sheet.setTableStyle(getTableStyle()); writer.write(list, sheet); for (int i = 1; i <= list.size(); i += 4) { writer.merge(i, i + 3, 0, 0); writer.merge(i, i + 3, 1, 1); } writer.finish(); } /** * 導出文件時為Writer生成OutputStream */ private static OutputStream getOutputStream(String fileName, HttpServletResponse response) { //創建本地文件 fileName = fileName + ".xls"; try { fileName = new String(fileName.getBytes(), "ISO-8859-1"); response.addHeader("Content-Disposition", "filename=">
import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.BaseRowModel; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.support.ExcelTypeEnum; import java.io.IOException; import java.io.OutputStream; import java.util.List; public class ExcelWriterFactory extends ExcelWriter { private OutputStream outputStream; private int sheetNo = 1; public ExcelWriterFactory(OutputStream outputStream, ExcelTypeEnum typeEnum) { super(outputStream, typeEnum); this.outputStream = outputStream; } public ExcelWriterFactory write(List<? extends BaseRowModel> list, String sheetName, BaseRowModel object) { this.sheetNo++; try { Sheet sheet = new Sheet(sheetNo, 0, object.getClass()); sheet.setSheetName(sheetName); this.write(list, sheet); } catch(Exception ex) { ex.printStackTrace(); try { outputStream.flush(); } catch(IOException e) { e.printStackTrace(); } } return this; } @Override public void finish() { super.finish(); try { outputStream.flush(); } catch(IOException e) { e.printStackTrace(); } } }
看完上述內容,你們對SpringBoot中怎么利用easyexcel導出Excel有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。