C#读取ExcelWorksheet时出现了ArgumentOutOfRangeException

5
我正在阅读一个 OfficeOpenXml.ExcelWorksheet 并在集合中间收到 ArgumentOufOfRangeException 异常。
我这样读取:process.Information = sheet.Cells[line, i++].Text;。在这一行上,i=22,而 sheet.Dimension.Column = 28sheet #columns i value 当我调试并枚举集合时,我发现异常是在方法 .Text 上抛出的,而 .Value 方法显示了正确的值。

collection enumerated

根据异常堆栈跟踪,异常是由 System.Text.StringBuilder.Insert() 方法引发的。

trace

---- 编辑 ---- 在接受答案后,我意识到问题不仅仅出现在读取数据上。我用一个额外的列(导入成功或失败)重新回复了同样的文件,当我进行 sheet 格式化时,我再次遇到了相同的错误,所有这些都是由 System.Text.StringBuilder.Insert() 方法引起的。 我试图自适应调整一列 sheet.Column(22).AutoFit() 这是堆栈跟踪:
at System.Text.StringBuilder.Insert(Int32 index, Char* value, Int32 valueCount)
at System.Text.StringBuilder.Insert(Int32 index, Char value)
at OfficeOpenXml.Style.XmlAccess.ExcelNumberFormatXml.ExcelFormatTranslator.ToNetFormat(String ExcelFormat, Boolean forColWidth)
at OfficeOpenXml.Style.XmlAccess.ExcelNumberFormatXml.ExcelFormatTranslator..ctor(String format, Int32 numFmtID)
at OfficeOpenXml.Style.XmlAccess.ExcelNumberFormatXml.get_FormatTranslator()
at OfficeOpenXml.ExcelRangeBase.GetFormattedText(Boolean forWidthCalc)
at OfficeOpenXml.ExcelRangeBase.get_TextForWidth()
at OfficeOpenXml.ExcelRangeBase.AutoFitColumns(Double MinimumWidth, Double MaximumWidth)
at OfficeOpenXml.ExcelRangeBase.AutoFitColumns(Double MinimumWidth)
at OfficeOpenXml.ExcelRangeBase.AutoFitColumns()
at OfficeOpenXml.ExcelColumn.AutoFit()
at SkiptraceAPI.Models.ProcessosRepository.formatExcel(ExcelPackage package, Boolean addValidation) in

1
这似乎是与处理单元格样式相关的实现中的一个错误。请尝试使用 process.Information = sheet.GetValue<string>(line, i++) - Sergey Kalinichenko
读取 Value 属性会有什么问题?你是否实际上需要 .Text 属性?我在谷歌上搜索了一些示例,发现很多人使用 Value 而不是 Text。我找不到你正在使用的包的文档,但 Text 不是一种特殊属性吗? - Sander Aernouts
其实我不知道使用.Value而不是.Text是否有问题。这是旧代码,记不起为什么选择了这种方式(但一定有原因)。这段代码以前一直运行正常,客户第一次报告出现了这个错误。我猜我会改成使用.Value,但只是想弄清楚问题所在... - NunoRibeiro
在尝试过程中,我认为我的选择是基于空单元格。使用.Text,我不需要验证单元格内容(如果为空,则.Text将返回null),而使用.Value,因为它返回一个object,我必须执行.Value.ToString(),如果值为空则会抛出异常。 - NunoRibeiro
1个回答

2
从堆栈跟踪中提到的 Style.XmlAccess 部分来看,看起来你遇到了一个由所涉及的单元格样式触发的 OfficeOpenXml 实现中的真正错误。
由于在单元格不为 null 时使用 Value.ToString() 对你有效,因此你可以通过使用新增的 null 条件 语法解决该问题。
process.Information = sheet.Cells[line, i++].Value?.ToString();
//                                                ^

另一个可能的解决方法是使用GetValue<T>

process.Information = sheet.GetValue<string>(line, i++);

编辑:看起来第22列中的一个单元格有一个非数字值的样式,而库期望一个数字字符串。库尝试解析该字符串以获取数字,从而导致异常。您可以通过更改单元格的格式来解决此问题,但实际修复方法是修改库以在不引发异常的情况下检测格式不匹配。


是的,我按照你的建议用 GetValue<string> 替换了 .Text,但现在在使用 sheet.Column(22).AutoFit() 时又遇到了异常... 有什么想法吗? - NunoRibeiro
@NunoRibeiro 在第22列中,某个值的样式肯定有问题,因为无论存储在那里的样式是什么,都会导致实现中出现多个错误。 - Sergey Kalinichenko
如果您可以自由修改此电子表格,请考虑将内容无样式地复制到一个新电子表格中,然后查看是否可以在结果电子表格中打开/自适应列宽。 - Sergey Kalinichenko
我将内容(不带样式)复制到另一个电子表格中,错误消失了。但这不是解决方案,因为客户会创建自己的电子表格... 必须理解为什么会出现这种情况以及我可以做些什么来防止它... - NunoRibeiro
@NunoRibeiro 很不幸,这需要访问电子表格本身:看起来单元格中有一个样式,其中包含一个非数字值,而库期望的是数字字符串。 - Sergey Kalinichenko
你说得完全正确。那一列应该设置为“常规”而不是“会计”。请将您的最后评论添加到您的答案中,以便我可以接受它。非常感谢。 - NunoRibeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接