- - PR -
C#.netでExcelからデータ読み取りエラー
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-02-21 12:55
はじめまして。よろしくお願いいたします。
C#.netのコンソールアプリでExcelのデータを読み取る処理を行っていますが, 大量(8000ファイル程度)のExcelファイルを読み取ると 「Interop.Excel System.Runtime.InteropServices.COMException (0x800A03EC): HRESULT からの例外です : 0x800A03EC。」 という例外が発生してしまいます。 ソースは以下の通りですが,タスクマネージャで見てみると,最初に起動したExcel.exeが プロセス終了まで消えていないからではないかと思い,過去ログを参照していろいろと修正して みたのですが解消されません。 どなたかご教授願いますでしょうか。よろしくお願いいたします。 環境は,Windows2000 /.NET2003 /Excel2000 です。 <ソース> // 呼び元 //////////////////////////////////// for ( i = 0 ; i < DATANUM ; i++) ← DATANUM=8000 { bolRet = mSub_ReadGnjTbl( strFile, ref strNo1, ref strNo2); } // Excelファイル読込関数 static bool mSub_ReadGnjTbl( string strFileName, ref string strOutNo , ref string strPtMngNo) { Excel.Application objXL=null; // Excelアプリケーション Excel._Workbook objWB=null; // Excelブック Excel._Worksheet objWS=null; // Excelシート Excel.Range objRng=null; // Range try { // ファイルがない場合はエラー if ( File.Exists( strFileName ) != true) { return false; } //ファイルオープン objXL = new Excel.Application(); objXL.Application.Visible = false; objWB = (Excel._Workbook)(objXL.Workbooks.Open(strFileName, Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Type.Missing)); objWS = (Excel._Worksheet)objWB.Worksheets.get_Item(CmnDef.SHT_BASE) ; objRng = ( Excel.Range) objWS.get_Range("C6","C6"); // データ取得 if ( objRng.Value2 != null) { strOutNo = objRng.Value2.ToString(); } else { strOutNo =null; } // データ取得 objRng = ( Excel.Range) objWS.get_Range("F6","F6"); if ( objRng.Value2 != null) { strPtMngNo = objRng.Value2.ToString (); } else { strPtMngNo =null; } return true; } catch( Exception ex) { m_EvtLog.PutLog( ex.Source, ex.ToString(), EventLogEntryType.Error, EvtLog.enEventIdType.Unyou ); return false; } finally { if( objXL != null ) { objWB.Close(false,Type.Missing ,Type.Missing ); objXL.Quit(); objXL.DisplayAlerts = true; System.Runtime.InteropServices.Marshal.ReleaseComObject(objRng); System.Runtime.InteropServices.Marshal.ReleaseComObject(objWS); System.Runtime.InteropServices.Marshal.ReleaseComObject(objWB); System.Runtime.InteropServices.Marshal.ReleaseComObject(objXL); objRng= null; objWS =null; objWB =null; objXL = null; System.GC.Collect(); } } } |
|
投稿日時: 2005-02-21 13:11
どうぞ
http://naka.wankuma.com/site/column/dotnet/00001.htm 安直なオブジェクト操作は危険です。 _________________ 中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP http://naka.wankuma.com/ http://blogs.wankuma.com/naka/ naka@wankuma.com |
|
投稿日時: 2005-02-21 14:13
中博俊様 返答ありがとうございます。
教えていただいたURLを参考に以下のように直しましたがやはり現象が回避されません。 以下のソースで型変換を行わないとコンパイルエラーになる箇所がありそこが問題かと 思いますが,どう対処すべきかわかりません。 恐れ入りますが再度ご教授願いますでしょうか。よろしくお願いいたします。 static bool mSub_ReadGnjTbl( string strFileName, ref string strOutNo , ref string strPtMngNo) { Excel.Application objXL=null; // Excelアプリケーション Excel.Workbooks objWBS=null; Excel._Workbook objWB=null; // Excelブック Excel.Sheets objWSS=null; Excel._Worksheet objWS=null; // Excelシート Excel.Range objRng=null; // Range try { 〜 略 〜 //ファイルオープン objXL = new Excel.Application(); objXL.Application.Visible = false; objWBS = objXL.Workbooks; objWB = (objWBS.Open(strFileName, Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Type.Missing)); objWSS = objWB.Worksheets ; objWS = (Excel._Worksheet) objWSS.get_Item(CmnDef.SHT_BASE) ; ←ここが型変換を行わないとエラーになる箇所です。 objRng = objWS.get_Range("C6","C6"); 〜 略 〜 finally { if( objXL != null ) { objXL.DisplayAlerts = true; System.Runtime.InteropServices.Marshal.ReleaseComObject(objRng); System.Runtime.InteropServices.Marshal.ReleaseComObject(objWS); System.Runtime.InteropServices.Marshal.ReleaseComObject(objWSS); objWB.Close(false,Type.Missing ,Type.Missing ); System.Runtime.InteropServices.Marshal.ReleaseComObject(objWB); System.Runtime.InteropServices.Marshal.ReleaseComObject(objWBS); objXL.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(objXL); objRng= null; objWS =null; objWSS = null; objWB =null; objWBS =null; objXL = null; System.GC.Collect(); } } } |
1