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

时间:2009-09-22 23:48:35

标签: asp.net vb.net excel filehelpers

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

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

Here是一个展示代码有问题的示例项目

希望有人可以帮助我或指出一些方向。

谢谢!

3 个答案:

答案 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. 不要在第一列位置放置任何空单元格。
  2. 请勿使用excel作为文件格式 - 首先转换为CSV格式。
  3. 看看您是否可以从开发人员那里获得补丁或自行修补源代码。
  4. 前两个是解决方法(并不是很好的解决方法)。第三个选项可能是最好的,但文件条件的结束是什么?可能整个行是空的,这将是一个足够好的检查(但即使这样在所有情况下都可能不起作用)。

答案 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库中。我已经使用了SebastianIsEof代码,并将方法重命名为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);
}

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