转载:ASP.NET中上传并读取Excel文件数据,附后生成EXCEL及杀掉EXCEL进程。

System.Reflection.Missing miss = System.Reflection.Missing.Value;

Excel.ApplicationClass m_objExcel = new Excel.ApplicationClass();

m_objExcel.Visible = false;

Excel.Workbooks m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;

Excel.Workbook m_objBook = (Excel.Workbook)(m_objBooks.Add(miss));

Excel.Worksheet m_objSheet = (Excel.Worksheet)m_objBook.ActiveSheet;

//向Excel文件中写入数据

Excel.Range er = m_objSheet.get_Range((object)"A1", System.Reflection.Missing.Value);

er.Value2 = "dfadfa";

m_objExcel.DisplayAlerts = false;

m_objBook.SaveAs(staFile + i.ToString() + ".xls", miss, miss, miss, miss, miss, Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss);

m_objBook.Close(false, miss, miss);

m_objBooks.Close();

m_objExcel.Quit();

if (m_objExcel != null)

{

int generation = 0;

m_objExcel.UserControl = false;

//如果您将 DisplayAlerts 属性设置为 False,则系统不会提示您保存任何未保存的数据。 _xlApp.DisplayAlerts = false;

if (m_objBook != null)

{

//如果将 Workbook 的 Saved 属性设置为 True,则不管您有没有进行更改,Excel 都不会提示保存它

//_xlWorkbook.Saved = true;

m_objExcel.Quit();

generation = System.GC.GetGeneration(m_objExcel);

m_objExcel = null;

System.GC.Collect(generation);

}

说明一下:

private Excel.Application _xlApp; //Excel应用程序

private Excel.Workbook _xlWorkbook; //获取Excel工作薄,默认为调用Open([Template])时创建

private Object oMissing = System.Reflection.Missing.Value; //实例化对象时缺省参数

我们实例并打开Excel时至少会用到

xlApp= new Excel.ApplicationClass();

创建一个Excel应用,可是一般每实例一次就产生一个Excel进程,这里提供安全彻底关闭实例Excel.Application后产生的进程,方法中的_xlWorkbook为实例ApplicationClass后

_xlWorkbook = _xlApp.Workbooks.Add(oMissing); //创建并返回Excel工作薄

/// <summary>

/// 关闭实例Excel.Application后产生的进程

/// </summary>

public void Close()

{

if (_xlApp != null)

{

int generation = 0;

_xlApp.UserControl = false;

//如果您将 DisplayAlerts 属性设置为 False,则系统不会提示您保存任何未保存的数据。

//_xlApp.DisplayAlerts = false;

if (_xlWorkbook != null)

{

//如果将 Workbook 的 Saved 属性设置为 True,则不管您有没有进行更改,Excel 都不会提示保存它

//_xlWorkbook.Saved = true;

try

{

// //经过实验,这两句写不写都不会影响进程驻留。

// //如果注释掉的话,即使用户手动从界面上关闭了本程序的Excel,也不会影响

// _xlWorkbook.Close(oMissing,oMissing,oMissing);

// _xlWorkbook = null;

}

catch

{

//用户手动从界面上关闭了本程序的Excel窗口

}

}

//即使用户手动从界面上关闭了,但是Excel.Exe进程仍然存在,用_xlApp.Quit()退出也不会出错,用垃圾回收彻底清除

_xlApp.Quit();

//System.Runtime.InteropServices.Marshal.ReleaseComObject((object)_xlApp);

generation = System.GC.GetGeneration(_xlApp);

_xlApp = null;

//虽然用了_xlApp.Quit(),但由于是COM,并不能清除驻留在内存在的进程,每实例一次Excel则Excell进程多一个。

//因此用垃圾回收,建议不要用进程的KILL()方法,否则可能会错杀无辜啊:)。

System.GC.Collect(generation);

}

oMissing = null;

}