springboot EasyExcel 實現導入導出

1. 添加依賴

確保 Maven 依賴中包含 EasyExcel 3.0.5:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

確保代碼與 EasyExcel 3.0.5 及依賴的 POI 版本兼容

2. 自定義樣式處理器

創建?CustomCellStyleHandler?類實現?CellWriteHandler?接口,處理標題和內容的樣式:

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.util.BooleanUtils;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Component;import java.util.List;@Component
public class CustomCellStyleHandler implements CellWriteHandler {private CellStyle titleStyle;private CellStyle contentStyle;private void initStyles(Workbook workbook) {if (titleStyle == null) {// 標題樣式titleStyle = workbook.createCellStyle();Font titleFont = workbook.createFont();titleFont.setBold(true); // 加粗titleFont.setFontHeightInPoints((short) 14); // 字體大小titleStyle.setFont(titleFont);titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);titleStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 背景色}if (contentStyle == null) {// 內容樣式contentStyle = workbook.createCellStyle();Font contentFont = workbook.createFont();contentFont.setFontHeightInPoints((short) 12);contentStyle.setFont(contentFont);contentStyle.setAlignment(HorizontalAlignment.CENTER);contentStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中contentStyle.setBorderTop(BorderStyle.THIN); // 細邊框contentStyle.setBorderBottom(BorderStyle.THIN);contentStyle.setBorderLeft(BorderStyle.THIN);contentStyle.setBorderRight(BorderStyle.THIN);}}@Overridepublic void afterCellDispose(CellWriteHandlerContext context) {// 拿到poi的workbookWorkbook workbook = context.getWriteWorkbookHolder().getWorkbook();initStyles(workbook);// 當前事件會在 數據設置到poi的cell里面才會回調// 判斷不是頭的情況 如果是fill 的情況 這里會==null 所以用not trueif (BooleanUtils.isNotTrue(context.getHead())) {Cell cell = context.getCell();if (cell != null) {cell.setCellStyle(contentStyle);}// 這里要把 WriteCellData的樣式清空, 不然后面還有一個攔截器 FillStyleCellWriteHandler 默認會將 WriteCellStyle 設置到// cell里面去 會導致自己設置的不一樣context.getFirstCellData().setWriteCellStyle(null);}}
}

3. 使用處理器導出數據

在寫入 Excel 時注冊自定義處理器:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.hieasy.e3.common.excel.CustomCellStyleHandler;import java.util.ArrayList;
import java.util.List;public class ExcelWriter {public static void main(String[] args) {String fileName = "custom_style_example.xlsx";List<DemoData> dataList = new ArrayList<>();dataList.add(new DemoData("Alice", 30));dataList.add(new DemoData("Bob", 28));EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new CustomCellStyleHandler()).sheet("用戶信息").doWrite(dataList);}
}// 數據模型類
class DemoData {@ExcelProperty("姓名")private String name;@ExcelProperty("年齡")private Integer age;public DemoData(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
@ApiOperation("一鍵導入")@PostMapping("/import")@ResponseBodypublic R<String> importExcel(@RequestPart MultipartFile file) throws IOException {try {//獲取文件的輸入流InputStream inputStream = file.getInputStream();List<ApiSyncLog> lst = EasyExcel.read(inputStream) //調用read方法.head(ApiSyncLog.class) //對應導入的實體類.sheet(0) //導入數據的sheet頁編號,0代表第一個sheet頁,如果不填,則會導入所有sheet頁的數據.headRowNumber(1) //列表頭行數,1代表列表頭有1行,第二行開始為數據行.doReadSync(); //開始讀Excel,返回一個List<T>集合,繼續后續入庫操作//模擬導入數據庫操作for (ApiSyncLog log1:lst){System.out.println(log1.toString());}}catch (IOException exception){throw new  RuntimeException(exception);}return R.ok("Success");}@ApiOperation("一鍵導出")@GetMapping("/export")public void downloadExcel(HttpServletResponse response) throws IOException {// 設置響應頭信息response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("日志文件", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//        List<ApiSyncLog> data = new ArrayList<>();// 準備數據List<ApiSyncLog> data = apiSyncLogMapper.selectList(new QueryWrapper<ApiSyncLog>().eq("BillName", "my_jmmd"));// 寫入數據到輸出流EasyExcel.write(response.getOutputStream(), ApiSyncLog.class).registerWriteHandler(new CustomCellStyleHandler()).sheet("Sheet1").doWrite(data);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72465.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現懸浮按鈕拖動,兼容h5和微信小程序

h5用js寫&#xff0c;微信小程序用 代碼里面沒有完全實現吸附邊緣的功能&#xff0c;需要吸附邊緣的話還得自己再完善下&#xff08;h5的吸附邊緣是可以的&#xff0c;小程序的還有點問題&#xff09; 主要功能是&#xff1a;圖片上寫文字的懸浮按鈕&#xff0c;文字使用的是…

2、操作系統之軟件基礎

一、硬件支持系統 &#xff0c;系統管理硬件 操作系統核心功能可以分為&#xff1a; 守護者&#xff1a;對硬件和軟件資源的管理協調者&#xff1a;通過機制&#xff0c;將各種各樣的硬件資源適配給軟件使用。 所以為了更好的管理硬件&#xff0c;操作系統引進了軟件。其中3大…

17 | 實現簡潔架構的 Biz 層

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

idea更新git代碼報錯No Git Roots

idea更新git代碼報錯&#xff1a; No Git Roots None of configured Git roots are under Git. The configured directory must have ".git directory in it.但是本地項目里是存在.git文件的&#xff0c;就是突然間不能更新代碼了 然后嘗試重新拉新項目代碼提示: Git i…

Webpack 知識點整理

? 1. 對 webpack 的理解&#xff1f;解決了什么問題&#xff1f; Webpack 是前端工程化領域的核心工具&#xff0c;其核心定位是模塊打包器&#xff08;Module Bundler&#xff09;&#xff0c;通過將各類資源&#xff08;JS、CSS、圖片等&#xff09;視為模塊并進行智能整合…

[Hello-CTF]RCE-Labs超詳細WP-Level13Level14(PHP下的0/1構造RCE命令簡單的字數限制RCE)

Level 13 源碼分析 這題又回到了 PHP重點關注preg_match("/[A-Za-z0-9\"%*,-.\/:;>?[\]^|]/", $cmd)禁用了所有數字, 并且回到了 PHP, 沒辦法用上一關的方法進行繞過但是比起上一關, 給我們少繞過了 &, ~, _似乎有其他方法 解題分析 利用 $(()) 和 …

Qt 控件概述 QWdiget 1.1

目錄 qrc機制 qrc使用 1.在項目中創建一個 qrc 文件 2.將圖片導入到qrc文件中 windowOpacity&#xff1a; cursor 光標 cursor類型 自定義Cursor font tooltip focusPolicy styleSheet qrc機制 之前提到使用相對路徑的方法來存放資源&#xff0c;還有一種更好的方式…

【eNSP實戰】將路由器配置為DHCP服務器

拓圖 要求&#xff1a; 為 office100 和 office200 分別配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上創建office100地址池 [AR1…

數據結構——順序表seqlist

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介紹了數據結構——順序表部分的內容 目錄 一、線性表的定義 二、線性表的基本操作 三.順序表 1.定義 2. 存儲結構 3. 特點 四 順序表操作 4.1初始化 4.2 插入 4.2.1頭插 4.2.2 尾插 4.2.3 按位置插 4.3 …

OSPF | LSDB 鏈路狀態數據庫 / SPF 算法 / 實驗

注&#xff1a;本文為 “OSPF | LSDB / SPF ” 相關文章合輯。 LSDB 和 SPF 算法 瀟湘浪子的蹋馬骨湯 發布 2019-02-15 23:58:46 1. 鏈路狀態數據庫 (LSDB) 鏈路狀態協議除了執行洪泛擴散鏈路狀態通告&#xff08;LSA&#xff09;以及發現鄰居等任務外&#xff0c;其第三個任…

前端---CSS(前端三劍客)

1.基本語法規范 選擇器 {?條/N條聲明} ? 選擇器決定針對誰修改 (找誰) ? 聲明決定修改啥. (?啥) ? 聲明的屬性是鍵值對. 使? ; 區分鍵值對, 使? : 區分鍵和值 比如&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta…

【C++】 —— 筆試刷題day_6

刷題day_6&#xff0c;繼續加油哇&#xff01; 今天這三道題全是高精度算法 一、大數加法 題目鏈接&#xff1a;大數加法 題目解析與解題思路 OK&#xff0c;這道題題目描述很簡單&#xff0c;就是給我們兩個字符串形式的數字&#xff0c;讓我們計算這兩個數字的和 看題目我…

todolist docker 小工具

參考鏈接 前排提示 沒有中文&#xff0c;可使用瀏覽器 翻譯 前提 安裝docker安裝docker-compose 下載倉庫 git clone https://github.com/JordanKnott/taskcafe進行安裝 cd taskcafe docker-compose -p taskcafe up -d服務啟動后會監聽在 3333 端口上&#xff0c;通過瀏覽器…

Unity--GPT-SoVITS接入、處理GPTAPI的SSE響應流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;兩者對模型文件具有兼容&#xff09; 點擊后 會進入新的游覽器網頁 ----- 看了一圈&#xff0c;發現主要問題集中在模型的訓練很需要CPU&#xff0c;也就是模型的制作上&#xff0c;問題很多&#xff0c;如果有現有…

《TypeScript 快速上手:類型、編譯與嚴格模式的簡明教程》

一、TypeScript介紹 在引入編程社區 20 多年后&#xff0c;JavaScript 現在已成為有史以來應用最廣泛的跨平臺語言之一。JavaScript 最初是一種用于向網頁添加微不足道的交互性的小型腳本語言&#xff0c;現已發展成為各種規模的前端和后端應 用程序的首選語言。雖然用 JavaSc…

ROS2 系統架構

1.操作系統層 ros2是基于Linux、Windows、macOS系統建立的&#xff0c;這一層為ros2提供了各種基礎的硬件驅動&#xff0c;比如網卡驅動&#xff0c;常用USB驅動和常用攝像頭驅動等。 2.DDS實現層 ros2的核心通信是采用第三方的通信組件來實現的&#xff0c;這個第三方就是數…

【HTML】二、列表、表格

文章目錄 1、列表1.1 無序列表1.2 有序列表1.3 定義列表 2、表格2.1 定義2.2 表格結構標簽2.3 合并單元格 1、列表 列表分為&#xff1a; 無序列表有序列表定義列表&#xff1a;一個標題下有多個小分類 1.1 無序列表 ul嵌套li&#xff0c;ul是無序列表&#xff0c;li是列表…

redis zset基本介紹以及底層實現

ZSet&#xff08;Sorted Set&#xff09;有序集合 介紹 Redis 中的有序集合(Sorted Set)是在集合(Set)的基礎上,為每個成員關聯了一個分數(score)。這個分數可以用來對集合中的成員進行排序。 有序集合保留了集合不能有重復成員的特性&#xff08;成員不能重復&#xff0c;分值…

政策助力,3C 數碼行業數字化起航

政策引領&#xff0c;數字經濟浪潮來襲 在當今時代&#xff0c;數字經濟已成為全球經濟發展的核心驅動力&#xff0c;引領著新一輪科技革命和產業變革的潮流。我國深刻洞察這一發展趨勢&#xff0c;大力推進數字化經濟發展戰略&#xff0c;為經濟的高質量發展注入了強大動力。 …

IntelliJ IDEA 快捷鍵系列:重命名快捷鍵詳解

目錄 引言一、默認重命名快捷鍵1. Windows 系統?2. Mac 系統? 二、操作步驟與技巧1. 精準選擇重命名范圍?2. 智能過濾無關內容? 三、總結 引言 在代碼重構中&#xff0c;?重命名變量、類、方法? 是最常用的操作之一。正確使用快捷鍵可以極大提升開發效率。本文針對 ?Ma…