ExcelUtils實現 設置內容 插入行 復制行列格式

ExcelUtils實現:

1.實現輸入 例如? 2? A 的excel格式,自動填充對應excel單元格;

2.實現復制并新增下一行

3.實現控制復制上一行相同列的格式;

4.實現控制復制同一行上一列的格式;

  /*** 在指定行下方插入新行并復制上一行格式** @param sheet    Excel工作表* @param rowIndex 在此行下方插入新行(從0開始)* @return 插入的新行*/public static Row insertRowWithFormat(Sheet sheet, int rowIndex) {// 使用excel 行數 自動-1rowIndex = rowIndex - 1;// 將指定行下方的所有行向下移動sheet.shiftRows(rowIndex + 1, sheet.getLastRowNum(), 1);// 創建新行Row newRow = sheet.createRow(rowIndex + 1);// 復制上一行的格式copyRowFormat(sheet, rowIndex, rowIndex + 1);return newRow;}/*** 在指定位置插入多行并復制格式** @param sheet         Excel工作表* @param startRowIndex 開始行索引* @param rowCount      插入行數*/public static void insertRowsWithFormat(Sheet sheet, int startRowIndex, int rowCount) {// 將指定行下方的所有行向下移動sheet.shiftRows(startRowIndex + 1, sheet.getLastRowNum(), rowCount);// 逐行復制格式for (int i = 0; i < rowCount; i++) {int targetRowIndex = startRowIndex + 1 + i;Row newRow = sheet.createRow(targetRowIndex);// 復制上一行的格式(始終復制startRowIndex行的格式)copyRowFormat(sheet, startRowIndex, targetRowIndex);}}/*** 在指定的行和列設置單元格的值和樣式** @param sheet           Excel工作表* @param workbook        Excel工作簿* @param rowNum          行號(從0開始)* @param cellNum         列號(從0開始)* @param value           要設置的值* @param style           單元格樣式,如果為null則使用默認樣式* @param isCopyRowStyle  是否復制上一行相同列的樣式 優先* @param isCopyCellStyle 是否復制同一行上一列的樣式* @return 設置的單元格*/public static Cell setCellValueAndStyle(Sheet sheet, Workbook workbook, int rowNum, int cellNum,String value, CellStyle style,boolean isCopyRowStyle, boolean isCopyCellStyle) {// 獲取或創建行Row row = sheet.getRow(rowNum);if (row == null) {row = sheet.createRow(rowNum);}// 獲取或創建單元格Cell cell = row.getCell(cellNum);if (cell == null) {cell = row.createCell(cellNum);}// 設置單元格的值if (StringUtils.isNotEmpty(value)) {cell.setCellValue(value);}CellStyle cellStyle = null;if (style != null) {cellStyle = style;} else {// 嘗試復制同一行上一列的格式if (isCopyCellStyle && cellNum > 0) {Cell previousColCell = row.getCell(cellNum - 1);if (previousColCell != null) {cellStyle = previousColCell.getCellStyle();}}// 如果沒有提供樣式,則嘗試復制上一行相同列的格式if (isCopyRowStyle) {if (rowNum > 0) {Row previousRow = sheet.getRow(rowNum - 1);if (previousRow != null) {Cell previousCell = previousRow.getCell(cellNum);if (previousCell != null) {cellStyle = previousCell.getCellStyle();}}}}}// 如果上一行同列有樣式,則使用該樣式;否則使用默認居中樣式if (cellStyle != null) {cell.setCellStyle(cellStyle);} else {if (cell.getCellStyle() == null) {CellStyle defaultStyle = workbook.createCellStyle();defaultStyle.setAlignment(HorizontalAlignment.CENTER);defaultStyle.setVerticalAlignment(VerticalAlignment.CENTER);cell.setCellStyle(defaultStyle);}}return cell;}/*** 在指定的行和列設置單元格的值(使用默認居中樣式)** @param sheet    Excel工作表* @param workbook Excel工作簿* @param rowNum   行號(從0開始)* @param cellNum  列號(從0開始)* @param value    要設置的值* @return 設置的單元格*/public static Cell setCellValue(Sheet sheet, Workbook workbook, int rowNum, int cellNum, String value) {return setCellValueAndStyle(sheet, workbook, rowNum, cellNum, value, null, false, false);}/*** 在指定的行和列設置單元格值(使用默認居中樣式)** @param sheet    Excel工作表* @param workbook Excel工作簿* @param rowNum   行號(從1開始)* @param cellNum  列號(如"A", "H", "AA")* @param value    要設置的值* @return 設置的單元格*/public static Cell setCellValueByColumn(Sheet sheet, Workbook workbook, int rowNum, String cellNum, String value) {return setCellValueByColumn(sheet, workbook, rowNum, cellNum, value, null, false, false);}/*** 在指定的行和列設置單元格值(使用默認居中樣式)** @param sheet           Excel工作表* @param workbook        Excel工作簿* @param rowNum          行號(從1開始)* @param cellNum         列號(如"A", "H", "AA")* @param value           要設置的值* @param style           單元格樣式,如果為null則使用默認樣式* @param isCopyRowStyle  是否復制上一行相同列的樣式* @param isCopyCellStyle 是否復制同一行上一列的樣式* @return 設置的單元格*/public static Cell setCellValueByColumn(Sheet sheet, Workbook workbook, int rowNum, String cellNum, String value,CellStyle style,boolean isCopyRowStyle, boolean isCopyCellStyle) {int rowNumInt = rowNum - 1;int cellNumInt = columnToNumber(cellNum);  // 將列標識轉換為數字索引return setCellValueAndStyle(sheet, workbook, rowNumInt, cellNumInt, value, style, isCopyRowStyle, isCopyCellStyle);}/*** 將Excel列標識(如 "A", "H", "AA")轉換為數字索引(從0開始)** @param cellNum Excel列標識,例如 "A", "H", "AA"* @return 對應的數字索引,從0開始*/public static int columnToNumber(String cellNum) {int result = 0;for (int i = 0; i < cellNum.length(); i++) {char c = cellNum.charAt(i);// 每一位代表26進制的一位,但沒有0,A=1, B=2, ..., Z=26result = result * 26 + (c - 'A' + 1);}// 轉換為從0開始的索引return result - 1;}/*** 時間轉換方法,將日期轉換為指定格式的字符串** @param date    日期對象* @param pattern 日期格式* @return 轉換后的日期字符串,如果日期為空則返回空字符串*/public static String formatDate(Object date, String pattern) {if (date == null) {return "";}try {SimpleDateFormat sdf = new SimpleDateFormat(pattern);if (date instanceof Date) {return sdf.format((Date) date);} else if (date instanceof String) {// 如果是字符串,先嘗試解析再格式化Date parsedDate = sdf.parse((String) date);return sdf.format(parsedDate);} else {// 其他類型嘗試轉換為字符串再處理String dateStr = String.valueOf(date);if (dateStr.matches("\\d{4}-\\d{2}-\\d{2}.*")) {// 簡單匹配日期格式return dateStr;}return dateStr;}} catch (Exception e) {// 發生異常時返回原始值的字符串形式return String.valueOf(date);}}/*** 將Long類型轉換為帶千位分隔符的String類型** @param value Long類型的值* @return 格式化后的String類型值*/public static String longToFormattedString(Long value) {if (value == null) {return "";}return String.format("%,d", value);}/*** 將Long類型轉換為指定格式的String類型** @param value  Long類型的值* @param format 格式化字符串* @return 格式化后的String類型值*/public static String longToStringWithFormat(Long value, String format) {if (value == null || format == null) {return value == null ? "" : String.valueOf(value);}return String.format(format, value);}/*** 安全的Integer轉String方法,包含空值判斷** @param value 待轉換的Integer值* @return 轉換后的String,如果輸入為null則返回空字符串*/public static String integerToString(Integer value) {if (value == null) {return "";}return String.valueOf(value);}/*** 將BigDecimal轉換為指定格式的字符串** @param value         BigDecimal值* @param formatPattern 格式模式,如 "0.00", "#,##0.00" 等* @return 格式化后的字符串*/public static String formatBigDecimal(BigDecimal value, String formatPattern) {if (value == null) {return "";}DecimalFormat df = new DecimalFormat(formatPattern);return df.format(value);}/*** 設置單元格為數字格式樣式** @param workbook      工作簿* @param formatPattern 數字格式模式* @return 數字格式的單元格樣式*/public static CellStyle createNumberCellStyle(Workbook workbook, String formatPattern) {CellStyle style = workbook.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);// 設置數字格式DataFormat format = workbook.createDataFormat();style.setDataFormat(format.getFormat(formatPattern));return style;}

增加復制行時復制 合并居中 等格式

注:copyMergedRegions需要在設置單元格樣式之后

/*** 復制上一行的格式到新插入的行** @param sheet          Excel工作表* @param sourceRowIndex 源行索引(從0開始)* @param targetRowIndex 目標行索引(從0開始)*/public static void copyRowFormat(Sheet sheet, int sourceRowIndex, int targetRowIndex) {Row sourceRow = sheet.getRow(sourceRowIndex);Row targetRow = sheet.getRow(targetRowIndex);if (targetRow == null) {targetRow = sheet.createRow(targetRowIndex);}if (sourceRow != null) {// 設置行高targetRow.setHeight(sourceRow.getHeight());// 復制每個單元格的格式for (int i = 0; i < sourceRow.getLastCellNum(); i++) {Cell sourceCell = sourceRow.getCell(i);Cell targetCell = targetRow.getCell(i);if (targetCell == null) {targetCell = targetRow.createCell(i);}if (sourceCell != null) {// 復制單元格樣式CellStyle newCellStyle = sheet.getWorkbook().createCellStyle();newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());targetCell.setCellStyle(newCellStyle);// 設置單元格類型 - 修復公式類型問題if (sourceCell.getCellType() == CellType.FORMULA) {// 對于公式單元格,復制公式String formula = sourceCell.getCellFormula();if (formula != null && !formula.isEmpty()) {targetCell.setCellFormula(formula);}} else {// 對于非公式單元格,保持原有邏輯targetCell.setCellType(sourceCell.getCellType());}}}// 復制行的合并區域信息copyMergedRegions(sheet, sourceRowIndex, targetRowIndex);}}/*** 復制源行的合并區域到目標行** @param sheet          Excel工作表* @param sourceRowIndex 源行索引* @param targetRowIndex 目標行索引*/private static void copyMergedRegions(Sheet sheet, int sourceRowIndex, int targetRowIndex) {int numMergedRegions = sheet.getNumMergedRegions();for (int i = 0; i < numMergedRegions; i++) {CellRangeAddress mergedRegion = sheet.getMergedRegion(i);// 檢查合并區域是否包含源行if (mergedRegion.getFirstRow() <= sourceRowIndex && mergedRegion.getLastRow() >= sourceRowIndex) {// 創建新的合并區域,行號調整為目標行int lastRow = targetRowIndex + (mergedRegion.getLastRow() - mergedRegion.getFirstRow());int firstCol = mergedRegion.getFirstColumn();int lastCol = mergedRegion.getLastColumn();CellRangeAddress newMergedRegion = new CellRangeAddress(targetRowIndex, lastRow, firstCol, lastCol);sheet.addMergedRegion(newMergedRegion);}}}

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

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

相關文章

SQLBot 智能問數、數據洞察邏輯拆解

* 基于 SQLBot v1.0.2* 使用 AI Gateway 抓取模型調用記錄SQLBot 通過融入 LLM 能力實現了非常優秀的問數體驗&#xff0c;這里記錄一下產品中如何引入 AI 能力&#xff0c;順便探究一下調用大模型的數據安全的問題&#xff08;是否會向模型提供真實數據&#xff09;。結論&…

實現統一門戶登錄跳轉免登錄

統一門戶所有應用頁面&#xff0c;點擊跳轉對應業務系統&#xff0c;實現業務系統免登錄//獲取所有業務系統項&#xff08;獲取并存儲到倉庫) //用于頁面展示 let appSubjectVoList ref<any>([]) appSubjectVoList.value userStore.getAppSubjectVoList || [] //登陸后…

卓伊凡的開源戰略與PHP-SG16加密技術深度解析-sg加密技術詳解-卓伊凡

卓伊凡的開源戰略與PHP-SG16加密技術深度解析-sg加密技術詳解-卓伊凡引言&#xff1a;在理想與現實間尋求平衡的開源之路近日&#xff0c;技術創業者卓伊凡先生宣布了一項重大決策&#xff1a;將于明日將其公司旗下的優雅草商城、項目管理系統等眾多成熟商業產品正式開源。這一…

回溯 算法常見面試問題

1. 全排列(無重復元素) 核心思想:交換法避免額外空間 def permute(nums):def backtrack(first=0):if first == len(nums):res.append(nums.copy())returnfor i in range(first, len(nums)):nums[first], nums[i] = nums[i], nums[first]backtrack(first + 1)nums[first], …

營銷專業人員核心能力構建與發展路徑

CDA數據分析師證書含金量高&#xff0c;適應了未來數字化經濟和AI發展趨勢&#xff0c;難度不高&#xff0c;行業認可度高&#xff0c;對于找工作很有幫助。一、營銷人員五維能力模型能力維度核心技能要素工具與方法論產出成果數據驅動決策指標監控、歸因分析、效果優化Google …

Android系統學習2——Android.Utils.Log模塊討論

Android系統學習2——Android.Utils.Log模塊討論 ? 打日志是一個很好的習慣&#xff0c;有的時候我們可以通過這里排查我們的程序的問題。在這里&#xff0c;我們可以從Android的日志機制入手討論我們的Log模塊。 android.util.Log 類的作用 Android 中最常用的日志工具是 and…

使用 YAML 文件,如何優雅地刪除 k8s 資源?

在 Kubernetes 中&#xff0c;刪除資源是日常運維中不可避免的操作。如果你習慣了使用 kubectl create 和 kubectl apply 來創建和更新資源&#xff0c;那么你可能也會想知道如何用同樣基于文件的方式來刪除它們。 雖然你總是可以用 kubectl delete deployment <name> 這…

如何將游戲和軟件移動到另一個驅動器或外部磁盤中

您的C盤存儲空間是否不足&#xff0c;或者您不小心在錯誤的驅動器中安裝了游戲或應用程序。那么使用這個簡單的技巧&#xff0c;您可以輕松的將游戲或應用程序移動到另一個分區或磁盤中。1、找到準備移動的軟件&#xff0c;選擇路徑并復制&#xff1a;2、打開記事本&#xff0c…

賦能汽車電子智造:全星QMS打造品質檢驗、稽核與客訴管理閉環?——全星質量管理軟件系統

全星QMS&#xff1a;驅動汽車電子質量卓越與商業成功的核心引擎 在智能汽車時代&#xff0c;汽車電子的質量已成為產品安全、性能與品牌信譽的核心。面對復雜的供應鏈、嚴苛的IATF 16949/ISO 26262標準及降本增效的壓力&#xff0c;您的企業需要一位數字化戰略伙伴。全星質量管…

【數據結構C語言】順序表

1. 線性表 線性表&#xff08;linear list&#xff09;是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見的線性表&#xff1a;順序表、鏈表、棧、隊列、字符串...線性表在邏輯上是線性結構&#xff0c;也就說是連續的一條直線…

AI 學習路徑-記錄分享

目錄推薦學習資源延申閱讀推薦學習資源 3Blue1Brown的個人空間-3Blue1Brown個人主頁-嗶哩嗶哩視頻 這個簡短的課程有助于了解AI的本質&#xff0c;邁入學習AI的第一步。 歡迎加入 &#x1f917; AI Agents 課程 - Hugging Face Agents Course AI Agent&#xff0c;當前火爆…

Windows Server 2019 上安裝 Ubuntu 20.04 的幾種方式

docker desktop不支持Windows server 2019&#xff0c;所以Windows Server 2019 上安裝 Ubuntu 20.04 變成一種可行的途徑。記錄一下其中可用的幾種方式&#xff1a;&#x1f5c2; 常見安裝方式對比方式原理難度適用場景優點缺點Hyper?V 虛擬機&#xff08;推薦&#xff09;利…

當Trae遇上高德MCP:一次國慶武漢之旅的AI技術實踐

當Trae遇上高德MCP&#xff1a;一次國慶武漢之旅的AI技術實踐 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我…

設計模式:抽象工廠模式

簡介 抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供了一種封裝一組具有共同主題或相關依賴關系的獨立工廠的方式,而無需指定它們的具體類。核心思想是創建一系列相關或相互依賴的對象家族(產品族),可以將客戶端與具體產品的創建過程解耦,使得客…

知行——同為科技24周年慶典

在宜人的金秋時節&#xff0c;北京同為科技有限公司于2025年8月23日&#xff0c;天津基地與江西同時隆重舉辦了以“知行”為主題的周年慶祝活動&#xff0c;回顧企業24年來的奮斗歷程&#xff0c;凝聚“同為人”力量&#xff0c;展望更加光明的未來。當天&#xff0c;創始人周慧…

RK android14 定制ES8388音頻編解碼器雙MIC雙OUT(1)

文章目錄 前言 一、適配內容概述 二、適配步驟 1. HAL層配置修改 1.1 添加聲卡名稱識別 (`audio_hw.c`) 1.2 注冊聲卡路由配置 (`config_list.h`) 1.3 定義路由配置表 (`es8388_config.h`) 2. 內核設備樹修改 2.1 禁用默認聲卡 2.2 配置ES8388聲卡節點 2.3 配置I2C和Codec節點 …

Oracle跟蹤及分析方法

1、SQL_TRACE 通過設置 SQL_TRACE 可以啟用或禁用 SQL 跟蹤工具&#xff0c;設置 SQL_TRACE 為 true 可以收集信息用于性能優化或問題診斷&#xff1b; 特別注意&#xff1a; 全局啟用 SQL 跟蹤可能會對性能產生嚴重影響。 可以使用 ALTER SESSION 跟蹤特定會話。 Oracle 已…

第三階段數據庫-9:循環,編號,游標,分頁

1_sql中的循環&#xff0c;編號&#xff08;1&#xff09;sql 中沒有for循環&#xff0c;只有while循環&#xff0c;begin end 中間的就是while執行的語句&#xff0c;相當于{}declare i int; set i1; --begin end 中間的就是while執行的語句&#xff0c;相當于{} while(i<…

Redis高級篇:在Nginx、Redis、Tomcat(JVM)各環節添加緩存以實現多級緩存

摘要&#xff1a;多級緩存通過在 Nginx、Redis、Tomcat&#xff08;JVM&#xff09;各環節添加緩存&#xff0c;解決傳統緩存中 Tomcat 瓶頸與 Redis 失效沖擊數據庫問題。利用 Caffeine 實現 JVM 緩存&#xff0c;OpenResty 結合 Lua 處理 Nginx 層邏輯&#xff0c;通過 Redis…

9 設計網絡爬蟲

前言 我們重點討論網絡爬蟲的設計&#xff0c; 這也是一個有趣且經典的系統設計面試問題。 爬蟲開發的復雜性取決于我們想要支持的爬蟲規模。它可以是一個小的學校項目&#xff0c;只需要幾小時就可以完成&#xff0c;也可以是一個需要專業開發團隊持續優化的巨型項目。因此&…