当使用ExcelStorage.ExtractRecords导入的Excel工作表的第一个单元格为空时,该过程将失败。 IE浏览器。如果数据从第1列第2行开始,如果单元格(2,1)的值为空,则该方法失败。
有人知道如何解决这个问题吗?我已经尝试将FieldNullValue属性添加到映射类中,但没有运气。
Here是一个展示代码有问题的示例项目
希望有人可以帮助我或指出一些方向。
谢谢!
答案 0 :(得分:4)
看起来你在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 :(得分:4)
感谢Tuzo的帮助,我可以找到一种解决方法。 我在ExcelStorage类中添加了一个方法来更改while end条件。我没有将第一个单元格视为空值,而是查看当前行中的所有单元格是否为空。如果是这种情况,请将false返回到while。这是对ExtractRecords的while部分的更改:
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;
}
当然,如果用户在两个数据行之间留下一个空行,那么该行之后的行将不会被处理,但我认为继续处理这个行是一件好事。
由于
答案 2 :(得分:3)
我需要能够跳过空白行,因此我将以下代码添加到FileHelpers库中。我已经使用了Sebastian的IsEof
代码,并将方法重命名为IsRowEmpty
并更改了ExtractRecords
中的循环...
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);
}
这给了我能够跳过单个空行的能力。将读取该文件,直到找到两个连续的空行