Java整合EasyExcel實戰——3(上下列相同合并單元格策略)

參考:https://juejin.cn/post/7322156759443095561?searchId=202405262043517631094B7CCB463FDA06icon-default.png?t=N7T8https://juejin.cn/post/7322156759443095561?searchId=202405262043517631094B7CCB463FDA06

準備條件

依賴

        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency>

工具類

package co.yixiang.exam.listener;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;public class ExcelFillCellMergeStrategy implements CellWriteHandler {private int[] mergeColumnIndex;private int mergeRowIndex;public ExcelFillCellMergeStrategy() {}public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {this.mergeRowIndex = mergeRowIndex;this.mergeColumnIndex = mergeColumnIndex;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {//當前行int curRowIndex = cell.getRowIndex();//當前列int curColIndex = cell.getColumnIndex();if (curRowIndex > mergeRowIndex) {for (int i = 0; i < mergeColumnIndex.length; i++) {if (curColIndex == mergeColumnIndex[i]) {mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);break;}}}}/*** 當前單元格向上合并** @param writeSheetHolder* @param cell             當前單元格* @param curRowIndex      當前行* @param curColIndex      當前列*/private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {//獲取當前行的當前列的數據和上一行的當前列列數據,通過上一行數據是否相同進行合并Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();// 比較當前行的第一列的單元格與上一行是否相同,相同合并當前單元格與上一行//if (curData.equals(preData)) {Sheet sheet = writeSheetHolder.getSheet();List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();boolean isMerged = false;for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {CellRangeAddress cellRangeAddr = mergeRegions.get(i);// 若上一個單元格已經被合并,則先移出原有的合并單元,再重新添加合并單元if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {sheet.removeMergedRegion(i);cellRangeAddr.setLastRow(curRowIndex);sheet.addMergedRegion(cellRangeAddr);isMerged = true;}}// 若上一個單元格未被合并,則新增合并單元if (!isMerged) {CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);sheet.addMergedRegion(cellRangeAddress);}}}}

ServiceImpl層應用

sql 數據的重復數據,合并單元格

SELECTeq.id,eq.question_title,eo.options_content,eq.options_correct,eq.question_answer,eq.question_score,eq.question_subject,eq.question_title_zi,eq.question_type
FROMex_question eq
LEFT JOINex_options eoon eq.id = eo.question_id where eq.is_del = 0 and eo.is_del = 0;
    @Overridepublic R exportExQuestionOptions(HttpServletResponse response) throws IOException {// 定義導出的Excel文件名String fileName = "test.xlsx";// 設置響應的內容類型為二進制流,這是文件下載的標準設置response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);// 設置響應頭的Content-Disposition,使用"attachment"指示瀏覽器這是一個需要下載的文件response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()));// 查詢需要導出的數據 (包含復雜數據)List<ExExcelQuestionOptionsDto> questionsOptionsAll = exQuestionMapper.getQuestionsOptionsAll();// 假設我們要合并第1行和第2列到第4列的數據(索引從0開始)int mergeRowIndex = 0; // 行索引 int[] mergeColumnIndex = new int[]{0,1,2,3,4,5,6}; // 列索引數組 要合并的列ExcelFillCellMergeStrategy excelFillCellMergeStrategy = new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumnIndex);EasyExcel.write(response.getOutputStream(), ExExcelQuestionOptionsDto.class).registerWriteHandler(excelFillCellMergeStrategy).sheet("測試").doWrite(questionsOptionsAll);return R.success();}

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

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

相關文章

鄰接矩陣廣度優先遍歷

關于圖的遍歷實際上就兩種 廣度優先和深度優先&#xff0c;一般關于圖的遍歷都是基于鄰接矩陣的&#xff0c;考試這些&#xff0c;用的也是鄰接矩陣。 本篇文章先介紹廣度優先遍歷的原理&#xff0c;和代碼實現 什么是圖的廣度優先遍歷&#xff1f; 這其實和二叉樹的層序遍…

新人學習筆記之(數組1)

一、數組的概念 1.數組&#xff08;Array&#xff09;可以把一組相關的數據一起存放&#xff0c;并提供方便的訪問&#xff08;獲取&#xff09;方式 2.數組是指一組數據的集合&#xff0c;其中的每個數據被稱作元素&#xff0c;在數組中可以存放任意類型的元素&#xff0c;數組…

數據結構——二叉樹的基本應用

在此之前我們已經初步了解了二叉樹&#xff0c;在介紹堆的基本應用時&#xff0c;我們已經具體介紹了完全二叉樹的基本應用&#xff0c;本章我們介紹二叉樹的基本應用&#xff0c;這個不止指的是完全二叉樹&#xff0c;而是指泛型的二叉樹。 二叉樹的基本應用&#xff0c;由于…

代碼隨想錄算法訓練營第54天|● 392.判斷子序列 ● 115.不同的子序列

392. 判斷子序列 這個微軟面試的時候考過 雙指針就行 編輯距離入門題&#xff1a; 思路是一樣的 相同字符1 否則從前面順下來 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp[[0]*(len(t)1) for _ in range(len(s)1)]for i in range(1,len(s)1):f…

aspose-*的使用

文章目錄 aspose-*一、依賴--maven二、需求1、word------>pdf2、doc------>docx2、xls------>xlsx aspose-* 一、依賴–maven 備注&#xff1a;第三方的jar包可以從資源中下載&#xff0c;有上傳的 <!--aspose依賴--><dependency><groupId>aspose…

刷代碼隨想錄有感(81):貪心算法——分發餅干

題干&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index s.size() - 1;int res 0;for(int i g.size() - 1; i > 0; i--){if(index >…

GitLab項目中添加用戶,并設置其角色權限等

注意&#xff1a;創建用戶(new user)&#xff0c;創建完用戶然后再項目邀請用戶&#xff0c;選擇創建過的用戶 一、以管理員身份登錄GitLab的WebUI并創建用戶 1>.使用管理員登錄GitLab 使用管理員(root)用戶登錄成功后&#xff0c;點擊如下圖所示的小扳手&#xff0c;點擊…

java 反射的用法

下面是一個簡單的Java反射示例&#xff0c;演示了如何使用反射機制獲取類的信息并調用其方法&#xff1a; import java.lang.reflect.Method;class MyClass {private String name;public void setName(String name) {this.name name;}public String getName() {return name;}…

C++數據結構之:鏈List

摘要&#xff1a; it人員無論是使用哪種高級語言開發東東&#xff0c;想要更高效有層次的開發程序的話都躲不開三件套&#xff1a;數據結構&#xff0c;算法和設計模式。數據結構是相互之間存在一種或多種特定關系的數據元素的集合&#xff0c;即帶“結構”的數據元素的集合&am…

在HTML和CSS當中運用顯示隱藏

1.顯示與隱藏 盒子顯示:display:block;盒子隱藏: display:none:隱藏該元素并且該元素所占的空間也不存在了。 visibility:hidden:隱藏該元素但是該元素所占的內存空間還存在&#xff0c;即“隱身效果”。 2.圓角邊框 在CSS2中添加圓角&#xff0c;我們不得不使用背景圖像&am…

學習筆記——數據通信基礎——數據通信網絡(網絡工程師)

網絡工程師 網絡工程&#xff0c;就是圍繞著網絡進行的一系列的活動&#xff0c;包括∶網絡規劃、設計、實施、調試、排錯等。網絡工程設計的知識領域很寬廣&#xff0c;其中路由和交換是計算機網絡的基本。 網絡工程師∶是在網絡工程領域&#xff0c;掌握專業的網絡技術&…

散戶如何參與期權交易?

期權就是股票&#xff0c;唯一區別標的物上證指數&#xff0c;會看大盤吧&#xff0c;期權交易兩個方向認購做多&#xff0c;認沽做空&#xff0c;雙向t0交易沒了&#xff0c;期權交易跟期貨一樣&#xff0c;對的&#xff0c;玩的也是合約&#xff0c;唯一區別沒有保證金不會爆…

軍工行業運維解決方案

一、引言 隨著軍工行業的快速發展&#xff0c;信息化建設已成為提高作戰效能、保障信息安全的重要支撐。然而&#xff0c;軍工行業面臨著多戰區、跨區域、多陣地、多數據中心的復雜運維挑戰。為了滿足這些挑戰&#xff0c;我們提出了一套基于美信時代的軍工行業運維解決方案&am…

127.0.0.1 和 localhost 以及 0.0.0.0 區別

之前用 nginx 的時候&#xff0c;發現用這幾個 IP&#xff0c;都能正常訪問到 nginx 的歡迎網頁。一度認為這幾個 IP 都是一樣的。 但本質上還是有些區別的。 首先 localhost 就不叫 IP&#xff0c;它是一個域名&#xff0c;就跟 "baidu.com",是一個形式的東西&…

什么是Redis腦裂,如何解決呢

Redis 腦裂問題是指&#xff0c;在 Redis 哨兵模式或集群模式中&#xff0c;由于網絡原因&#xff0c;導致主節點&#xff08;Master&#xff09;與哨兵&#xff08;Sentinel&#xff09;和從節點&#xff08;Slave&#xff09;的通訊中斷&#xff0c;此時哨兵就會誤以為主節點…

方均根為什么等于有效值

方均根值&#xff08;Root Mean Square&#xff0c;簡稱RMS&#xff09;等于有效值&#xff0c;是因為這種計算方法能夠準確地反映周期性波動量&#xff08;如交流電、振動等&#xff09;的平均能量或做功能力。對于交流電而言&#xff0c;其瞬時值隨時間變化&#xff0c;直接取…

IdentiFace——多模態人臉識別系統,可捕捉從情緒到性別的所有信息及其潛力

1. 概述 面部識別系統的開發極大地推動了計算機視覺領域的發展。如今&#xff0c;人們正在積極開發多模態系統&#xff0c;將多種生物識別特征高效、有效地結合起來。 本文介紹了一種名為 IdentiFace 的多模態人臉識別系統。該系統利用基于 VGG-16 架構的模型&#xff0c;將人…

【NumPy】NumPy線性代數模塊詳解:掌握numpy.linalg的核心功能

&#x1f9d1; 博主簡介&#xff1a;阿里巴巴嵌入式技術專家&#xff0c;深耕嵌入式人工智能領域&#xff0c;具備多年的嵌入式硬件產品研發管理經驗。 &#x1f4d2; 博客介紹&#xff1a;分享嵌入式開發領域的相關知識、經驗、思考和感悟&#xff0c;歡迎關注。提供嵌入式方向…

多年期貨盈利的秘訣就是虧了就跑

不怎么看消息面&#xff0c;尤其期貨&#xff0c;外匯。 正大招主賬戶&#xff1a;歐美4恒指26小恒12 歡迎咨詢代理 詳YJCFPL 堅持學習&#xff0c;吸收別人的經驗&#xff0c;為我所用。 獨立思考&#xff0c;培養良好的生活習慣。 我能活到現在的秘訣就是&#xff1a;虧了就趕…

Hexo最新實戰:(一)Hexo7.0+GitHub Pages博客搭建

前言 很多平臺都能寫博客還有創作激勵&#xff0c;為什么我又要搭一個&#xff1f;為什么這次要選擇用Hexo框架&#xff1f; 對應的原因是流量自由和省錢&#xff0c;第一個&#xff0c;很多平臺能寫但不是都有收益&#xff0c;而且平臺有自身的規則&#xff0c;比如會屏蔽一…