在本文中,您将学习如何在 ASP.NET MVC 应用程序中创建、读取和编辑 Excel 电子表格。为此,我们将创建一个由功能丰富的网格控件组成的电子表格应用程序,以显示和编辑 Excel 文件,如下所示。
.NET API 创建 ASP.NET MVC 电子表格应用程序
为了在 ASP.NET MVC 中创建电子表格应用程序,我们将使用 Aspose.Cells.GridJs。该 API 允许您创建基于 Web 的应用程序来快速轻松地显示或编辑电子表格文档。此外,您可以导入流行的电子表格(XLS、XLSX、XLSM、XLSB、CSV、SpreadsheetML、ODS)文件格式(阅读更多)。此外,它提供强大而丰富的公式计算引擎,不仅可以计算内置函数,还可以计算自定义公式。您可以从 NuGet 安装 Aspose.Cells.GridJs。
PM> Install-Package Aspose.Cells.GridJs
创建 ASP.NET MVC 电子表格应用程序的步骤
以下是在 ASP.NET MVC 中创建基于 Web 的电子表格应用程序的步骤。
- 在 Visual Studio 中创建一个新的 ASP.NET Core Web 应用(模型-视图-控制器)。
- 从 NuGet 安装 Aspose.Cells.GridJs。
- 将以下代码插入 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 });
}
}
- 在 Models 文件夹中创建一个名为 TestConfig.cs 的新类并添加以下代码(根据您的环境更改文件夹路径)。
public class TestConfig
{
///<summary>
/// 包含工作簿文件的目录
///</summary>
internal static String ListDir = @"D:\tmpdel\storage\wb";
///<summary>
///temp 存放文件的目录
///</summary>
internal static String TempDir = @"D:\tmpdel\storage\wb\tmp\";
}
- 在 Models 文件夹中创建一个名为 LocalFileCache.cs 的新类并添加以下代码。
/* Add the following namespaces as well.
using Aspose.Cells.GridJs;
using System.IO;
*/
public class LocalFileCache : GridCacheForStream
{
///<summary>
/// 实现这个方法来保存缓存,将流保存到带有key id的缓存对象中。
///</summary>
///<param name="s">源流</param>
///<param name="uid">他的钥匙ID。</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>
/// 实现这个方法,用key uid加载缓存,从缓存对象中返回流。
///</summary>
///<param name="uid">密钥标识</param>
///<returns>来自缓存的流</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>
/// 在动作控制器中实现 url 以获取文件
///</summary>
///<param name="uid">密钥标识</param>
///<returns></returns>
public override String GetFileUrl(string uid)
{
return "/GridJs2/GetFile?id=" + uid;
}
}
- 创建一个名为 GridJs2Controller.cs 的新控制器并添加以下代码。
/* 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 = 新列表<object>();
ArrayList dirlistsss = new ArrayList();
ArrayList filelistsss = new ArrayList();
DirectoryInfo dir = new DirectoryInfo(TestConfig.ListDir);
//查找目录下的文件
FileInfo[] fi = dir.GetFiles();
foreach (FileInfo f in fi)
{
String fname = f.FullName.ToString();
dirlistsss.Add(fname);
filelistsss.Add(Path.GetFileName(fname));
}
// 查看数据。
ViewBag.dirlist = dirlistsss;
ViewBag.filelist = filelistsss;
return View("~/Views/Home/list.cshtml");
}
// 获取:/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 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]
// 发布:/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);
}
// 获取:/GridJs2/Xspreadtml
public ActionResult Xspreadtml(String filename)
{
return Redirect("~/xspread/index.html?file=" + filename);
}
// 获取:/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");
}
//如果使用 GridCacheForStream 你需要设置这个 api
// 获取:/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";
}
// 获取:/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>
/// 下载文件
///</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);
}
}
- 在 Startup.cs 的 Configure 函数中插入以下代码,并设置许可文件的路径(免费获取许可)。
/* 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");
- 在 Views/Home/index.cshtml 中插入以下代码。
@{
ViewData["Title"] = "Home Page";
}
- 在 Views/Home/ 文件夹下创建一个名为 list.cshtml 的新视图并插入以下代码。
<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>
10、从GitHub下载xspread文件夹,放到wwwroot文件夹下,如下图。
确保 wwwroot/xspread/index.html 中指定的端口号与项目的端口号相同。
构建应用程序并在您喜欢的浏览器中运行它。
演示 - 在 ASP.NET MVC 中创建或编辑 Excel 文件
下面是我们刚刚创建的 ASP.NET MVC 电子表格应用程序的演示。
下载源代码
您可以从 GitHub 下载电子表格应用程序的完整源代码。
获得免费许可证
您可以使用 临时许可证 来使用 Aspose.Cells.GridJs 而没有评估限制。
结论
在本文中,您学习了如何创建具有一系列功能的 ASP.NET MVC 电子表格应用程序来创建和编辑 Excel 和其他电子表格文件。您可以自定义此应用程序或将其集成到您自己的 Web 应用程序中。如果您有任何疑问,请随时发布到我们的 论坛。