当第一个单元格为空时,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 } }
所以,如果任何行的开始列都是空的,那么就假定文件已经完成。
一些选项来解决这个问题:
- 不要在第一列中放置任何空单元格。
- 不要使用excel作为您的文件格式 – 先转换为CSV。
- 看看你是否可以从开发者那里获得一个补丁,或者自己修补源代码。
前两个是变通办法(而不是很好的)。 第三个选项可能是最好的,但文件状态的结束是什么? 大概整行是空的将是一个足够好的检查(但即使这可能无法在所有情况下所有的时间)。
感谢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两个连续的空行