关于asp.net访问Excel的问题,现在已经出现了很多了,我只谈谈几个比较典型的问题
1.权限问题
相信用过Excel.exe的朋友都遇到过拒绝访问的问题,我在这里把所有的解决方法都说下
1.首先要保证运行Excel.exe的机器上有Office,版本要和你用的Excel.exe要相同。
2.定位到C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322 这个目录你会看见2个文件夹,Temporary ASP.NET Files和ASP.NETClientFiles,把这个2个文件夹都赋值上asp.net,administrators的完全访问权限
3.定位到C:/Documents and Settings你会看见一个和你的计算机名字一样的文件夹,打开他里面有个ASPNET文件夹,把改文件夹赋值上asp.net,administrators的完全访问权限
4.打开组件服务管理器(控制面板里面)定位到计算机-》我的电脑-》DCOM配置-》microsft Excel,右键属性,然后点安全,把这3个权限设置都用自定义设置,都添加上asp.net, IUSER, IWAM, administrator,everyone都赋值上完全控制权限。
到现在基本上就可以解决asp.net拒绝访问的问题
2.Excel能够成功访问,但是成功访问后进程不能自动关闭,这是个非常危险的事情,在这里我提供一个比较好的办法,不是手动去杀进程,我看了很多资料总觉得这个方法是最好的
private void ExecExcel(string file)
{
if(System.IO.File.Exists(file))
System.IO.File.Delete(file);
Application exc=new Excel.ApplicationClass();
exc.Visible=false;
exc.UserControl=false;
exc.DisplayAlerts=false;
Workbooks workbooks=exc.Workbooks;
_Workbook workbook=workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Sheets sheets=workbook.Worksheets;
_Worksheet worksheet=(_Worksheet)sheets.get_Item(1);
//....这里可以做很多需要做的事情
workbook.SaveAs(file,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlExclusive,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
workbook.Close(null,null,null);
exc.Workbooks.Close();
exc.Application.Quit();
exc.Quit();
this.ReleaseComBoject(worksheet);
this.ReleaseComBoject(workbook);
this.ReleaseComBoject(exc);
}
private void ReleaseComBoject(object obj)
{
if(obj==null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj=null;
}
}
//以上上执行Excel的常规代码,下面是调用代码
public delegate void CallExcelDel(string file);
private void Button1_Click(object sender, System.EventArgs e)
{
try
{
string file=Server.MapPath(@"DownLoad/temp/"+Session["EmployerID"].ToString()+"YWYTICJB.xls");//位置可以任意指定,但是要有访问权限
CallExcelDel del=new CallExcelDel (this.ExecExcel);
IAsyncResult ar=del.BeginInvoke(file,null,null);//异步调用执行Excel的方法
while(!ar.IsCompleted)
{
System.Threading.Thread.Sleep(300);
}
GC.Collect();//这条语句非常关键,调用的时候一定要在主线程中调用,完毕后你会发现Excel进程不见了
this.DownloadFile(file);
}
catch(Exception E)
{
Response.Write(E.Message);
}
}