关于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); } }