用ASP.NET进行Excel操作,主要问题集中在两点:
1、 运行权限
1) Web.config中:<identity impersonate="true"/>
2) 管理工具>组件服务>计算机>我的电脑>DCOM配置>Microsoft Excel Application>右键>属性>安全
a. 启用和激活权限>自定义>添加IUSR_XXX>勾上本地启动和本地激活权限
b. 访问权限>自定义>添加IUSR_XXX>勾上本地访问权限
2、 Excel进程的关闭
a) 在打开或者新建excel,word的时候,先将当前进程里的word,excel进程的ID记录下来(这些有可能是属于用户已经打开的word或者excel进程,最后删除的时候这些进程是不能kill掉的)
//
在打开excel前,将系统里面已经存在的excel进程进程ID保存起来
List < int > intList = new List < int > ();
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
... {
if (p.ProcessName.ToUpper() == "EXCEL")
...{
intList.Add(p.Id);
}
}
List < int > intList = new List < int > ();
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
... {
if (p.ProcessName.ToUpper() == "EXCEL")
...{
intList.Add(p.Id);
}
}
b) 进行excel操作
Application app
=
new
Application();
Workbook workbook = app.Workbooks.Open(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Worksheet worksheet = (Worksheet)workbook.Worksheets[ 1 ];
workbook.Close(Type.Missing, Type.Missing, Type.Missing);
app.Quit();
Workbook workbook = app.Workbooks.Open(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Worksheet worksheet = (Worksheet)workbook.Worksheets[ 1 ];
workbook.Close(Type.Missing, Type.Missing, Type.Missing);
app.Quit();
c) 关闭就是如何关闭刚才新建的excel进程
//
先用系统提供的方法对系统资源释放,这种做法是大家常用的方法
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();
// 以下是我的新方法,如果还对象还没有释放的话kill掉新线程
if (app != null )
... {
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
...{
//先判断当前进程是否是excel
if (p.ProcessName.ToUpper() == "EXCEL")
...{
//需要判断这个进程是用户打开的还是属于新建的进程,如果用户没有打开过excel,则直接kill掉这个进程
if (intList != null && intList.Count > 0)
...{
//用来标志是否是程序新建的
bool bNewID=true;
foreach (int existId in intList)
...{
if (existId == p.Id)
...{
bNewID = false;
break;
}
}
//如果没有匹配到的话,说明是程序新建的,则删除他
if (bNewID == true)
...{
p.Kill();
}
}
//之前没有打开过excel进程,则直接kill掉他
else
...{
p.Kill();
}
}
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();
// 以下是我的新方法,如果还对象还没有释放的话kill掉新线程
if (app != null )
... {
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
...{
//先判断当前进程是否是excel
if (p.ProcessName.ToUpper() == "EXCEL")
...{
//需要判断这个进程是用户打开的还是属于新建的进程,如果用户没有打开过excel,则直接kill掉这个进程
if (intList != null && intList.Count > 0)
...{
//用来标志是否是程序新建的
bool bNewID=true;
foreach (int existId in intList)
...{
if (existId == p.Id)
...{
bNewID = false;
break;
}
}
//如果没有匹配到的话,说明是程序新建的,则删除他
if (bNewID == true)
...{
p.Kill();
}
}
//之前没有打开过excel进程,则直接kill掉他
else
...{
p.Kill();
}
}
}
}
Excel进程关闭抄自:http://www.cnblogs.com/farrell/archive/2008/01/25/1053349.html,版权归原作者。