天天看點

asp.net excel 選擇檔案夾 批量導出 檢索COM 類工廠中CLSID 為 {00024500-0000-0000-C000-000000000046}的元件時失敗

 在用戶端(非服務端) ,選擇本地檔案夾,一次導出多個excel。

前台:

<div>
      <asp:LinkButton class="linktext" id="lnbExcel" runat="server" onclick="lnbExcel_Click" >
      導出excel</asp:LinkButton>
    </div>
      <script>
    function browseFolder(path) {


    try {


        var Message = "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //選擇框提示資訊


        var Shell = new ActiveXObject("Shell.Application");


        var Folder = Shell.BrowseForFolder(0, Message, 64, 17); //起始目錄為:我的電腦


        //var Folder = Shell.BrowseForFolder(0, Message, 0); //起始目錄為:桌面


        if (Folder != null) {


            Folder = Folder.items(); // 傳回 FolderItems 對象


            Folder = Folder.item(); // 傳回 Folderitem 對象


            Folder = Folder.Path; // 傳回路徑


            if (Folder.charAt(Folder.length - 1) != "\\") {


                Folder = Folder + "\\";
            }
            document.getElementById(path).value = Folder;


            return Folder;


        }


    }


    catch (e) {


        alert(e.message);


    }


}
 </script>
<table>


  <tr>


    <td>選擇導入資料源:</td>


    <td><asp:TextBox ID="path"
            runat="server"></asp:TextBox></td>


    <td><input type=button value="選擇" onclick="browseFolder('path')"></td>


  </tr>


</table>      

背景 

//導出EXCEL
        protected void lnbExcel_Click(object sender, EventArgs e)
        {
            #region dataTable導出到excel 彈出儲存對話框
            for (int i = 0; i < 2; i++)
            {
                string saveFileName = path.Text + i;


                int rowIndex = 1;      //開始寫入資料的單元格行
                int colIndex = 0;      //開始寫入資料的單元格列
                System.Reflection.Missing miss = System.Reflection.Missing.Value;
                Microsoft.Office.Interop.Excel.Application mExcel = new Microsoft.Office.Interop.Excel.Application();
                mExcel.Visible = false;
                Microsoft.Office.Interop.Excel.Workbooks mBooks = (Microsoft.Office.Interop.Excel.Workbooks)mExcel.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook mBook = (Microsoft.Office.Interop.Excel.Workbook)(mBooks.Add(miss));
                Microsoft.Office.Interop.Excel.Worksheet mSheet = (Microsoft.Office.Interop.Excel.Worksheet)mBook.ActiveSheet;
                //Microsoft.Office.Interop.Excel.Range er = mSheet.get_Range((object)"A1", System.Reflection.Missing.Value); //向Excel檔案中寫入标題文本
                //er.Value2 = fileName.Substring(0, fileName.LastIndexOf('.'));
                try
                {
                    colIndex++;
                    mSheet.Cells[1, colIndex] = "列1";//輸出DataGridView列頭名   




                    rowIndex++;
                    colIndex = 0;
                    colIndex++;
                    mSheet.Cells[rowIndex, colIndex] = "'" + "支部到";






                    //擷取你使用的excel 的版本号
                    string _strVersion = mExcel.Version;
                    int FormatNum = 0x00;
                    if (Convert.ToDouble(_strVersion) < 12)//You use Excel 97-2003
                    {


                        FormatNum = -4143;


                    }


                    else//you use excel 2007 or later
                    {


                        FormatNum = 56;
                    }


                    //儲存工作已寫入資料的工作表
                    mBook.SaveAs(saveFileName, FormatNum, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss);


                    //mBook.SaveAs(saveFileName, FormatNum, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss);
                }
                catch (Exception ee)
                {
                    throw new Exception(ee.Message);
                }
                            finally    //finally中的代碼主要用來釋放記憶體和中止程序()
                {
                    mBook.Close(true, miss, miss);
                    mBooks.Close();
                    mExcel.Quit();
                    //System.Runtime.InteropServices.Marshal.ReleaseComObject(er);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mSheet);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mBook);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mBooks);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mExcel);
                    GC.Collect();
                }
            }
            #endregion      

命名空間  using Microsoft.Office.Interop.Excel;

IE測試通過。在檔案名沖突時可能報其他錯誤。

另,在可能受服務端excel配置影響報一下錯誤:

  檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的元件失敗,原因是出現以下錯誤: 80070005 拒絕通路。 (異常來自 HRESULT:0x80070005 (E_ACCESSDENIED))。 

說明: 執行目前 Web 請求期間,出現未經處理的異常。請檢查堆棧跟蹤資訊,以了解有關該錯誤以及代碼中導緻錯誤的出處的詳細資訊。 

異常詳細資訊: System.UnauthorizedAccessException: 檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的元件失敗,原因是出現以下錯誤: 80070005 拒絕通路。 (異常來自 HRESULT:0x80070005 (E_ACCESSDENIED))。  (部分)...

附加決解方案連接配接 

http://blog.csdn.net/zijings8374/article/details/4256005

 (未測試 0..0)

檢索COM 類工廠中CLSID 為 {00024500-0000-0000-C000-000000000046}的元件時失敗

在項目中将資料導出為Excel格式時出現“檢索COM 類工廠中CLSID 為 {00024500-0000-0000-C000-000000000046}的元件時失敗,原因是出現以下錯誤: 80070005”,從網上搜了一下有如下解決方案:

1:在伺服器上安裝office的Excel軟體.

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

3:依次輕按兩下"元件服務"->"計算機"->"我的電腦"->"DCOM配置"

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

5:點選"辨別"标簽,選擇"互動式使用者"

6:點選"安全"标簽,在"啟動和激活權限"上點選"自定義",然後點選對應的"編輯"按鈕,在彈出的"安全性"對話框中填加

一個"ASP.net"使用者(注意要選擇本計算機名),并給它賦予"本地啟動"和"本地激活"權限.

7:依然是"安全"标簽,在"通路權限"上點選"自定義",然後點選"編輯",在彈出的"安全性"對話框中也填加一個"ASP.net"使用者,然後賦予"本地通路"權限.

這樣,我們便配置好了相應的Excel的DCOM權限.

注意:這是在WINxp上配置的,在2003上,ASP.net使用者改為NETWORK

SERVICE使用者。

根據上述操作了一遍,結果還是這個錯誤,後來在元件服務中又将“Microsoft Office Excel 預覽器”配置了一遍才解決問題,配置過程如下:

1、在"DCOM配置"中找到"Microsoft Office Excel 預覽器",在它上面點選右鍵,然後點選"屬性",彈出"Microsoft

Office Excel 預覽器屬性"對話框

2、點選"安全"标簽,在"啟動和激活權限"上點選"自定義",然後點選對應的"編輯"按鈕,在彈出的"安全性"對話框中填加