关于asp.net访问Excel的问题

    技术2022-05-11  30

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

     


    最新回复(0)