- PR -

C#.netでExcelからデータ読み取りエラー

1
投稿者投稿内容
rukio
会議室デビュー日: 2005/02/21
投稿数: 3
投稿日時: 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();
}
   }

  }



中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 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
rukio
会議室デビュー日: 2005/02/21
投稿数: 3
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)