2016-05-17 11 views
0

次のコードがあります。私はそれを行う必要がありますが、私は行をExcelのコメントを外していない正常に閉じる行をコメントアウトする場合。C#Application.Excel.Quit 1行のコードのために機能しません

私は次に何を試すべきか分かりません。私は2ドットの問題から離れて滞在し、1ドットを貼り付けようとしました。しかし、今私は今何をすべきか不明です。

コード内のdtは、私が設定しているDataTableです。

Excel.Application app = null; 
     Excel.Workbooks books = null; 
     Excel.Workbook book = null; 
     Excel.Sheets sheets = null; 
     Excel.Worksheet sheet = null; 
     Excel.Range range = null; 

     try 
     { 
      app = new Excel.Application(); 
      books = app.Workbooks; 
      book = books.Open(FilePath); 
      sheets = book.Sheets; 
      sheet = book.ActiveSheet; 

      int rcount = 45; 
      UpdateProgressBarMaxMethod(pbAssets, rcount); 

      int i = 0; 

      for (; i < rcount; i++) 
      { 
       //Comment out the below line and it works fine 
       dt.Rows.Add(sheet.Cells[i + 1, 1].Value, 
        sheet.Cells[i + 1, 2].Value, 
        sheet.Cells[i + 1, 3].Value, 
        sheet.Cells[i + 1, 4].Value, 
        sheet.Cells[i + 1, 5].Value, 
        sheet.Cells[i + 1, 6].Value, 
        sheet.Cells[i + 1, 7].Value, 
        sheet.Cells[i + 1, 8].Value, 
        sheet.Cells[i + 1, 9].Value); 

       UpdateProgressBarMethod(pbAssets, i); 
      } 
      UpdateProgressBarMethod(pbAssets, 0); 
      book.Close(); 
      app.Quit(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
     } 
     finally 
     { 
      if (range != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(range); 
      if (sheet != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); 
      if (sheets != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets); 
      if (book != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(book); 
      if (books != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(books); 
      if (app != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
     } 
+0

「dt」とは –

+0

申し訳ありませんもっと詳しく説明します。 DTはDataTableです –

+0

データテーブルを正しく初期化したと仮定します。次に、少なくとも1つのセルの内容が、データ型の列型の型と一致しません。 – alsaleem

答えて

2

あなたは実際には2つのドットルールに従っていません。 sheet.Cells[i + 1, 2].Value - それは2ドットです。 Rangeオブジェクト(セル)への参照を作成します。

明らかに、すべてのセルに対してRangeオブジェクトを作成してクリーンアップすることは苦痛です。 This linkを作成してRangeを作成し、値を配列に読み込む方法を示します。

もう1つの選択肢は、すべてのCOMオブジェクトを処理することに大きな苦労があるため、Excel.Interopをまったく使用しないことです。

Here's a linkEPPlusのコードでは、COMオブジェクトなしで同じことを行います。名前付き範囲の使用に関するいくつかの提案もあります。そのため、これらの行番号と列番号をすべて処理する必要はありません。

+2

私は人々が 'ReleaseComObject'と' 'two dots rule 'の使用について悪いアドバイスを広めるのをやめてほしいです。どこか誰かがこれを試してみると誰もがその例をコピーしましたが、それを処理する正しい方法ではありません。 [Visual Studioチームのこの投稿](https://blogs.msdn.microsoft.com/visualstudio/2010/03/01/marshal-releasecomobject-considered-dangerous/)を参照してください。実際に行う必要があるのは、GCがあなたのオブジェクトを収集して、それを行う方法に関する正しい指示があることです。[この回答](http://stackoverflow.com/questions/17130382/understanding-garbage-collection-in-net/17131389#17131389)、 –

+0

非常に興味深い。その場合、そこにはMSDNの多くの悪い情報があります。実際に 'Excel.Interop'を使用しなければならない場合は、もっと心配しています。しかし、Excelは数年前にXML形式ではなかったので、それは存在すると私は思えます。今では、Excelを自動化するのを嫌う人はいません。私は、a)マイクロソフトから来て、b)通常のプラクティスとみなされるアドバイスは、マイクロソフトの他の場所とは矛盾していることをむしろ迷惑にしている。多くの人がMSのドキュメントを無視し、他の* MSのドキュメントに耳を傾ける人はほとんどいません。 –

+0

GC.Collectとすべてが機能していましたが。私はExcel.Interopから離れました。そして、データを読み込む結果を10倍高速化します。ありがとう –

0

Essential XlsIOは、ExcelからDatableにデータをインポートできます。

Example code

//The first worksheet object in the worksheets collection is accessed. 
IWorksheet sheet = workbook.Worksheets[0]; 
//Get as DataTable 
DataTable datatable = sheet.ExportDataTable(sheet.UsedRange, ExcelExportDataTableOptions.ColumnNames); 
//Upload to dataset 
DataSet ds = new DataSet(); 
ds.Tables.Add(datatable); 

あなたは(収入未満100万米ドル)を修飾する場合は、コントロールのスイート全体がcommunity licenseプログラムを通じて(また、商用アプリケーション)を無料で利用できます。コミュニティライセンスは、制限や透かしのない完全な製品です。

注:私はSyncfusionのために働いています。

関連する問題