读取 ExcelWorksheet 时出现 C# ArgumentOutOfRangeException
C# ArgumentOutOfRangeException while reading ExcelWorksheet
我正在阅读 OfficeOpenXml.ExcelWorksheet 并在集合的中间获取 ArgumentOufOfRangeException。
我正在这样阅读process.Information = sheet.Cells[line, i++].Text;
。在这条线上i = 22
而在sheet.Dimension.Column = 28
。
当我调试和枚举集合时,我看到在 .Text
方法上抛出异常,而 .Value
方法显示正确的值。
根据异常堆栈跟踪,异常是由
System.Text.StringBuilder.Insert() 方法
---- 编辑 ----
在接受答案后,我意识到问题不仅仅在于阅读。我用一个额外的列(导入成功或不成功)回复同一个文件,当我进行 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
从提到 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 列的单元格中有一个样式,该样式具有非数字值,而库需要一个数字字符串。库尝试解析数字字符串,导致异常。您可以通过更改单元格的格式来解决此问题,但实际的解决方法是修改库以检测格式不匹配而不会引发异常。
我正在阅读 OfficeOpenXml.ExcelWorksheet 并在集合的中间获取 ArgumentOufOfRangeException。
我正在这样阅读process.Information = sheet.Cells[line, i++].Text;
。在这条线上i = 22
而在sheet.Dimension.Column = 28
。
.Text
方法上抛出异常,而 .Value
方法显示正确的值。
根据异常堆栈跟踪,异常是由 System.Text.StringBuilder.Insert() 方法
---- 编辑 ----
在接受答案后,我意识到问题不仅仅在于阅读。我用一个额外的列(导入成功或不成功)回复同一个文件,当我进行 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
从提到 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 列的单元格中有一个样式,该样式具有非数字值,而库需要一个数字字符串。库尝试解析数字字符串,导致异常。您可以通过更改单元格的格式来解决此问题,但实际的解决方法是修改库以检测格式不匹配而不会引发异常。