cn.hutool.poi.excel 實現excel導出效果 首行高度,行樣式,顏色,合并單元格,例子樣式

需求

接了需求,下載excel模版,本來看著還是簡單的,然后實現起來一把淚,首先是使用poi,我查了好久,才實現,然后是我用easyexcel又實現了一遍,用了一個周多才實現。
在這里插入圖片描述
這是需求,第一行是一個多行文本,紅色,第二行一個合并單元格題目,第三行是一個多單元格標題,第四行是一個例子,紅色。

實現

@Operation(summary = "人員維護模版下載", description = "人員維護模版下載")@PostMapping("persondowntemplate")public void personDownTemplate(HttpServletResponse response) {ExcelWriter writer = ExcelUtil.getWriter(true);//主標題String note = "1.前四行數據,系統不讀取,不需要刪除\n" +"2.約束區縣,請輸入約束的部門或者區縣或者地市\n" +"3.約束崗位族的值列表,請參考第二個Sheet2,多個崗位族,請使用英文逗號隔開\n" +"4.日期格式:yyyy-mm-dd\n" +"5.下拉數據的值,不允許輸入下拉值以外的數據";// 創建總標題行List<String> totalHeader1 = Lists.newArrayList();totalHeader1.add(note);writer.writeHeadRow(totalHeader1); // 寫入總標題行,使用默認樣式short headerRowHeight = 80 * 20; // 設置行高為30磅Sheet sheet = writer.getSheet();//因為是多行所以要自己控制行高sheet.getRow(0).setHeight(headerRowHeight);// 創建樣式,建立每一行的樣式CellStyle cellStyle1 = createRedRightAlignedCellStyle(writer.getWorkbook());Row row1 = sheet.getRow(0);Cell cell = row1.getCell(0);cell.setCellStyle(cellStyle1);// 創建總標題行List<String> totalHeader = Lists.newArrayList();totalHeader.add("人員契約化管理導入");writer.writeHeadRow(totalHeader); // 寫入總標題行// 創建樣式CellStyle cellStyle2 = createRedRightAlignedCellStyle2(writer.getWorkbook());Row row2 = sheet.getRow(1);Cell cell1 = row2.getCell(0);cell1.setCellStyle(cellStyle2);List<String> header = Lists.newArrayList();header.add("組織名稱");header.add("* 員工編號");header.add("加入本企業途徑");header.add("是否啟用約束區縣");header.add("約束區縣");header.add("約束區縣開始日期");header.add("約束區縣結束日期");header.add("是否啟用約束崗位族");header.add("約束崗位族");header.add("約束崗位族開始日期");header.add("約束崗位族結束日期");int mergeRowIndex = 0; // 總標題所在行索引int mergeColumnStartIndex = 0; // 起始列索引int mergeColumnEndIndex = header.size() - 1; // 結束列索引//其實上面的這些索引沒啥用,下面幾行是合并某幾行的單元格CellRangeAddress cellRangeAddress = new CellRangeAddress(mergeRowIndex, mergeRowIndex, mergeColumnStartIndex, mergeColumnEndIndex);sheet.addMergedRegion(cellRangeAddress);CellRangeAddress cellRangeAddress1 = new CellRangeAddress(1, 1, mergeColumnStartIndex, mergeColumnEndIndex);sheet.addMergedRegion(cellRangeAddress1);writer.writeHeadRow(header); // 寫入頭部標題//建立新的sheetwriter.renameSheet(0, "人員維護");StyleSet styleSet = writer.getStyleSet();//實話說這一塊是直接抄的別的,你說有用處吧,可能也有,你說沒用吧,可能也沒有for (int i = 0; i < 11; i++) {CellStyle cellStyle = writer.createColumnStyle(i);DataFormat format = writer.getWorkbook().createDataFormat();cellStyle.setDataFormat(format.getFormat("@"));writer.setStyleSet(styleSet);}//實話說這一塊好像是也沒生效for (int i = 0; i < header.size(); i++) {int headerLength = header.get(i).length(); // 獲取列名長度int cellWidth = headerLength * 500; // 將字符長度轉換為列寬單位// 如果內容比默認寬度要寬,則使用內容寬度;否則使用默認寬度int defaultWidth = 24 * 256; // 默認寬度int columnWidth = Math.max(cellWidth, defaultWidth);sheet.setColumnWidth(i, columnWidth); // 設置列寬}//這是列表下面的示例行List<Map<String, Object>> dataList = new ArrayList<>();Map<String, Object> dataRow = new HashMap <>();dataRow.put("組織名稱", "請參考hr標準組織名稱");dataRow.put("* 員工編號", "0000001");dataRow.put("加入本企業途徑", "社會招聘");dataRow.put("是否啟用約束區縣", "是");dataRow.put("約束區縣", "泰安市分公司管理層");dataRow.put("約束區縣開始日期", "2024-04-11");dataRow.put("約束區縣結束日期", "2024-06-11");dataRow.put("是否啟用約束崗位族", "是");dataRow.put("約束崗位族", "基層組織建設與黨員教育管理");dataRow.put("約束崗位族開始日期", "2024-04-11");dataRow.put("約束崗位族結束日期", "2024-06-11");dataList.add(dataRow);writer.write(dataList, false);for (int i = 0; i < header.size(); i++) {// 創建樣式CellStyle cellStyle4 = createRedRightAlignedCellStyle3(writer.getWorkbook());Row row4 = sheet.getRow(3);Cell cell4 = row4.getCell(i);cell4.setCellStyle(cellStyle4);// 創建樣式CellStyle cellStyle5 = createRedRightAlignedCellStyle5(writer.getWorkbook());Row row5 = sheet.getRow(2);Cell cell5 = row5.getCell(i);cell5.setCellStyle(cellStyle5);}//這個是用來寫下拉的,不同的下拉的,setXSSFValidation(sheet);// 創建樣式CellStyle cellStyle3 = createRedRightAlignedCellStyle2(writer.getWorkbook());Row row3 = sheet.getRow(2);Cell cell3 = row3.getCell(0);cell3.setCellStyle(cellStyle3);//創建新的sheetwriter.setSheet("Sheet2");List<String> header1 = Lists.newArrayList();header1.add("崗位族信息");writer.writeHeadRow(header1);List<Map<String,Object>> personnelContractManagementList = personnelContractManagementMapper.jobFamilyList();List<String> personnelContractManagementSheet = new ArrayList<>();for (int i = 0; i < personnelContractManagementList.size(); i++) {personnelContractManagementSheet.add(String.valueOf(personnelContractManagementList.get(i).get("ZHUANYE")));}writer.write(personnelContractManagementSheet, true);setSizeColumn(writer.getSheet());response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=人員維護導入模板.xlsx");ServletOutputStream out = null;try {out = response.getOutputStream();writer.flush(out, true);out.close();} catch (IOException e) {throw new RuntimeException(e);} finally {writer.close();}}
private static CellStyle createRedRightAlignedCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);Font font = workbook.createFont();font.setColor(IndexedColors.RED.getIndex());cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.LEFT);return cellStyle;}private static CellStyle createRedRightAlignedCellStyle2(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}private static CellStyle createRedRightAlignedCellStyle3(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);Font font = workbook.createFont();font.setColor(IndexedColors.RED.getIndex());cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}private static CellStyle createRedRightAlignedCellStyle5(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}
 /**** @param sheet* @return*/private static Sheet setXSSFValidation(Sheet sheet){String onelist[] = {"是","否"};String joinEnterpriseWay[] = {"校園招聘","社會招聘","接收復轉軍人","成建制劃轉","勞務派遣"};Workbook workbook = sheet.getWorkbook();/*** 創建一個名稱為hidden的sheet頁,用于是否啟用約束區縣*/Sheet hidden = workbook.createSheet("hidden");Cell cell = null;for (int i = 0, length = onelist.length; i < length; i++){String name = onelist[i];Row roww = hidden.createRow(i);cell = roww.createCell(0);cell.setCellValue(name);}Name namedCell = workbook.createName();namedCell.setNameName("hidden");namedCell.setRefersToFormula("hidden!$A$1:$A$" + onelist.length);//將第二個sheet頁設置為隱藏workbook.setSheetHidden(1, true);XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);//將名稱為hidden的數據進行加載XSSFDataValidationConstraint constraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint("hidden");//設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列CellRangeAddressList regions = new CellRangeAddressList(1, 1000, 3, 3);XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(constraint, regions);data_validation_list.setErrorStyle(XSSFDataValidation.ErrorStyle.STOP);data_validation_list.createErrorBox("提示", "不允許自己輸入,請選擇下拉框里的數據");sheet.addValidationData(data_validation_list);/*** 創建一個名稱為hidden的sheet頁,用于是否啟用約束區縣*/Sheet hidden1 = workbook.createSheet("hidden1");Cell cell1 = null;for (int i = 0, length = onelist.length; i < length; i++){String name1 = onelist[i];Row row1 = hidden1.createRow(i);cell1 = row1.createCell(0);cell1.setCellValue(name1);}Name namedCell1 = workbook.createName();namedCell1.setNameName("hidden1");namedCell1.setRefersToFormula("hidden1!$A$1:$A$" + onelist.length);//將第二個sheet頁設置為隱藏workbook.setSheetHidden(2, true);//將名稱為hidden的數據進行加載XSSFDataValidationConstraint constraint1 = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint("hidden1");//設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列CellRangeAddressList regions1 = new CellRangeAddressList(1, 1000, 7, 7);XSSFDataValidation data_validation_list1 = (XSSFDataValidation) dvHelper.createValidation(constraint1, regions1);data_validation_list1.setErrorStyle(XSSFDataValidation.ErrorStyle.STOP);data_validation_list1.createErrorBox("提示", "不允許自己輸入,請選擇下拉框里的數據");sheet.addValidationData(data_validation_list1);Sheet hidden2 = workbook.createSheet("hidden2");Cell cell2 = null;for (int i = 0; i < joinEnterpriseWay.length; i++) {String name = joinEnterpriseWay[i];Row row = hidden2.createRow(i);cell2 = row.createCell(0);cell2.setCellValue(name);}Name namedCell2 = workbook.createName();namedCell2.setNameName("hidden2");namedCell2.setRefersToFormula("hidden2!$A$1:$A$" + joinEnterpriseWay.length);//將第二個sheet頁設置為隱藏workbook.setSheetHidden(3, true);//將名稱為hidden的數據進行加載XSSFDataValidationConstraint constraint2 = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint("hidden2");//設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列CellRangeAddressList regions2 = new CellRangeAddressList(1, 1000, 2, 2);XSSFDataValidation data_validation_list2 = (XSSFDataValidation) dvHelper.createValidation(constraint2, regions2);data_validation_list2.setErrorStyle(XSSFDataValidation.ErrorStyle.STOP);data_validation_list2.createErrorBox("提示", "不允許自己輸入,請選擇下拉框里的數據");sheet.addValidationData(data_validation_list2);return sheet;}

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

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

相關文章

Python使用virtualenv創建虛擬環境

目錄 第一步&#xff1a;安裝virtualenv 第二步&#xff1a;選擇一個文件夾用來放所創建的虛擬環境 第三步&#xff1a;創建虛擬環境 第四步&#xff1a;激活虛擬環境 第五步&#xff1a;退出虛擬環境 第六步&#xff1a;測試安裝django 前提&#xff1a;你得有個python環…

【STL專題】深入探索C++之std::string:不止于字符串【萬字詳解】

歡迎來到CILMY23的博客 &#x1f3c6;本篇主題為&#xff1a;深入探索C之std::string&#xff1a;不止于字符串 &#x1f3c6;個人主頁&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列專欄&#xff1a;Python | C | C語言 | 數據結構與算法 | 貪心算法 | Linux &#x1f3…

IOS手機自動化一些工具的簡單有哪些?

iOS手機自動化測試或操作可以通過多種工具來實現&#xff0c;這些工具提供了豐富的功能&#xff0c;可以幫助開發者和測試人員提高效率。以下是一些簡單的iOS自動化工具&#xff1a; 1. Xcode: 蘋果官方提供的開發工具&#xff0c;包含了iOS應用開發、調試和自動化測試的功能。…

aardio - godking.vlistEx虛表點擊表頭全選、排序

新版虛表內置了名稱為 DefaultCheckedImg 和 DefaultUnCheckedImg 的兩張圖片&#xff0c;分別為 【選擇框勾選狀態默認圖片】 和 【選擇框未勾選狀態默認圖片】 以下代碼調用了這兩張圖片&#xff0c;所以請將虛表庫升級為最新版。 如果使用舊版庫&#xff0c;可以自行添加這…

【Python自動化測試】:Unittest單元測試與HTMLTestRunner自動生成測試用例的好幫手

讀者大大們好呀&#xff01;&#xff01;!?????? &#x1f525; 歡迎來到我的博客 &#x1f440;期待大大的關注哦?????? &#x1f680;歡迎收看我的主頁文章??尋至善的主頁 文章目錄 &#x1f525;前言&#x1f680;unittest編寫測試用例&#x1f680;unittest測…

六種常用設計模式

單例設計模式 單例模式指在整個系統生命周期里&#xff0c;保證一個類只能產生一個實例&#xff0c;確保該類的唯一性。 單例模式分類 單例模式可以分為懶漢式和餓漢式&#xff0c;兩者之間的區別在于創建實例的時間不同&#xff1a; 懶漢式&#xff1a;指系統運行中&#…

SpringBootWeb 篇-深入了解 Mybatis 刪除、新增、更新、查詢的基礎操作與 SQL 預編譯解決 SQL 注入問題

&#x1f525;博客主頁&#xff1a; 【小扳_-CSDN博客】 ?感謝大家點贊&#x1f44d;收藏?評論? 文章目錄 1.0 Mybatis 的基礎操作 2.0 基礎操作 - 環境準備 3.0 基礎操作 - 刪除操作 3.1 SQL 預編譯 3.2 SQL 預編譯的優勢 3.3 參數占位符 4.0 基礎操作 - 新增 4.1 主鍵返回…

Python圖像處理:從基礎到高級的全方位指南

目錄 第一部分&#xff1a;Python圖像處理基礎 1.1 圖像處理概念 1.2 Python圖像處理常用庫 1.3 實戰案例&#xff1a;圖像顯示與保存 1.4 注意事項 第二部分&#xff1a;Python圖像處理高級技巧 2.1 圖像變換 2.2 圖像增強 2.3 圖像復原 第三部分&#xff1a;Python…

esp32s3中ap與sta模式的wps配對問題

無線路由器中的WPS是Wi-Fi Protected Setup的簡稱&#xff0c;中文翻譯為Wi-Fi安全防護設置&#xff0c;它是由Wi-Fi安全聯盟推出的一種無線加密認證方式。主要是為了簡化無線局域網的安裝及安全性能配置工作&#xff0c;通過這種設置&#xff0c;讓無線連接更加方便和安全。省…

20232802 黃千里 2023-2024-2 《網絡攻防實踐》實踐十一報告

20232802 2023-2024-2 《網絡攻防實踐》實踐十一報告 1.實踐過程 1.1web瀏覽器滲透攻擊 攻擊機&#xff1a;kali172.20.10.10靶機&#xff1a;win2k172.20.10.3 首先在kali中啟動msfconsole 輸入命令search MS06-014&#xff0c;搜索滲透攻擊模塊 輸入use exploit/window…

終于讓我找到了,你也可以學會的人工智能-機器學習教程

給大家分享一套非常棒的python機器學習課程——《AI小天才&#xff1a;讓小學生輕松掌握機器學習》&#xff0c;2024年5月完結新課&#xff0c;提供配套的代碼筆記軟件包下載&#xff01;學完本課程&#xff0c;可以輕松掌握機器學習的全面應用&#xff0c;復雜特征工程&#x…

C# 跨線程訪問UI組件,serialPort1串口接收數據

在Windows應用程序&#xff08;例如WinForms或WPF&#xff09;中&#xff0c;UI組件&#xff08;如按鈕、文本框等&#xff09;都在主線程&#xff08;也稱為UI線程&#xff09;上運行。當你在一個非UI線程&#xff08;例如&#xff0c;一個后臺線程或者網絡請求線程&#xff0…

關于新配置的adb,設備管理器找不到此設備問題

上面頁面中一開始沒有找到此android設備&#xff0c; 可能是因為我重新配置的adb和設備驅動&#xff0c; 只把adb配置了環境變量&#xff0c;驅動沒有更新到電腦中&#xff0c; 點擊添加驅動&#xff0c; 選擇路徑&#xff0c;我安裝時都放在了SDK下面&#xff0c;可以嘗試…

SpringBoot 實現 RAS+AES 自動接口解密

一、講個事故 接口安全老生常談了 過年之前做了過一款飛機大戰的H5小游戲&#xff0c;里面無限模式-需要保存用戶的積分&#xff0c;因為使用的Body傳參&#xff0c;參數是可見的。 為了接口安全我&#xff0c;我和前端約定了傳遞參數是&#xff1a;用戶無限模式的積分“我們…

HTML靜態網頁成品作業(HTML+CSS)——魅族商城首頁網頁(1個頁面)

&#x1f389;不定期分享源碼&#xff0c;關注不丟失哦 文章目錄 一、作品介紹二、作品演示三、代碼目錄四、網站代碼HTML部分代碼 五、源碼獲取 一、作品介紹 &#x1f3f7;?本套采用HTMLCSS&#xff0c;未使用Javacsript代碼&#xff0c;共有1個頁面。 二、作品演示 三、代…

基于Python+OpenCV卷積神經網絡的字符識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 字符識別是計算機視覺和模式識別領域的一個重要應用&#xff0c;它在文檔數字化、車牌識別、驗…

gpt-4o考場安排

說明 &#xff1a;經過多次交互&#xff0c;前后花了幾個小時&#xff0c;總算完成了基本功能。如果做到按不同層次分配考場&#xff0c;一鍵出打印結果就完美了。如果不想看中間“艱苦”的過程&#xff0c;請直接跳到“最后結果”及“食用方法”。中間過程還省略了一部分交互&…

Android-多個tv_item_[i] 點擊事件簡寫

private TextView[] tvConstellations new TextView[12];//獲取當前id元素并在其點擊的時候修改其顏色 for (int i 0; i < 12; i) {int resId getResources().getIdentifier("tv_constellation_" (i1), "id", getPackageName());tvConstellations[i…

神經網絡與深度學習 課程復習總結

神經網絡的發展歷史 第一代神經網絡&#xff08;1958~1969&#xff09; MCP模型&#xff08;1943年&#xff09;&#xff1a;麥卡洛克和皮茨提出了第一個人工神經元模型&#xff0c;簡化為輸入信號線性加權、求和、非線性激活&#xff08;閾值法&#xff09;。感知器&#xf…

鴻蒙開發 組件之間的傳值

1.Prop&#xff1a;父組件傳遞給子組件&#xff0c;單向傳遞&#xff0c;子組件改變值&#xff0c;父組件UI不更新。 引入子組件 并賦值&#xff0c;子組件用Prop 接收 import headerView from ../../common/bean/BaseNavHeaderView headerView({titlestr:添加地址,isback…