asp.net導出excel 問題及服務器的部署dcom組件配置


一、服務器上沒有裝office

    如果要用MS的,這個問題基本不用考慮,只有安裝才能解決,沒有其它辦法! (即使有牛人弄出來 了,估計也是給自己找麻煩)

    不過,我只在服務器上裝了一個2003精簡版, 我開發是用的2007。

二、 "80080005異常"

  "80080005異常"是應用程序對COM組件操作權限不足引起的。於是有了下面的操作:

  1)控制面板->管理工具->組件服務->計算機->我的電腦->DCOM-> Microsoft Excel 應用程序

    2)單擊屬性打開此應用程序的屬性對話框。

    3) 單擊標識選項卡,然后選擇交互式用戶。

    4) 單擊默認安全性選項卡。設置當前服務器與ASP.NET相關的用戶的訪問權限。

  5)單擊啟動權限的編輯默認值。設置ASP.NET相關的用戶的訪問權限。

    6)主要是network service賬戶

三、 檢索COM類工廠中CLSID的組件時失敗80070005

  跟前面的方法差不多  具體配置方法如下:

  1:在服務器上安裝office的Excel軟件.

  2:在"開始"->"運行"中輸入dcomcnfg.exe啟動"組件服務"

  3:依次雙擊"組件服務"->"計算機"->"我的電腦"->"DCOM配置"

  4:在"DCOM配置"中找到"Microsoft Excel 應用程序",在它上面點擊右鍵,然后點擊"屬性",彈出"Microsoft Excel 應用程序屬性"對話框

  5:點擊"標識"標簽,選擇"交互式用戶"

  6:點擊"安全"標簽,在"啟動和激活權限"上點擊"自定義",然后點擊對應的"編輯"按鈕,在彈出的"安全性"對話框中填加一個"NETWORK SERVICE"用戶(注意要選擇本計算機  名),並給它賦予"本地啟動"和"本地激活"權限.

  7:依然是"安全"標簽,在"訪問權限"上點擊"自定義",然后點擊"編輯",在彈出的"安全性"對話框中也填加一個"NETWORK SERVICE"用戶,然后賦予"本地訪問"權限.

  8.如果交互式用戶設置后出現錯誤8000401a,可取消交互式用戶,指定為administratr,可暫時解決此問題。進一步的解決方式還有待探討。 

 

另外說明:光按以上設置並不能完全保證不出問題,因為調用OFFICE的操作可能涉及其他的系統資源,很可能依然權限不夠而導致問題,只是設置EXCEL應用程序后,還是可能會報80070005的錯誤,最保險的是應該在dcomcnfg中選中我的電腦然后右鍵屬性->com安全,將里面的訪問權限,啟動和激活權限全都編輯默認,在當中加上network service(iis 5.0的話,要加的是asp.net用戶),並如前面對networkservice設置上相同的權限,這樣基本上能保證不會再出什么問題。

 

四、"異常來自 HRESULT:0x800A03EC "的原因

    兩種情況,1、Excel的行列都是從1開始的,如果我們習慣性的給worksheet.Cells[0, 0]或者worksheet.Cells[1, 0]或者worksheet.Cells[0, 1]賦值,就會引發該異常。

    2、這里容易出錯

  “excel.ActiveWorkbook.SaveAs(FilePath + filename, Excel.XlFileFormat.xlExcel7, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);”

     在上面代碼保存的時候,格式很重要,每個版本的值都有所不同,最開始我在2007上另存成2003版本得到的是56(也就是xlExcel8),然而真正在代碼中卻是39(也就是xlExcel7)

導出和下載關鍵代碼!(WebExcel.ashx.cs)

private void NAR(object o)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                o = null;
            }
        }

        public void ExportExcel(HttpContext context, DataSet ds, string DownloadFilePath)
        {


            object objOpt = Missing.Value;
            Application excel = new Application();
            excel.Visible = false;
            excel.DisplayAlerts = false;            
            Workbook   wkb = excel.Workbooks.Add(objOpt);
            Worksheet wks = (Worksheet)wkb.ActiveSheet;

            wks.Visible = XlSheetVisibility.xlSheetVisible;
            

            int rowIndex = 1;
            int colIndex = 0;

            // DataTable table = ds.Tables[0];
            foreach (DataColumn col in ds.Tables[0].Columns)
            {
                colIndex++;
                excel.Cells[1, colIndex] = col.ColumnName;
            }

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                rowIndex++;
                colIndex = 0;
                foreach (DataColumn col in ds.Tables[0].Columns)
                {
                    colIndex++;
                    excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
                }
            }
            //excel.Sheets[0] = "sss";


            wkb.SaveAs(DownloadFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, null, null, false, false, XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
            NAR(wks);
            wkb.Close(false, objOpt, objOpt);
            NAR(wkb);            
            excel.Quit();
            NAR(excel);
            

            if (File.Exists(DownloadFilePath))
            {

                
                using (FileStream fs = new FileStream(DownloadFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    const int size = 4096;
                    byte[] buffer = new byte[size];
                    int pos = 0;
                    long dataToRead = fs.Length;
                    long arrange = 0;
                    if (context.Request.Headers["Range"] != null)
                    {
                        context.Response.StatusCode = 206;
                        arrange = long.Parse(context.Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
                    }
                    if (arrange != 0)
                    {
                        context.Response.AddHeader("Content-Range", "bytes " + arrange.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
                    }
                    context.Response.AddHeader("Content-Length", ((long)(dataToRead - arrange)).ToString());
                    //context.Response.ContentType = "application/octet-stream";
                    context.Response.ContentType = "application/ms-excel";
                    context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(Path.GetFileName(DownloadFilePath))));

                    fs.Position = arrange;
                    dataToRead = dataToRead - arrange;

                    while (dataToRead > 0)
                    {
                        if (context.Response.IsClientConnected)
                        {
                            pos = fs.Read(buffer, 0, size);

                            context.Response.OutputStream.Write(buffer, 0, pos);
                            context.Response.Flush();

                            dataToRead = dataToRead - pos;
                        }
                        else
                        {
                            dataToRead = -1;
                        }
                    }
                }
            }

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM