Индекс был вне диапазона исключений при попытке получить доступ к объекту Worksheets - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть .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 пуст, поэтому вызывается «else»

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...