尝试访问工作表对象时索引超出范围异常

时间:2019-09-20 15:20:42

标签: epplus

我有一个由第三方创建的.XLSX。我可以在Excel中很好地阅读它,但是,如果尝试使用EPPlus进行阅读,则会收到以下异常:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
   at OfficeOpenXml.Style.ExcelStyle..ctor(ExcelStyles styles, ChangedEventHandler ChangedEvent, Int32 positionID, String Address, Int32 xfsId)
   at OfficeOpenXml.Style.XmlAccess.ExcelNamedStyleXml..ctor(XmlNamespaceManager NameSpaceManager, XmlNode topNode, ExcelStyles styles)
   at OfficeOpenXml.ExcelStyles.LoadFromDocument()
   at OfficeOpenXml.ExcelStyles..ctor(XmlNamespaceManager NameSpaceManager, XmlDocument xml, ExcelWorkbook wb)
   at OfficeOpenXml.ExcelWorkbook.get_Styles()
   at OfficeOpenXml.ExcelWorkbook.get_MaxFontWidth()
   at OfficeOpenXml.ExcelWorksheet.get_DefaultColWidth()
   at OfficeOpenXml.ExcelWorksheet.LoadColumns(XmlReader xr)
   at OfficeOpenXml.ExcelWorksheet.CreateXml()
   at OfficeOpenXml.ExcelWorksheet..ctor(XmlNamespaceManager ns, ExcelPackage excelPackage, String relID, Uri uriWorksheet, String sheetName, Int32 sheetID, Int32 positionID, eWorkSheetHidden hide)
   at OfficeOpenXml.ExcelWorksheets..ctor(ExcelPackage pck, XmlNamespaceManager nsm, XmlNode topNode)
   at OfficeOpenXml.ExcelWorkbook.get_Worksheets()

如果我在Excel中打开文件,然后将其另存为新文件,则EPPlus可以正常读取文件。显然,对于我系统的最终用户来说,这不是一个合理的解决方案。

如果需要,我可以将文件发送给开发人员,或者如果需要且可用,我可以提供更多诊断信息。

我将与另一个应用程序的开发人员联系,以尝试确定他们使用什么API来生成.XLSX。

代码:

using (var package = new ExcelPackage(importEquipmentFile.InputStream))
{
   foreach (var ws in package.Workbook.Worksheets.Where(ws => ws.Hidden == eWorkSheetHidden.Visible))
    ...

这个简化的东西也炸毁了:

using (var package = new ExcelPackage(importEquipmentFile.InputStream))
{
   foreach (var ws in package.Workbook.Worksheets)
   ...

这是问题所在。在以下代码中

positionID = -1和_styles.CellStyleXfs列表为空,因此“其他”被调用

    internal ExcelStyle(ExcelStyles styles, OfficeOpenXml.XmlHelper.ChangedEventHandler ChangedEvent, int positionID, string Address, int xfsId) :
        base(styles, ChangedEvent, positionID, Address)
    {
        Index = xfsId;
        ExcelXfs xfs;
        if (positionID > -1)
        {
            xfs = _styles.CellXfs[xfsId];
        }
        else
        {
            xfs = _styles.CellStyleXfs[xfsId];
        }

并引发异常,因为调用的代码无法处理空列表。

   public T this[int PositionID]
    {
        get
        {
            return _list[PositionID]; // <<<--- this blows up because _list has no members
        }
    }

我将代码调整为这样,它可以正常工作,但是我不确定处理该列表为空的最佳方法:

if (positionID > -1 || _styles.CellStyleXfs.Count == 0)

0 个答案:

没有答案