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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;也可以是一个需要专业开发团队持续优化的巨型项目。因此&…