Importar datos de CSV a base de datos desde MVC5 mediante un formulario

publicado por: Anonymous

Estoy haciendo un proyecto y en este momento necesito importar datos de un archivos CSV “Excel” Delimitado por comas (,) cierta información, necesito que mediante un formulario puedan subir el excel y que dicho excel se importe automaticamente en la tabla dbo.Collaborators estoy usando MVC5 y SQL Server 2014.

Mi vista es la siguiente:

@model SI_OldMutual.Models.Collaborators

@{
    ViewBag.Title = "UploadPlanta";
}

<h2>UploadPlanta</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <div class="form-group">
        <input class="form-control" type="file" name="planta" /><br />
        <input class="btn btn-default" type="submit" value="Cargar" />
    </div>
}

Parte de mi controlador es el siguiente:

private SI_OldMutualContext db = new SI_OldMutualContext();

//  UploadPlanta
public ActionResult UploadPlanta()
{
    return View();
}

//POST UploadPlanta
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UploadPlanta([Bind(Include = "planta")] Collaborators collaborators)
{
    return View();
}

Parte de mi modelo:

[Key]
public int CollaboratorID { get; set; }
[Required]
[Display(Name = "Codigo")]
public string codigo { get; set; }
[Display(Name = "Cedula")]
public string cedula { get; set; }
[Display(Name = "Nombres")]
public string nombres { get; set; }
[Display(Name = "Fecha Ingreso")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime fecha_ingreso { get; set; }
[Display(Name = "Salario Basico")]
[DisplayFormat(DataFormatString = "{0:C0}", ApplyFormatInEditMode = false)]
public decimal salario_basico { get; set; }
[Display(Name = "Salario Cargo")]
[DisplayFormat(DataFormatString = "{0:C0}", ApplyFormatInEditMode = false)]
public decimal salario_cargo { get; set; }
[Display(Name = "Regimen")]
public string regimen { get; set; }
[Display(Name = "Tipo de Contrato")]
public string tipo_contrato { get; set; }
[Display(Name = "Ciudad")]
public string ciudad { get; set; }

Explicacion: necesito que mediante dicho formulario puedan insertar el archivo CSV delimitado por comas y al momento de darle cargar automáticamente la información que esta en dicho archivo se importe en la tabla Collaborators correspondiente al modelo.

He estado revisando varios ejemplos en grupos de internet y de StackOverFlow pero no doy con un ejemplo claro con respecto a lo que necesito, cualquier aporte es de bastante utilidad.

Cabe destacar que estoy usando MVC5 en visual studio 2015.

solución

Lo primero, es recibir en el Controller el archivo que has subido, guardarlo en el servidor, leerlo con Linq y almacenarlo en base de datos:

[HttpPost]
public ActionResult UploadPlanta(HttpPostedFileBase file)
{
    try
    {
        if (file.ContentLength > 0)
        {
            //Guardado del archivo en el server
            string _FileName = Path.GetFileName(file.FileName);
            string _path = Path.Combine(Server.MapPath("~/Uploads"), _FileName);
            file.SaveAs(_path);

            //Leemos el CSV y lo pasamos a una lista
            List<Collaborators> listaColaboradores = (from p in File.ReadAllLines(_path)
                                    let parts = p.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                    select new Collaborators 
                                    {
                                        CollaboratorID = Convert.ToInt32(parts[0]),
                                        codigo = parts[1],
                                        cedula = parts[2],
                                        nombres = parts[3],
                                        fecha_ingreso = Convert.ToDateTime(parts[4]),
                                        salario_basico = Convert.ToDecimal(parts[5]),
                                        salario_cargo = Convert.ToDecimal(parts[6]),
                                        regimen = parts[7],
                                        tipo_contrato = parts[8],
                                        ciudad = parts[9]
                                    }).ToList();

            //Guardamos toda la información de esa lista en base de datos
            using (var context = new ApplicationDbContext())
            {
                foreach(var colaborador in listaColaboradores){
                    context.Collaborators.Add(colaborador);
                }

                context.SaveChanges();
            }
        }
        ViewBag.Message = "El archivo se subió y procesó correctamente";
        return View();
    }
    catch (Exception ex)
    {
        ViewBag.Message = "Error procesando la información: " + ex.Message;
        return View();
    }
}

Toma en cuenta que al leer el archivo, cada part[X] va a ir mapeando a una columna del CSV, esa parte la tienes que ajustar dependiendo del diseño del archivo CSV.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *