En este artículo, aprenderá a crear, leer y editar hojas de cálculo de Excel en una aplicación ASP.NET MVC. Para ello, crearemos una aplicación de hoja de cálculo que consiste en un control de cuadrícula rico en funciones para mostrar y editar archivos de Excel, como se muestra a continuación.
- .NET API para crear una aplicación de hoja de cálculo ASP.NET
- Pasos para crear una aplicación de hoja de cálculo ASP.NET
- Manifestación
- Descargar código fuente
.NET API para crear una aplicación de hoja de cálculo ASP.NET MVC
Para crear la aplicación de hoja de cálculo en ASP.NET MVC, usaremos Aspose.Cells.GridJs. La API le permite crear aplicaciones basadas en web para mostrar o editar documentos de hojas de cálculo de forma rápida y sencilla. Además, puede importar los formatos de archivo de hoja de cálculo populares (XLS, XLSX, XLSM, XLSB, CSV, SpreadsheetML, ODS) (leer más). Además, proporciona un motor de cálculo de fórmulas sólido y rico para calcular no solo las funciones integradas sino también fórmulas personalizadas. Puede instalar Aspose.Cells.GridJs desde NuGet.
PM> Install-Package Aspose.Cells.GridJs
Pasos para crear una aplicación de hoja de cálculo ASP.NET MVC
Los siguientes son los pasos para crear una aplicación de hoja de cálculo basada en web en ASP.NET MVC.
- Cree una nueva aplicación web ASP.NET Core (modelo-vista-controlador) en Visual Studio.
- Instale Aspose.Cells.GridJs desde NuGet.
- Inserte el siguiente código en 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 });
}
}
- Cree una nueva clase llamada TestConfig.cs en la carpeta Modelos y agregue el siguiente código (cambie las rutas de la carpeta según su entorno).
public class TestConfig
{
///<summary>
/// el directorio que contiene los archivos del Workbook
///</summary>
internal static String ListDir = @"D:\tmpdel\storage\wb";
///<summary>
/// directorio temporal para almacenar archivos
///</summary>
internal static String TempDir = @"D:\tmpdel\storage\wb\tmp\";
}
- Cree una nueva clase denominada LocalFileCache.cs en la carpeta Models y agregue el siguiente código.
/* Add the following namespaces as well.
using Aspose.Cells.GridJs;
using System.IO;
*/
public class LocalFileCache : GridCacheForStream
{
///<summary>
/// Implemente este método para savecache, guarde la transmisión en el objeto de caché con la identificación de la clave.
///</summary>
///<param name="s"> el flujo de origen</param>
///<param name="uid"> él clave de identificación.</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 cargar la memoria caché con la clave uid, devuelva la transmisión desde el objeto de la memoria caché.
///</summary>
///<param name="uid"> la clave de identificación</param>
///<returns> el flujo del caché</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>
/// implementar la url en el controlador de acción para obtener el archivo
///</summary>
///<param name="uid"> la clave de identificación</param>
///<returns></returns>
public override String GetFileUrl(string uid)
{
return "/GridJs2/GetFile?id=" + uid;
}
}
- Cree un nuevo controlador llamado GridJs2Controller.cs y agregue el siguiente código.
/* 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 = nueva lista<object> ();
ArrayList dirlistsss = new ArrayList();
ArrayList filelistsss = new ArrayList();
DirectoryInfo dir = new DirectoryInfo(TestConfig.ListDir);
//buscar archivos en el directorio
FileInfo[] fi = dir.GetFiles();
foreach (FileInfo f in fi)
{
String fname = f.FullName.ToString();
dirlistsss.Add(fname);
filelistsss.Add(Path.GetFileName(fname));
}
// Ver datos.
ViewBag.dirlist = dirlistsss;
ViewBag.filelist = filelistsss;
return View("~/Views/Home/list.cshtml");
}
// OBTENER: /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(flujo, "aplicación/flujo de octetos", "archivo de flujo");
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]
// publicar: /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);
}
// OBTENER: /GridJs2/Xspreadtml
public ActionResult Xspreadtml(String filename)
{
return Redirect("~/xspread/index.html?file=" + filename);
}
// OBTENER: /GridJs2/Imagen?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");
}
//si usa GridCacheForStream, necesita configurar esta API
// OBTENER: /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";
}
// OBTENER: /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>
/// descargar archivo
///</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);
}
}
- Inserte el siguiente código en la función Configurar de Startup.cs y establezca la ruta del archivo de licencia (obtener una licencia gratis).
/* 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");
- Inserte el siguiente código en Views/Home/index.cshtml.
@{
ViewData["Title"] = "Home Page";
}
- Cree una nueva vista denominada list.cshtml en Views/Home/carpeta e inserte el siguiente código.
<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>
- Descargue la carpeta xspread de GitHub y colóquela en la carpeta wwwroot, como se muestra a continuación.
Asegúrese de que el número de puerto especificado en wwwroot/xspread/index.html sea el mismo que el número de puerto del proyecto.
Cree la aplicación y ejecútela en su navegador favorito.
Demostración: cree o edite archivos de Excel en ASP.NET MVC
La siguiente es la demostración de la aplicación de hoja de cálculo ASP.NET MVC que acabamos de crear.
Descargar código fuente
Puede descargar el código fuente completo de la aplicación de hoja de cálculo desde GitHub.
Obtenga una licencia gratis
Puede usar Aspose.Cells.GridJs sin limitaciones de evaluación usando una licencia temporal.
Conclusión
En este artículo, aprendió a crear una aplicación de hoja de cálculo ASP.NET MVC con una variedad de características para crear y editar Excel y otros archivos de hoja de cálculo. Puede personalizar esta aplicación o integrarla en su propia aplicación web. En caso de que tenga alguna consulta, no dude en publicarla en nuestro foro.