none
Error al utilizar Microsoft.Office.Interop.Excel RRS feed

  • Pregunta

  • Hola,

    mi intención es subir un documento en excel, leerlo y mostrar esa información en una tabla en una vista, para ello:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Excel = Microsoft.Office.Interop.Excel;
    using System.IO;
    using importExcelData.Models;
    
    namespace importExcelData.Controllers
    {
        public class ProductController : Controller
        {
            //
            // GET: /Product/
    
            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult Success()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult Import(HttpPostedFileBase excelfile )
            {
                if (excelfile == null || excelfile.ContentLength == 0)
                {
                    ViewBag.error = "Please select a excel file<br>";
                    return View("Index");
                }
                else
                {
                    
                    if (excelfile.FileName.EndsWith("xls") || excelfile.FileName.EndsWith("xlsx"))
                    {
                        string fileName = Path.GetFileName(excelfile.FileName);
                        string path = Path.Combine(Server.MapPath("~/Content"), fileName);
    
                        //string path = Server.MapPath("~/Content/" + excelfile.FileName);
                        if (System.IO.File.Exists(path))
                        {
                            System.IO.File.Delete(path);
                        }
                        excelfile.SaveAs(path);
    
                        //Read data from excel file
    
                        Excel.Application application = new Excel.Application();
                        Excel.Workbook workbook = application.Workbooks.Open(path);
                        Excel.Worksheet worksheet = workbook.ActiveSheet;
                        Excel.Range range = worksheet.UsedRange;
                        List<Product> listProducts = new List<Product>();
                        for (int row = 3; row <= range.Rows.Count; row++)
                        {
                            Product p = new Product();
                            p.Id = ((Excel.Range)range.Cells[row, 1]).Text;
                            p.Name = ((Excel.Range)range.Cells[row, 2]).Text;
                            p.Price = decimal.Parse(((Excel.Range)range.Cells[row, 3]).Text);
                            p.Quantity = int.Parse(((Excel.Range)range.Cells[row, 4]).Text);
    
                            listProducts.Add(p);
                        }
    
                        ViewBag.listProducts = listProducts;
                        return View("Success");
                    }
                    else
                    {
                        ViewBag.error = "File type is incorrect<br>";
                        return View("Index");
                    }
                }
                
            }
    
    
        }
    }



    Si lo corro desde visual studio funciona muy bien, pero al publicarlo en el servidor IIS me aparece el siguiente error:

    Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).

    esto ocurre en la linea de codigo:

    Excel.Application application = new Excel.Application();

    Agradezco cualquier ayuda.


    jueves, 25 de enero de 2018 22:32

Respuestas

  • hola

    En un ambiente web no utilices las librerias COM de office ya que necesitas intalar office en el servidor para que funcione

    usa librerias basadas en open xml como ser

    ClosedXML

    con esta libreria solo referencias la dll de .net sin necesidad de tener office instalado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 26 de enero de 2018 12:21

Todas las respuestas

  • Hola, lo mas probable es que no esta encontrando algún componente en el servidor, muchas veces esos componenetes se instalan con el officce y en los servidores no suele haber officce, tambien puedes instalar los PIA

    Microsoft Office 2010: Primary Interop Assemblies Redistributable


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 viernes, 26 de enero de 2018 1:34
    viernes, 26 de enero de 2018 1:33
  • hola

    En un ambiente web no utilices las librerias COM de office ya que necesitas intalar office en el servidor para que funcione

    usa librerias basadas en open xml como ser

    ClosedXML

    con esta libreria solo referencias la dll de .net sin necesidad de tener office instalado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 26 de enero de 2018 12:21
  • Voy a probar y te cuento como me fue
    lunes, 29 de enero de 2018 22:31
  • hola

    En un ambiente web no utilices las librerias COM de office ya que necesitas intalar office en el servidor para que funcione

    usa librerias basadas en open xml como ser

    ClosedXML

    con esta libreria solo referencias la dll de .net sin necesidad de tener office instalado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola amigo, como haría si lo que deseo es exportar a .xls? a .xlsx si lo hace en la app con el Closedxml.dll pero con el .xls da error... podrias ayudarme? gracias. 

    Tengo instalado el interop 2010 y el Office 2010 en un Server 2012 R2

    jueves, 22 de febrero de 2018 15:29