2015-02-10 63 views
0

我想在asp.net中創建Excel工作表。我已經完成了代碼,它在本地系統中工作正常,但是當我在服務器上測試它時,它會出現以下錯誤。如何在asp.net中創建Excel文件

檢索COM類工廠CLSID {00024500-0000-0000-C000-000000000046}組件失敗,原因是以下錯誤:80070005。

我的代碼。

private static System.Data.DataTable GetDataSet() 
    { 
     System.Data.DataTable dt = new System.Data.DataTable("Table"); 
     dt.Columns.Add("Name", Type.GetType("System.String")); 
     dt.Columns.Add("Address", Type.GetType("System.String")); 
     dt.Columns.Add("Phone", Type.GetType("System.String")); 

     DataRow dr = dt.NewRow(); 
     dr["Name"] = "Balaji Selvarajan"; 
     dr["Address"] = "Reddiyur"; 
     dr["Phone"] = "000-000-0000"; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Name"] = "Balaji S"; 
     dr["Address"] = "Kattumannar Koil"; 
     dr["Phone"] = "000-000-0000"; 
     dt.Rows.Add(dr); 
     return dt; 
    } 


    private static void DataSetToExcel(System.Data.DataTable dt, Boolean generateIdentity) 
    { 
     try 
     { 
      string Filename = HttpContext.Current.Server.MapPath("~/Doc/") + "Test.xls"; 
      string imagepath1 = HttpContext.Current.Server.MapPath("~/Doc/") + "Test.xls"; 
      FileInfo fi = new FileInfo(HttpContext.Current.Server.MapPath("~/Doc/") + "Test.xls"); 
      if (fi.Exists) 
      { 
       fi.Delete(); 
      } 
      Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
      xlApp.Visible = false; 
      Microsoft.Office.Interop.Excel.Workbook wb = xlApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 
      object misValue = System.Reflection.Missing.Value; 
      Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add(misValue, misValue, misValue, misValue); 
      ws.Name = "Test"; 

      for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       for (int j = 0; j < dt.Columns.Count; j++) 
       { 
        if (i == 0) 
         ws.Cells[1, j + 1] = dt.Columns[j].ColumnName; 
        ws.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString(); 
       } 
       ws.Protect("1235", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true); 
      } 
      wb.Protect("my", true, true); 
      wb.Password = "1235"; 
      wb.SaveAs(Filename, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, "1235", misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
      wb.Close(true, misValue, misValue); 
      xlApp.Visible = true; 
      xlApp.Quit(); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); 
      HttpContext.Current.Response.ContentType = "Application/Excel"; 
      string FilePath = imagepath1; 
      HttpContext.Current.Response.WriteFile(FilePath); 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=Test.xls"); 
      HttpContext.Current.Response.End(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
    protected void BtnDn_Click(object sender, EventArgs e) 
    { 
     DataSetToExcel(GetDataSet(), false); 
    } 

我無法解決這個問題,請幫助我。請儘快給我解決方案。

我正在使用Asp.net C#。

+0

到這裏看看: http://stackoverflow.com/questions/17785063/retrieving-the-com-class-factory-for-component-error-80070005-access-is-de – zvi 2015-02-10 09:33:56

+1

上使用Office服務器(如從asp.net)是[不支持](http://support.microsoft.com/kb/257757)。有幾個組件(也是免費的),可以讓你從asp.net生成Excel文件。 – 2015-02-10 10:38:22

+0

你可以給我這些免費軟件組件的URL用於生成Excel文件 – 2015-02-10 11:06:32

回答

1

嘗試用這種

 using System; 
    using System.Collections.Generic; 
    using System.Data; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using Office = Microsoft.Office.Core; 
    using Excel = Microsoft.Office.Interop.Excel; 

    namespace Excel 
    { 
     public class ExcelUtlity 
      {      

    public bool WriteDataTableToExcel(System.Data.DataTable dataTable, string worksheetName, string saveAsLocation, string ReporType)  { 
    Microsoft.Office.Interop.Excel.Application excel; 
Microsoft.Office.Interop.Excel.Workbook excelworkBook; 
Microsoft.Office.Interop.Excel.Worksheet excelSheet; 
Microsoft.Office.Interop.Excel.Range excelCellrange; 
try 
{ 
    // Start Excel and get Application object. 
    excel = new Microsoft.Office.Interop.Excel.Application(); 
    // for making Excel visible 
    excel.Visible = false; 
    excel.DisplayAlerts = false; 
    // Creation a new Workbook 
    excelworkBook = excel.Workbooks.Add(Type.Missing); 
    // Workk sheet    
    excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelworkBook.ActiveSheet; 
    excelSheet.Name = worksheetName; 
    excelSheet.Cells[1, 1] = ReporType; 
    excelSheet.Cells[1, 2] = "Date : " + DateTime.Now.ToShortDateString();    
    // loop through each row and add values to our sheet 
    int rowcount = 2; 
    foreach (DataRow datarow in dataTable.Rows) 
    { 
     rowcount += 1; 
     for (int i = 1; i <= dataTable.Columns.Count; i++) 
     { 
      // on the first iteration we add the column headers 
      if (rowcount == 3) 
      { 
       excelSheet.Cells[2, i] = dataTable.Columns[i-1].ColumnName; 
       excelSheet.Cells.Font.Color = System.Drawing.Color.Black; 
      } 
      excelSheet.Cells[rowcount, i] = datarow[i-1].ToString(); 
      //for alternate rows 
      if (rowcount > 3) 
      { 
       if (i == dataTable.Columns.Count) 
       { 
        if (rowcount % 2 == 0) 
        { 
         excelCellrange = excelSheet.Range[excelSheet.Cells[rowcount, 1], excelSheet.Cells[rowcount, dataTable.Columns.Count]]; 
         FormattingExcelCells(excelCellrange, "#CCCCFF", System.Drawing.Color.Black,false); 
        } 
       } 
      } 
     } 
    } 
    // now we resize the columns 
    excelCellrange = excelSheet.Range[excelSheet.Cells[1, 1], excelSheet.Cells[rowcount, dataTable.Columns.Count]]; 
    excelCellrange.EntireColumn.AutoFit(); 
    Microsoft.Office.Interop.Excel.Borders border = excelCellrange.Borders; 
    border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous; 
    border.Weight = 2d; 
    excelCellrange = excelSheet.Range[excelSheet.Cells[1, 1], excelSheet.Cells[2, dataTable.Columns.Count]]; 
    FormattingExcelCells(excelCellrange, "#000099", System.Drawing.Color.White, true); 
    //now save the workbook and exit Excel 
    excelworkBook.SaveAs(saveAsLocation);; 
    excelworkBook.Close(); 
    excel.Quit(); 
    return true; 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
    return false; 
} 
finally 
{ 
    excelSheet = null; 
    excelCellrange = null; 
    excelworkBook = null; 
} 
}  
    /// FUNCTION FOR FORMATTING EXCEL CELLS 

public void FormattingExcelCells(Microsoft.Office.Interop.Excel.Range range, string HTMLcolorCode, System.Drawing.Color fontColor, bool IsFontbool) 
    { 
     range.Interior.Color=System.Drawing.ColorTranslator.FromHtml(HTMLcolorCode); 
range.Font.Color = System.Drawing.ColorTranslator.ToOle(fontColor); 
if (IsFontbool == true) 
{ 
    range.Font.Bold = IsFontbool; 
} 
    } 

    } 
+1

這看起來有點奇怪,在ASP.Net Web應用程序中使用System.Windows.Forms。 – 2015-02-10 10:39:27

+0

上述代碼適用於Windows應用程序。我需要網絡應用程序。 – 2015-02-10 11:07:26

+0

我試圖將上面的代碼實現到Web應用程序,但顯示「Range」關鍵字中的錯誤。 – 2015-02-10 11:24:17

0

錯誤80070005是拒絕訪問錯誤。嘗試配置您的應用程序池爲本地系統(而不是ApplicationPoolIdentity)下運行,或嘗試在組件服務爲Excel授予權限:

  1. 從開始菜單,單擊運行,鍵入Dcomcnfg.exe。
  2. 在組件服務中,單擊控制檯根,展開組件服務,展開計算機,展開我的電腦,展開DCOMConfig。
  3. 搜索Microsoft Word 14.0對象庫。點擊它。
  4. 右鍵單擊並選擇屬性。
  5. 在安全選項卡上,選擇「啓動並激活」部分中的自定義。
  6. 單擊編輯並添加應用程序正在運行的應用程序池的標識。
  7. 重複上面對於「訪問權限」

程序池帳戶的解決方案一步就是從這裏開始:"Retrieving the COM class factory for component.... error: 80070005 Access is denied." (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

組件服務權限的答案是從這裏:Retrieving the COM class factory for component with CLSID failed due to the following error: 80070005 Access is denied