5

ExcelStorage.ExtractRecords を使用してインポートする Excel シートの最初のセルが空の場合、プロセスは失敗します。すなわち。データが列 1、行 2 から始まる場合、セル (2,1) の値が空の場合、メソッドは失敗します。

これを回避する方法を知っている人はいますか?FieldNullValue 属性をマッピング クラスに追加しようとしましたが、うまくいきませんでした。

問題のあるコードを示すサンプル プロジェクトを次に示します。

誰かが私を助けてくれるか、何らかの方向性を示してくれることを願っています。

ありがとうございました!

4

3 に答える 3

4

Tuzo の助けのおかげで、これを回避する方法を見つけることができました。while終了条件を変更するメソッドをExcelStorageクラスに追加しました。最初のセルで空の値を確認する代わりに、現在の行のすべてのセルが空であることを確認します。その場合は、while に false を返します。これは、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つのデータ行の間に空の行を残すと、それ以降の行は処理されませんが、これに取り組み続けることは良いことだと思います.

ありがとう

于 2009-09-23T15:30:52.157 に答える
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. 開発者からパッチを入手するか、自分でソースにパッチを適用できるかどうかを確認してください。

最初の 2 つは回避策です (あまり良い方法ではありません)。3 番目のオプションが最適かもしれませんが、ファイルの終わりの状態は何ですか? おそらく、空の行全体で十分なチェックになります (ただし、常にすべてのケースで機能するとは限りません)。

于 2009-09-23T02:38:59.757 に答える
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);
}

これが私に与えるのは、単一の空の行をスキップする機能です。ファイルは、連続する 2 つの空の行が見つかるまで読み取られます。

于 2011-03-18T22:39:03.083 に答える