Neste artigo, você aprenderá como criar, ler e editar planilhas do Excel em um aplicativo ASP.NET MVC. Para isso, criaremos um aplicativo de planilha que consiste em um controle de grade rico em recursos para exibir e editar arquivos do Excel, conforme mostrado abaixo.

API .NET para criar aplicativo de planilha ASP.NET MVC

Para criar o aplicativo de planilha em ASP.NET MVC, usaremos Aspose.Cells.GridJs. A API permite que você crie aplicativos baseados na web para exibir ou editar documentos de planilha de forma rápida e fácil. Além disso, você pode importar os formatos de arquivo de planilha populares (XLS, XLSX, XLSM, XLSB, CSV, SpreadsheetML, ODS) (leia mais). Além disso, fornece um mecanismo de cálculo de fórmula forte e rico para calcular não apenas as funções internas, mas também as fórmulas personalizadas. Você pode instalar o Aspose.Cells.GridJs de NuGet.

PM> Install-Package Aspose.Cells.GridJs

Etapas para criar um aplicativo de planilha ASP.NET MVC

A seguir estão as etapas para criar um aplicativo de planilha baseado na Web no ASP.NET MVC.

  1. Crie um novo aplicativo Web ASP.NET Core (Model-View-Controller) no Visual Studio.
  1. Instale o Aspose.Cells.GridJs do NuGet.
  1. Insira o seguinte código em HomeController.cs.
public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return RedirectToRoute("default",
          new { controller = "GridJs2", action = "List" });
        }

        public IActionResult Privacy()
        {
            return Redirect("https://about.aspose.app/legal/privacy-policy");
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
  1. Crie uma nova classe chamada TestConfig.cs na pasta Models e adicione o código a seguir (altere os caminhos da pasta de acordo com seu ambiente).
public class TestConfig
{
    ///<summary>
    /// o diretório que contém os arquivos da pasta de trabalho
    ///</summary>
    internal static String ListDir = @"D:\tmpdel\storage\wb";
    ///<summary>
    /// temp diretório para armazenar arquivos
    ///</summary>
    internal static String TempDir = @"D:\tmpdel\storage\wb\tmp\";
}
  1. Crie uma nova classe chamada LocalFileCache.cs na pasta Models e adicione o código a seguir.
/* Add the following namespaces as well.
using Aspose.Cells.GridJs;
using System.IO;
*/

public class LocalFileCache : GridCacheForStream
{

    ///<summary>
    /// Implemente este método para salvar cache, salve o fluxo no objeto de cache com o ID da chave.
    ///</summary>
    ///<param name="s"> o fluxo de origem</param>
    ///<param name="uid"> ele id chave.</param>
    public override void SaveStream(Stream s, String uid)
    {
        String filepath = Path.Combine(Config.FileCacheDirectory + Path.DirectorySeparatorChar + "streamcache", uid.Replace('/', '.'));
        using (FileStream fs = new FileStream(filepath, FileMode.Create))
        {
            s.Position = 0;
            s.CopyTo(fs);
        }

    }

    ///<summary>
    /// Implemente este método para loadcache com a chave uid, retorne o fluxo do objeto de cache.
    ///</summary>
    ///<param name="uid"> o código da chave</param>
    ///<returns> o fluxo do cache</returns>
    public override Stream LoadStream(String uid)
    {
        String filepath = Path.Combine(Config.FileCacheDirectory + Path.DirectorySeparatorChar + "streamcache", uid.Replace('/', '.'));
        FileStream fs = new FileStream(filepath, FileMode.Open);
        return fs;
    }
    ///<summary>
    /// implementa a url no controlador de ação para obter o arquivo
    ///</summary>
    ///<param name="uid"> o código da chave</param>
    ///<returns></returns>
    public override String GetFileUrl(string uid)
    {
        return "/GridJs2/GetFile?id=" + uid;
    }

}
  1. Crie um novo controlador chamado GridJs2Controller.cs e adicione o código a seguir.
/* Add the following namespaces as well.
System.IO;
System.Collections;
System.Threading;
Microsoft.AspNetCore.StaticFiles;
Aspose.Cells.GridJs;
*/


[Route("[controller]/[action]")]
[ApiController]
public class GridJs2Controller : Controller
{

    public ActionResult List()
    {
        //this.ViewBag.list = nova Lista<object> ();
        ArrayList dirlistsss = new ArrayList();
        ArrayList filelistsss = new ArrayList();

        DirectoryInfo dir = new DirectoryInfo(TestConfig.ListDir);

        //encontrar arquivos no diretório
        FileInfo[] fi = dir.GetFiles();
        foreach (FileInfo f in fi)
        {
            String fname = f.FullName.ToString();
            dirlistsss.Add(fname);
            filelistsss.Add(Path.GetFileName(fname));
        }
        //  Ver dados.
        ViewBag.dirlist = dirlistsss;
        ViewBag.filelist = filelistsss;
        return View("~/Views/Home/list.cshtml");
    }

    // GET: /GridJs2/DetailJson?filename=
    public ActionResult DetailFileJson(string filename)
    {


        String file = Path.Combine(TestConfig.ListDir, filename);

        return DetailJson(file);
    }



    private ActionResult DetailJson(string path)
    {
        GridJsWorkbook wbj = new GridJsWorkbook();


        try
        {
            GridInterruptMonitor m = new GridInterruptMonitor();
            wbj.SetInterruptMonitorForLoad(m, 50 * 1000);
            Thread t1 = new Thread(new ParameterizedThreadStart(InterruptMonitor));
            t1.Start(new object[] { m, 90 * 1000 });




            using (FileStream fs = new FileStream(path, FileMode.Open))
            {
                wbj.ImportExcelFile(fs, GridJsWorkbook.GetGridLoadFormat(Path.GetExtension(path)));
            }

        }
        catch (Exception ex)
        {

            if (ex is GridCellException)
            {
                return Content(wbj.ErrorJson(((GridCellException)ex).Message + ((GridCellException)ex).Code), "text/plain", System.Text.Encoding.UTF8);
            }
            return Content(wbj.ErrorJson(ex.Message), "text/plain", System.Text.Encoding.UTF8);
        }
        //return File(stream, "application/octet-stream", "streamfile");
        return Content(wbj.ExportToJson(), "text/plain", System.Text.Encoding.UTF8);
    }
    private static void InterruptMonitor(object o)
    {
        object[] os = (object[])o;
        try
        {
            Thread.Sleep((int)os[1]);

            ((GridInterruptMonitor)os[0]).Interrupt();
        }
        catch (ThreadInterruptedException e)
        {
            Console.WriteLine("Succeeded for load in give time.");
        }
    }
    [HttpPost]
    // post: /GridJs2/UpdateCell
    public ActionResult UpdateCell()
    {

        string p = HttpContext.Request.Form["p"];
        string uid = HttpContext.Request.Form["uid"];
        GridJsWorkbook gwb = new GridJsWorkbook();
        String ret = gwb.UpdateCell(p, uid);

        return Content(ret, "text/plain", System.Text.Encoding.UTF8);
    }


    // GET: /GridJs2/Xspreadtml
    public ActionResult Xspreadtml(String filename)
    {
        return Redirect("~/xspread/index.html?file=" + filename);
    }

    // GET: /GridJs2/Image?uid=&id=

    public FileResult Image()
    {

        string fileid = HttpContext.Request.Query["id"];
        string uid = HttpContext.Request.Query["uid"];

        return new FileStreamResult(GridJsWorkbook.GetImageStream(uid, fileid), "image/png");
    }

    //se usar GridCacheForStream você precisa definir esta api
    // GET: /GridJs2/ImageUrl?uid=&id=
    public JsonResult ImageUrl(string id, string uid)
    {


        return new JsonResult(GridJsWorkbook.GetImageUrl(uid, id, "."));

    }
    private string GetMimeType(string FileName)
    {
        string contentType;
        new FileExtensionContentTypeProvider().TryGetContentType(FileName, out contentType);
        return contentType ?? "application/octet-stream";
    }




    // GET: /GridJs2/GetFile?id

    public FileResult GetFile(string id)
    {

        string fileid = id;
        string mimeType = GetMimeType(fileid);

        return File(GridJsWorkbook.CacheImp.LoadStream(fileid), mimeType, fileid.Replace('/', '.'));
    }


    ///<summary>
    /// ⇬ Fazer download do arquivo
    ///</summary>
    ///<returns></returns>
    [HttpPost]

    public JsonResult Download()
    {

        string p = HttpContext.Request.Form["p"];
        string uid = HttpContext.Request.Form["uid"];
        string filename = "123.xlsx";

        GridJsWorkbook wb = new GridJsWorkbook();
        wb.MergeExcelFileFromJson(uid, p);



        GridInterruptMonitor m = new GridInterruptMonitor();
        wb.SetInterruptMonitorForSave(m);
        Thread t1 = new Thread(new ParameterizedThreadStart(InterruptMonitor));
        t1.Start(new object[] { m, 30 * 1000 });
        try
        {
            wb.SaveToCacheWithFileName(uid, filename, null);
        }
        catch (Exception ex)
        {

            if (ex is GridCellException)
            {
                return Json(((GridCellException)ex).Message + ((GridCellException)ex).Code);
            }
        }
        if (filename.EndsWith(".html"))
        {
            filename += ".zip";
        }
        String fileurl = GridJsWorkbook.CacheImp.GetFileUrl(uid + "/" + filename);
        return new JsonResult(fileurl);
    }


}
  1. Insira o seguinte código na função Configure do Startup.cs e defina o caminho do arquivo de licença (get a license for free).
/* Add the following namespace as well.
using Aspose.Cells.GridJs;
*/

License l = new License();
LocalFileCache mwc = new LocalFileCache();
GridJsWorkbook.CacheImp = mwc;
l.SetLicense(@"D:\licenses\Conholdate.Total.Product.Family.lic");
  1. Insira o seguinte código em Views/Home/index.cshtml.
@{
    ViewData["Title"] = "Home Page";
}
  1. Crie uma nova visualização chamada list.cshtml na pasta Views/Home/ e insira o código a seguir.
<div id="body" style="  width: 800px; height: 800px; border: 1px solid; overflow-y: scroll; SCROLLBAR-BASE-COLOR: #8ccc8c;">
    @foreach (var item in ViewBag.filelist)
    {
        <a href="Xspreadtml?filename=@item" target="_blank"><em> @item   </em>  </a> <br />
    }
</div>
  1. Baixe a pasta xspread do GitHub e coloque-a na pasta wwwroot, conforme mostrado abaixo.
  1. Certifique-se de que o número da porta especificado em wwwroot/xspread/index.html seja o mesmo que o número da porta do projeto.

  2. Construa o aplicativo e execute-o em seu navegador favorito.

Demo - Crie ou edite arquivos do Excel no ASP.NET MVC

A seguir está a demonstração do aplicativo de planilha ASP.NET MVC que acabamos de criar.

Baixar código fonte

Você pode baixar o código-fonte completo do aplicativo de planilha do GitHub.

Obtenha uma licença gratuita

Você pode usar Aspose.Cells.GridJs sem limitações de avaliação usando uma licença temporária.

Conclusão

Neste artigo, você aprendeu como criar um aplicativo de planilha ASP.NET MVC com uma variedade de recursos para criar e editar arquivos do Excel e de outras planilhas. Você pode personalizar este aplicativo ou integrá-lo em seu próprio aplicativo da web. Caso você tenha alguma dúvida, sinta-se à vontade para postar em nosso fórum.

Veja também