EPPlus升级至5.7.5以上版本后Copy Range到目标区域失效问题问询
EPPlus 5.7.5以上版本Copy Range报错问题解决方案
问题原因
EPPlus 5.8.0及后续版本重构了ExcelAddressBase的地址校验逻辑,旧版本支持传入单个起始单元格作为Copy目标,框架会自动匹配源范围的大小生成对应目标范围,新版本的校验逻辑在解析动态拼接的字符串形式单元格地址时,容易出现范围起止地址计算错误,触发参数校验异常。
该问题是版本升级带来的已知兼容性问题,和原有业务代码逻辑无关,对应的报错信息如下:
System.ArgumentOutOfRangeException: '指定的参数超出了有效值范围。参数名: Start cell Address must be less or equal to End cell address'
该异常在"OfficeOpenXml.ExcelAddressBase.Validate()"中抛出。
修复方案
方案1:显式指定完整目标范围(推荐)
手动计算目标范围的起止行列,避免框架自动匹配出现错误,仅需修改Copy对应的代码行即可:
' 原有报错代码 ' src.Cells(4, 1, srcEndRow, 17).Copy(tgt.Cells("A" & tgtStartRow + 1)) ' 修改后兼容高版本的代码 Dim tgtEndRow As Integer = tgtStartRow + 1 + (srcEndRow - 4) src.Cells(4, 1, srcEndRow, 17).Copy(tgt.Cells(tgtStartRow + 1, 1, tgtEndRow, 17))
方案2:通过Resize方法自动匹配源范围大小
如果不想手动计算行号,也可以通过源范围的行列数动态定义目标范围:
Dim sourceRange = src.Cells(4, 1, srcEndRow, 17) Dim targetStartCell = tgt.Cells(tgtStartRow + 1, 1) sourceRange.Copy(targetStartCell.Resize(sourceRange.Rows.Count, sourceRange.Columns.Count))
注意事项
升级到5.7.5以上版本后,尽量避免直接传入字符串形式的单个单元格地址作为Copy方法的目标参数,优先使用行号、列号的数字形式定义范围,可大幅降低地址解析异常的概率。
内容的提问来源于stack exchange,提问作者user17432209
相关产品推荐
相关产品推荐

