我的需求很简单 - 只需将MVC视图数据表导出到Excel即可。 我搜索了许多不同的方法将Razor MVC4视图导出到Excel并发现这是一个很好的简单方法,但我对如何正确实现它有点困惑,因为我不了解ModelBase概念。我发现了一些使用这种方法的例子,但无法让他们使用我的解决方案。
http://landokal.wordpress.com/2011/04/28/asp-net-mvc-export-to-excel-trick/
public class ExcelResult<Model> : ActionResult
{
string _fileName;
string _viewPath;
Model _model;
ControllerContext _context;
public ExcelResult(ControllerContext context, string viewPath, string fileName, Model model)
{
this._context = context;
this._fileName = fileName;
this._viewPath = viewPath;
this._model = model;
}
protected string RenderViewToString()
{
using (var writer = new StringWriter())
{
var view = new WebFormView(_context, _viewPath);
var vdd = new ViewDataDictionary<Model>(_model);
var viewCxt = new ViewContext(_context, view, vdd, new TempDataDictionary(), writer);
viewCxt.View.Render(viewCxt, writer);
return writer.ToString();
}
}
void WriteFile(string content)
{
HttpContext context = HttpContext.Current;
context.Response.Clear();
context.Response.AddHeader("content-disposition", "attachment;filename=\"" + _fileName + "\"");
context.Response.Charset = "";
context.Response.ContentType = "application/ms-excel";
context.Response.Write(content);
context.Response.End();
}
public override void ExecuteResult(ControllerContext context)
{
string content = this.RenderViewToString();
this.WriteFile(content);
}
}
我也使用相同的方法发现了这个类似的帖子。 Excel Result not giving me anything, but it runs fine
我没有像上面那样使用AJAX,而只是现有页面上的一个简单的actionlink,它显示了来自DB的数据结果的表格视图。
@Html.ActionLink("Export to Excel", "ExcelExport")
我试着按照上面的例子在下面创建了一个ActionResult,但我不明白我想要用什么代替&#34; ModelBase&#34;下面因为它不喜欢这种语法。
public ActionResult ExcelExport()
{
List<TrainingSwipe> viewModel = _db.TrainingSwipes
.OrderBy(v => v.SwipeDateTime).ToList();
return View(viewModel);
return new ExcelResult<ModelBase>
(
ControllerContext,
"Export.aspx",
"ExcelExport",
viewModel
);
}
答案 0 :(得分:0)
我最近在我的MVC项目中做了很多Excel导出,并且一直在使用NPOI的excel包。替代品是EP Plus,我认为它是建立在NPOI的顶部(我自己没有使用过)
对于ModelBase我不完全确定那是什么我怀疑是博客创建的一些抽象类,但这里有一个可能的解决方案。
但我离题了。我已经构建了一个简单的ExcelHelper类,它将NPOI内容包装在底层以执行所有Excel创建,然后您只需将文件作为FileResult返回。
您可以在此处访问该项目:
https://github.com/JellyMaster/ExcelHelper
如果您查看单元测试,您将看到它是如何工作的。但就在动作结果中使用它而言,这里有一些示例代码。
public ActionResult Export()
{
List<MyModel> model = new List<MyModel>();
MemoryStream stream = new MemoryStream();
model = myServiceLayer.GetExportResults();
DataSet ds = new DataSet();
ds.Tables.Add(model.ToDataTable<MyModel>());
try
{
stream = ExcelHelper.CreateExcelSheet(ds, ExcelHelper.ExcelType.Xlsx);
}
catch (Exception error)
{
ModelState.AddModelError("", error);
}
if (!ModelState.IsValid)
{
return View();
}
else
{
string exportName = "myexcelfile.xlsx";
return File(stream.ToArray(), "application/vnd.ms-excel", exportName);
}
}
这可以通过做一些反射来将类对象转换为数据集,然后将该数据导出到数据集中,该数据集被送入excelhelper并将内容输出到流中,然后将其作为文件结果传回。
我实际上需要推出一个更新,它解决了我发现的几个小问题但它在当前形式下工作得非常好。如果您需要更多信息或帮助,请随时与我们联系。
编辑:我实际上只是将更新推送到我的github项目。