2009-09-22 14 views
5

Lorsque la première cellule d'une feuille Excel à importer à l'aide d'ExcelStorage.ExtractRecords est vide, le processus échoue. C'est à dire. Si les données commencent à la colonne 1, ligne 2, si la cellule (2,1) a une valeur vide, la méthode échoue.Filehelpers ExcelStorage.ExtractRecords échoue lorsque la première cellule est vide

Est-ce que quelqu'un sait comment contourner ce problème? J'ai essayé d'ajouter un attribut FieldNullValue à la classe de mapping sans chance.

Here est un exemple de projet qui montrent le code avec des problèmes

quelqu'un Hope peut me aider ou d'un point dans une certaine direction.

Merci!

+0

Je n'ai pas vraiment utilisé cela, il suffit de regarder la bibliothèque il y a quelque temps: l'attribut FieldOptional peut-il être utile? –

Répondre

4

Il semble que vous ayez trébuché sur un problème dans FileHelpers.

Ce qui se passe est que la méthode ExcelStorage.ExtractRecords utilise une vérification de cellule vide pour voir si elle a atteint la fin de la feuille. Cela peut être vu dans le code source de ExcelStorage.cs:

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 
    } 
} 


Donc, si la colonne de début de chaque ligne est vide, il suppose que le fichier est fait.

Quelques options pour contourner ceci:

  1. Ne pas mettre toutes les cellules vides dans la première position de la colonne.
  2. N'utilisez pas excel comme format de fichier - convertissez d'abord en format CSV.
  3. Voyez si vous pouvez obtenir un correctif du développeur ou corrigez vous-même la source.

Les deux premiers sont des solutions de contournement (et pas vraiment bonnes). La troisième option pourrait être la meilleure mais quelle est la fin de la condition du fichier? Probablement qu'une rangée entière vide serait une vérification assez bonne (mais même cela ne fonctionnerait pas dans tous les cas tout le temps).

+0

Merci Tuzo! Je vais essayer de le réparer, vous m'avez donné des informations utiles. – Sebastian

4

Grâce à l'aide de Tuzo, j'ai pu trouver un moyen de contourner ce problème. J'ai ajouté une méthode à la classe ExcelStorage pour modifier la condition de fin while. Au lieu de regarder la première cellule pour la valeur vide, je regarde toutes les cellules de la rangée actuelle pour être vide. Si c'est le cas, retournez false dans le moment. Ceci est la modification du tout partie de ExtractRecords:

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

au lieu de

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

isEOF est une méthode pour vérifier toute la ligne à vide:

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; 
    } 

Bien sûr, si l'utilisateur laisse une rangée vide entre deux lignes de données les lignes après que celle-ci ne sera pas traitée, mais je pense que c'est une bonne chose de continuer à travailler dessus.

Merci

+1

Merci, j'ai pris votre code un peu plus loin. Je devais être capable d'ignorer les lignes vides –

+0

Cela a depuis été ajouté à la source FileHelpers dans Github. J'ai également commis un autre changement à FileHelpers ExcelStorage - "permettre aux feuilles Excel de contenir une ou plusieurs lignes vides sans que le lecteur s'arrête sur ces lignes jusqu'à ce qu'un maximum (ExcelReadStopAfterEmptyRows) soit dépassé" voir: https://github.com/MarcosMeli/ FileHelpers/pull/4 – rohancragg

3

je devais être en mesure de sauter des lignes vides, donc j'ai ajouté le code suivant à la bibliothèque FileHelpers.J'ai pris le code de IsEofSebastian et renomme la méthode à IsRowEmpty et changé la boucle de ExtractRecords ...

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

à ...

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

J'ai ensuite changé cette ...

colValues = RowValues(cRow, mStartColumn, RecordFieldCount); 

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

à cette ...

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); 
} 

Ce que cela me donne est la possibilité d'ignorer des lignes vides. Le fichier sera lu jusqu'à ce que deux lignes vides successives soient trouvées