0

こんにちは私は以下のコードからこのエラーを受け取り続けています、誰かが助けることができるかどうか疑問に思っていました。

error processing excel file: cannot perform runtime binding on a null reference

コード:

    private void Import_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

        // Show open file dialog box
        Nullable<bool> result = dlg.ShowDialog();

        // Process open file dialog box results
        if (result == true)
        {
            // Open document
            string filename = dlg.FileName;

            Microsoft.Office.Interop.Excel.Application vExcelObj = new Microsoft.Office.Interop.Excel.Application();
            try
            {
                Microsoft.Office.Interop.Excel.Workbook theWorkbook = vExcelObj.Workbooks.Open(filename, Type.Missing, true);

                Microsoft.Office.Interop.Excel.Worksheet sheet = theWorkbook.Worksheets[1];  

                string vFirstName = "temp";
                string vLastName = "temp";
                int vIndex = 1;

                while (vFirstName != "")
                {
                    // Change the letters of the appropriate columns here!  
                    // In my example, 'A' is first name, 'B' last name
                    vFirstName = sheet.get_Range("A" + vIndex.ToString()).Value.ToString(); // if i take out the exception handling the error is on this line
                    vLastName = sheet.get_Range("B" + vIndex.ToString()).Value.ToString();


                    this.SaveNewCustomer(vFirstName, vLastName); 

                    vIndex++;

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error processing excel file : " + ex.Message);
            }
            finally
            {
                vExcelObj.Quit();
            }
        }
    }

    private void SaveNewCustomer(string firstName, string lastName) 
    {
        string uri = "http://localhost:8002/Service/Customer";
        StringBuilder sb = new StringBuilder();
        sb.Append("<Customers>");
        sb.AppendLine("<FirstName>" + firstName + "</FirstName>");
        sb.AppendLine("<LastName>" + lastName + "</LastName>");
        sb.AppendLine("</Customers>");
        string NewStudent = sb.ToString();
        byte[] arr = Encoding.UTF8.GetBytes(NewStudent);
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
        req.Method = "POST";
        req.ContentType = "application/xml";
        req.ContentLength = arr.Length;
        Stream reqStrm = req.GetRequestStream();
        reqStrm.Write(arr, 0, arr.Length);
        reqStrm.Close();
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        reqStrm.Close();
        resp.Close();
    }

}

コードはExcelドキュメントを取得し、データをWebサービスに送信しようとします。

だから私は以下の方法を使ってみましたが、それはアプリケーションをフリーズさせます:Sエラーはちょうどハングしません。 編集の試み:

                while (vFirstName != "")
                {
                        var columnACell = sheet.get_Range("A" + vIndex.ToString());
                        var columnBCell = sheet.get_Range("B" + vIndex.ToString());
                        var columnACellValue = columnACell.Value;
                        var columnBCellValue = columnBCell.Value;


                    if (columnACellValue != null && columnBCellValue != null)
                    {
                        vFirstName = columnACellValue.ToString();
                        vLastName = columnBCellValue.ToString();

                        this.SaveNewStaff(vFirstName, vLastName); //, vPassword

                        vIndex++;
                    }
                }
            }

ここに画像の説明を入力してください

4

3 に答える 3

3

編集2

コードを取得して、ステップスルーしました。問題が見つかりました。もともと何が起こっていたのか誤解したと思います。

何が起こっているのかというと、ループは空の文字列while (vFirstName != "")になるまで続きます。vFirstNameしかし、これは決して起こりません!理由は次のとおりです。

  • 列Aと列Bに値がある限り、すべて問題ありません。コードは期待どおりに動作します。
  • コードが値を持たないExcel行に到達すると、に.Value設定されている空のセルにヒットしnullます。これにより例外が発生します。

したがって、ここでの実際の解決策は、ループが値を持つセルにヒットするまでループを続行しnull、その後終了することです。このようなもの:

while (true) {
    // Split the satements 
    var columnACell = sheet.get_Range("A" + vIndex.ToString());
    var columnBCell = sheet.get_Range("B" + vIndex.ToString());
    var columnACellValue = columnACell.Value;
    var columnBCellValue = columnBCell.Value;

    if (columnACellValue != null && columnBCellValue != null) {
        vFirstName = columnACellValue.ToString();
        vLastName = columnBCellValue.ToString();

    } else {
        break;
    }

    this.SaveNewCustomer(vFirstName, vLastName);

    vIndex++;

};

私の側でこれをテストしたところ、うまくいくようです。

別の注意点として、Excelを完全に終了していることを確認してください。これは、呼び出しExcel.Quit()だけでは不十分な場合が多いためです。タスクマネージャを開き、EXCEL.exeの余分なインスタンスが浮かんでいないかどうかを確認します。これらを防ぐために、この投稿で説明されているように、私は通常、Excelを使い終わった後に(ExcelのCOMオブジェクトを適切に解放するよりも簡単に)Excelを強制終了します。


元の投稿

ここにはいくつかのオプションがあるようです。

  • セルは空です。つまり、セルは空に.Valueなりますnull
  • sheetnull、_
  • get_Range()戻りますnull-それはありそうもないように聞こえます。

行を別々のステートメントに分割し、そのうちのどれがエラーをスローするかを確認します。それはあなたにさらに探すべき場所を教えてくれます。

何をしているのか(名が見つかるまで列を検索する)から判断すると、セル内でnullが発生しているように聞こえますValue。これに対処するために、私は通常、をテストするValueための簡単なifステートメントを追加しnullます。

編集

nullこれは、セル内の値を修正し、他のnull関連する問題を特定するのに役立つ例(コンパイルされない場合があります)です。問題のある行を次のようなものに置き換えます。

var columnACell = sheet.get_Range("A" + vIndex.ToString());
var columnBCell = sheet.get_Range("B" + vIndex.ToString())
var columnACellValue = columnACell.Value;
var columnBCellValue = columnBCell.Value;

if (columnACellValue != null && columnBCellValue != null) {
    vFirstName = columnACellValue.ToString(); 
    vLastName = columnBCellValue.ToString();
}

C#コンパイラは、を介した暗黙的な静的型付けをサポートしていると想定していることに注意してくださいvar

于 2012-07-24T20:20:23.723 に答える
0

シートがnullです。おそらく、ワークシートは1つだけですか?もちろん、2番目のワークシートを返すWorksheets[1]を使用しています。:)

于 2012-07-24T20:17:45.700 に答える
0

値を読み取るコードを分割して、それがnullかどうかをテストしてみてください。

object oName = sheet.get_Range("A" + vIndex.ToString()).Value;
vFirstName = (oName == null ? string.Empty : oName.ToString();
object oLast = sheet.get_Range("B" + vIndex.ToString()).Value;
vLastName = (oLast == null ? string.Empty : oLast.ToString());
if(vFirstName.Length > 0 && vLastName.Length > 0)
     this.SaveNewCustomer(vFirstName, vLastName);   

また、SaveNewStaff / Customer(....)でRequestStreamを2回閉じていることに気づきました。おそらく、2回目のクローズでコードがフリーズします。

    reqStrm.Close();  
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();  
    reqStrm.Close();  // <= Already closed before?
于 2012-07-24T20:28:55.210 に答える