2016-07-06 11 views
5

Ich lese ein OfficeOpenXml.ExcelWorksheet und die ArgumentOufOfRangeException in der Mitte der Sammlung.C# ArgumentOutOfRangeException beim Lesen von ExcelWorksheet

Ich lese so process.Information = sheet.Cells[line, i++].Text;. Auf dieser Linie i = 22 während der sheet.Dimension.Column = 28. sheet #columns

i value Wenn ich das Debuggen und aufzuzählen, die Sammlung, die ich sehe, dass die Ausnahme für das Verfahren ausgelöst wird .Text während die .Value Methode wird den richtigen Wert zeigt.

collection enumerated

Nach der Ausnahmestapelüberwachung, wird die Ausnahme von der ---- EDIT System.Text.StringBuilder.Insert() Methode

trace

geworfen - - Nach der angenommenen Antwort wurde mir klar, dass das Problem nicht nur beim Lesen liegt. Ich beantworte die gleiche Datei mit einer zusätzlichen Spalte (Import-Erfolg oder Erfolg) und während ich die Blatt-Formatierung mache bekomme ich wieder den gleichen Fehler, alles wegen der Methode System.Text.StringBuilder.Insert(). Ich versuche, eine Spalte AutoFit sheet.Column(22).AutoFit() Dies ist der Stack-Trace

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

Dies sieht wie ein Fehler in der Implementierung in Bezug auf die Verarbeitung des Stils Ihrer Zelle aus. Versuchen Sie 'process.Information = sheet.GetValue (line, i ++)' stattdessen. – dasblinkenlight

+0

Was wäre das Problem beim Lesen der Value-Eigenschaft? Brauchen Sie eigentlich die Eigenschaft '.Text'? Ich habe für einige Beispiele gegoogelt und ich sehe, dass "Value" viel anstelle von "Text" verwendet wird. Kann die Dokumentation für das von Ihnen verwendete Paket nicht wirklich finden, aber ist 'Text' nicht eine spezielle Eigenschaft? –

+0

Eigentlich weiß ich nicht, ob ein Problem mit '.Value' anstatt' .Text' auftritt. Das ist alter Code und ich kann mich nicht erinnern, warum ich diesen Weg gewählt habe (aber es muss ein Grund gewesen sein). Dieser Code hat immer funktioniert und der Kunde meldet diesen Fehler zum ersten Mal. Ich denke, ich werde es stattdessen in ".Value" ändern, aber ich will nur das Problem verstehen ... – NunoRibeiro

Antwort

2

Geht man von dem Teil des Stack-Trace zu erwähnen Style.XmlAccess, es sieht aus wie Sie in einen echten Fehler bei der Umsetzung der OfficeOpenXml durch Stil ausgelöst liefen von die fragliche Zelle.

Da mit Value.ToString() für Sie arbeiten, wenn die Zelle nicht null ist, können Sie rund um den Bug arbeiten, um die neu unter Verwendung hinzugefügt null bedingte Syntax:

process.Information = sheet.Cells[line, i++].Value?.ToString(); 
//            ^

Eine weitere mögliche Behelfslösung GetValue<T> verwendet:

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

Edit: Es sieht aus wie ein Stil in der Zelle in der Spalte 22-nd Dieser Wert hat einen nicht numerischen Wert, wenn die Bibliothek eine numerische Zeichenfolge erwartet. Die Bibliothek versucht, die Zeichenfolge für eine Zahl zu analysieren, wodurch die Ausnahme verursacht wird. Sie können dies umgehen, indem Sie das Format der Zelle ändern, aber die eigentliche Korrektur besteht darin, die Bibliothek so zu modifizieren, dass Formatkonflikte erkannt werden, ohne dass eine Ausnahme ausgelöst wird.

+0

Ja, ich ersetze'. Text von 'GetValue ' (wie Sie vorgeschlagen), aber jetzt habe ich wieder die Ausnahme, während Sie 'sheet.Column (22) .AutoFit()' ... irgendwelche Gedanken? – NunoRibeiro

+0

@NunoRibeiro Irgendetwas stimmt nicht mit dem Stil eines Wertes in Spalte 22, denn was dort für den Stil gespeichert wird, scheint mehrere Fehler in der Implementierung aufzudecken. – dasblinkenlight

+0

@NunoRibeiro Wenn Sie diese Tabelle frei ändern können, sollten Sie den Inhalt ohne den Stil in einen neuen kopieren und prüfen, ob Sie die Spalten in der resultierenden Tabelle öffnen/anpassen können. – dasblinkenlight

Verwandte Themen