QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

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

 はじめまして。よろしくお願いいたします。
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();
}
   }

  }

質問者:rukio

回答

 中博俊様 返答ありがとうございます。
 教えていただいた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();
 }
 }

}

投稿者:rukio

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。