当第一个单元格为空时,Filehelpers ExcelStorage.ExtractRecords失败

当使用ExcelStorage.ExtractRecords导入的Excel工作表的第一个单元格为空时,该过程将失败。 IE浏览器。 如果数据从列1,列2开始,如果单元(2,1)具有空值,则该方法失败。

有人知道如何解决这个问题吗? 我已经尝试添加一个FieldNullValue属性映射类没有运气。

这是一个示例项目,显示代码的问题

希望有人能帮我或指点一些方向。

谢谢!

看起来你已经在FileHelpers中遇到了一个问题。

发生什么事是ExcelStorage.ExtractRecords方法使用一个空的单元格检查,看看它是否已经到达工作表的末尾。 这可以在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 } } 

所以,如果任何行的开始列都是空的,那么就假定文件已经完成。

一些选项来解决这个问题:

  1. 不要在第一列中放置任何空单元格。
  2. 不要使用excel作为您的文件格式 – 先转换为CSV。
  3. 看看你是否可以从开发者那里获得一个补丁,或者自己修补源代码。

前两个是变通办法(而不是很好的)。 第三个选项可能是最好的,但文件状态的结束是什么? 大概整行是空的将是一个足够好的检查(但即使这可能无法在所有情况下所有的时间)。

感谢Tuzo的帮助,我可以想出一个解决这个问题的方法。 我向ExcelStorage类添加了一个方法来改变while结束条件。 而不是看第一个单元格为空值,我查看当前行中的所有单元格为空。 如果是这样的话,那么返回false。 这是对ExtractRecords部分的更改:

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

代替

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

IsEof是一个检查整行为空的方法:

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

当然,如果用户在两个数据行之间留下一个空行,那么这个行之后的行将不会被处理,但是我认为继续这样做是件好事。

谢谢

我需要能够跳过空白行,所以我已经将下面的代码添加到FileHelpers库。 我已经采取了塞巴斯蒂安的IsEof代码,并将方法更名为IsRowEmpty ,并将IsRowEmpty的循环从…更改为…

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

至 …

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

然后我改变了这个…

 colValues = RowValues(cRow, mStartColumn, RecordFieldCount); object record = ValuesToRecord(colValues); res.Add(record); 

这个…

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

这给了我的是跳过单个空行的能力。 该文件将被读取,直到find两个连续的空行