2009-09-22 12 views
5

Wenn die erste Zelle einer Excel-Tabelle, die ExcelStorage.ExtractRecords importiert, leer ist, schlägt der Prozess fehl. Ie. Wenn die Daten in Spalte 1, Zeile 2 beginnen, wenn die Zelle (2,1) einen leeren Wert hat, schlägt die Methode fehl.Filehelpers ExcelStorage.ExtractRecords schlägt fehl, wenn die erste Zelle leer ist

Weiß jemand, wie man das umgeht? Ich habe versucht, ein FeldNullValue-Attribut der Zuordnungsklasse ohne Glück hinzuzufügen.

Here ist ein Beispielprojekt, das den Code mit Problemen zeigen

Hoffnung jemand mir oder Punkt in irgendeiner Richtung helfen.

Vielen Dank!

+0

Ich habe das nicht wirklich benutzt, habe mir vor einiger Zeit die Bibliothek angesehen: Kann FieldOptional Attribut helfen? –

Antwort

4

Es sieht so aus, als ob Sie in FileHelpers über ein Problem gestolpert sind.

Was passiert, ist, dass die ExcelStorage.ExtractRecords-Methode einen leeren Zellenüberprüfung verwendet, um zu sehen, ob es das Ende des Blattes erreicht hat. Dies kann in der ExcelStorage.cs Quellcode zu sehen:

while (CellAsString(cRow, mStartColumn) != String.Empty) 
{ 
    try 
    { 
     recordNumber++; 
     Notify(mNotifyHandler, mProgressMode, recordNumber, -1); 

     colValues = RowValues(cRow, mStartColumn, RecordFieldCount); 

     object record = ValuesToRecord(colValues); 
     res.Add(record); 

    } 
    catch (Exception ex) 
    { 
     // Code removed for this example 
    } 
} 


Also, wenn die Startspalte jeder Zeile leer ist, dann wird davon ausgegangen, dass die Datei ausgeführt wird. Einige Optionen

dies zu umgehen:

  1. Stecken Sie keine leeren Zellen in der ersten Spalte Position.
  2. Verwenden Sie nicht Excel als Ihr Dateiformat - zuerst in CSV konvertieren.
  3. Sehen Sie, ob Sie einen Patch vom Entwickler erhalten oder die Quelle selbst patchen können.

Die ersten beiden sind Workarounds (und nicht wirklich gute). Die dritte Option könnte die beste sein, aber was ist das Ende der Datei Bedingung? Wahrscheinlich wäre eine ganze Reihe, die leer ist, ein gut genug Check (aber auch das könnte nicht immer die ganze Zeit funktionieren).

+0

Vielen Dank Tuzo! Ich werde versuchen, es zu beheben, du hast mir nützliche Informationen gegeben. – Sebastian

4

Dank der Hilfe von Tuzo konnte ich einen Weg finden, dies zu umgehen. Ich habe der ExcelStorage-Klasse eine Methode hinzugefügt, um die While-End-Bedingung zu ändern. Anstatt die erste Zelle nach einem leeren Wert zu durchsuchen, sehe ich alle Zellen in der aktuellen Zeile leer an. Wenn das der Fall ist, gebe false zurück in die while. Dies ist die Änderung des während eines Teil von ExtractRecords:

while (!IsEof(cRow, mStartColumn, RecordFieldCount)) 

statt

while (CellAsString(cRow, mStartColumn) != String.Empty) 

IsEOF ist eine Methode, um die gesamte Zeile zu überprüfen, leer zu sein:

private bool IsEof(int row, int startCol, int numberOfCols) 
    { 
     bool isEmpty = true; 
     string cellValue = string.Empty; 

     for (int i = startCol; i <= numberOfCols; i++) 
     { 
      cellValue = CellAsString(row, i); 
      if (cellValue != string.Empty) 
      { 
       isEmpty = false; 
       break; 
      } 
     } 

     return isEmpty; 
    } 

Natürlich, wenn der Benutzer hinterlässt eine leere Zeile zwischen zwei Datenzeilen, die Zeilen danach werden nicht verarbeitet, aber ich denke, es ist gut, weiter daran zu arbeiten.

Dank

+1

Danke, ich habe deinen Code einen Schritt weiter gebracht. Ich musste in der Lage sein, Leerzeilen zu überspringen –

+0

Diese wurde seither der FileHelpers-Quelle in Github hinzugefügt. Ich habe auch eine andere Änderung an FileHelpers ExcelStorage vorgenommen - "erlauben Excel-Tabellen, eine oder mehrere leere Zeilen zu enthalten, ohne dass der Reader in diesen Zeilen stoppt, bis ein Maximum (ExcelReadStopAfterEmptyRows) überschritten wird" siehe: https://github.com/MarcosMeli/ FileHelpers/pull/4 – rohancragg

3

ich benötigt, um leere Zeilen zu überspringen, also habe ich den folgenden Code in die FileHelpers Bibliothek hinzugefügt.Ich habe Sebastian ‚s IsEof Code genommen und umbenannt die Methode IsRowEmpty und änderte die Schleife in ExtractRecords von ...

while (CellAsString(cRow, mStartColumn) != String.Empty) 

zu ...

while (!IsRowEmpty(cRow, mStartColumn, RecordFieldCount) || !IsRowEmpty(cRow+1, mStartColumn, RecordFieldCount)) 

ich das dann geändert ...

colValues = RowValues(cRow, mStartColumn, RecordFieldCount); 

object record = ValuesToRecord(colValues); 
res.Add(record); 

dazu ...

bool addRow = true; 

if (Attribute.GetCustomAttribute(RecordType, typeof(IgnoreEmptyLinesAttribute)) != null && IsRowEmpty(cRow, mStartColumn, RecordFieldCount)) 
{ 
    addRow = false; 
} 

if (addRow) 
{ 
    colValues = RowValues(cRow, mStartColumn, RecordFieldCount); 

    object record = ValuesToRecord(colValues); 
    res.Add(record); 
} 

Das gibt mir die Fähigkeit, einzelne leere Zeilen zu überspringen. Die Datei wird gelesen, bis zwei aufeinanderfolgende leere Zeilen gefunden werden.

Verwandte Themen