0

私はExcelファイルを読んでいますが、間違った値を持つフィールドを読み取るたびに実行が停止され、catchセクションに移動します。(たとえば、dateTime 列に文字列があります) ループを完了し、実行を停止することなく、発生したすべてのエラー メッセージを stringbuilder オブジェクトに格納できるようにしたいと考えています。エラーが発生したときにユーザーが入力ファイルを修正することは望ましくありません。文字列ビルダー オブジェクトは、ファイル内のすべてのエラーを表示する必要があります。

どうすればこれを達成できますか?続けてみましたが運が悪かったです。

public void  testThis()
{
    try
    {
        for (int rowNumber = startRow + 1; rowNumber <= currentWorkSheet.Dimension.End.Row; rowNumber++)
        // read each row from the start of the data (start row + 1 header row) to the end of the spreadsheet.
        {
            object col1Value = currentWorkSheet.Cells[rowNumber, 1].Value;
            object col2Value = currentWorkSheet.Cells[rowNumber, 2].Value;
            object col3Value = currentWorkSheet.Cells[rowNumber, 3].Value;
            object col4Value = currentWorkSheet.Cells[rowNumber, 4].Value;

            if ((col1Value != null && col2Value != null))
            {
                exampleDataList.Add(new PersonalData
                {
                    firstname = col1Value.ToString(),
                    lastname = col2Value.ToString(),
                    currentDate = col3Value == null ? DateTime.MinValue : Convert.ToDateTime(col3Value),
                    mySalary = col4Value == null ? 0 : Convert.ToInt32(col4Value)
                });
            }

        }
    }
    catch(Exception Exception)
    {
        //continue.. do not stop
    }

}
4

2 に答える 2

2

Try..CatchブロックをForループに移動します

StringBuilder sb = new StringBuilder();
for (int rowNumber = startRow + 1; rowNumber <= currentWorkSheet.Dimension.End.Row; rowNumber++)
        // read each row from the start of the data (start row + 1 header row) to the end of the spreadsheet.
{

    try
    {

        object col1Value = currentWorkSheet.Cells[rowNumber, 1].Value;
        object col2Value = currentWorkSheet.Cells[rowNumber, 2].Value;
        object col3Value = currentWorkSheet.Cells[rowNumber, 3].Value;
        object col4Value = currentWorkSheet.Cells[rowNumber, 4].Value;

        if ((col1Value != null && col2Value != null))
        {
            exampleDataList.Add(new PersonalData
            {
                firstname = col1Value.ToString(),
                lastname = col2Value.ToString(),
                currentDate = col3Value == null ? DateTime.MinValue : Convert.ToDateTime(col3Value),
                mySalary = col4Value == null ? 0 : Convert.ToInt32(col4Value)
            });
        }

    }      
    catch (Exception e)
    {
         //log exception here
        sb.AppendFormat("{0}: {1}{2}",rowNumber, e.Message, Environment.NewLine);           
    }
} 

//convert the StringBuilder into the final string object
string allMessages = sb.ToString();
于 2013-07-08T22:04:38.217 に答える
0

問題は、try/catch を for の外側ではなく内側に配置する必要があることです。

その後、キャッチで使用できるかどうかは関係ありません。

StringBuilderfor ループに入る前にインスタンスを作成し、 for の後にそのコンテンツを.ToString()

于 2013-07-08T22:05:02.577 に答える