C#ArgumentOutofRange阅读Excel工作表时出现异常
我正在阅读OfficeOpenXml.excel工作表,并在集合的中间获取ArgumentOufOfRangeException 我是这样读的C#ArgumentOutofRange阅读Excel工作表时出现异常,c#,excel,outofrangeexception,C#,Excel,Outofrangeexception,我正在阅读OfficeOpenXml.excel工作表,并在集合的中间获取ArgumentOufOfRangeException 我是这样读的process.Information=sheet.Cells[line,I++].Text。在这一行i=22,而sheet.Dimension.Column=28。 在调试和枚举集合时,我看到方法.Text抛出异常,而.Value方法显示正确的值 根据异常堆栈跟踪,异常由 System.Text.StringBuilder.Insert()方法
process.Information=sheet.Cells[line,I++].Text代码>。在这一行i=22
,而sheet.Dimension.Column=28
。
在调试和枚举集合时,我看到方法.Text
抛出异常,而.Value
方法显示正确的值
根据异常堆栈跟踪,异常由
System.Text.StringBuilder.Insert()方法
----编辑----
在得到公认的答案后,我意识到问题不仅仅在于阅读。我用一个额外的列(导入成功或不成功)回复同一个文件,并且在执行工作表格式化时,我再次收到相同的错误,所有这些都是由于方法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
从堆栈跟踪中提到Style.xmlacess
的部分判断,您似乎在OfficeOpenXml
的实现中遇到了一个真正的bug,该bug是由相关单元格的样式触发的
由于使用Value.ToString()
在单元格不为null
时适用,因此可以通过使用新添加的null条件语法来解决此错误:
另一种可能的解决方法是使用GetValue
:
process.Information=sheet.GetValue(行,i++);
编辑:第22列中的单元格中似乎有一个样式具有非数字值,而库需要一个数字字符串。库尝试分析字符串中的数字,导致异常。您可以通过更改单元格的格式来解决此问题,但实际的解决方法是修改库以检测格式不匹配,而不引发异常。这看起来像是与处理单元格样式相关的实现中的错误。请改为尝试process.Information=sheet.GetValue(line,i++)
。读取Value属性会有什么问题?您确实需要.Text
属性吗?我在谷歌上搜索了一些例子,我发现Value
经常被使用,而不是Text
。找不到您正在使用的软件包的文档,但是Text
是否有特殊属性?实际上,我不知道使用.Value
而不是.Text
是否有问题。这是旧代码,不记得为什么选择这种方式(但这一定是一个原因)。此代码始终有效,客户第一次报告此错误。我想我会改为.Value
,但我只是想了解问题……在进行实验时,我认为我的选择是基于空/空单元格。使用.Text
我不需要在使用.Value
时验证单元格内容(如果为null,.Text
将返回null),因为它返回一个对象
,我必须执行.Value.ToString()
,如果值为null,则会引发异常是,我将.Text
替换为GetValue
(如您所建议的),但现在我在使用sheet.Column(22.AutoFit()
)时再次面临异常。。。有什么想法吗?@ NunoRibeiro第22栏中的一个值的样式一定有问题,因为在该样式中存储的任何内容似乎都会在实现中发现多个bug。@ NunoRibeiro,如果您可以自由修改该电子表格,请考虑将其内容复制到没有新样式的内容中,并查看是否可以打开/自动调整生成的电子表格中的列。我将内容(没有样式)复制到另一个电子表格中,错误消失了。但这不是一个解决方案,因为客户机创建了自己的spreadcheats。。。必须理解为什么会发生这种情况,以及我能做些什么来防止它…@NunoRibeiro不幸的是,这需要访问电子表格本身:看起来单元格中有一个样式具有非数字值,而库需要一个数字字符串。
process.Information = sheet.Cells[line, i++].Value?.ToString();
// ^
process.Information = sheet.GetValue<string>(line, i++);