excel - 如何使用 ASP.Net MVC 在 Excel 文件中导出表格?
问题描述
我的视图由多个表组成,我希望从 Excel 文件中的视图中导出多个表。我当前的功能只能帮助我导出 1 个表。
谁能帮我完成这段代码,以便可以导出多个表?
- 报告虚拟机
public class ReportVM
{
public string ScenName { get; set; }
public int Count { get; set; }
public string CreateTickYes { get; set; }
public int TickYes { get; set; }
public string RegionName { get; set; }
public int RegionCount { get; set; }
public string UserName { get; set; }
public int ChatCountUser { get; set; }
}
- 导出的操作方法
public FileContentResult DownloadReport(DateTime start, DateTime end)
{
//var uName = User.Identity.Name;
var fileDownloadName = String.Format("Report.xlsx");
const string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
// Pass your ef data to method
ExcelPackage package = GenerateExcelFile(db.Chats.Where(x => System.Data.Entity.DbFunctions.TruncateTime(x.ChatCreateDateTime) >= start && System.Data.Entity.DbFunctions.TruncateTime(x.ChatCreateDateTime) <= end)
.GroupBy(a => a.ScenarioList).Select(b => new ReportVM()
{
ScenName = b.Key,
Count = b.Count()
}).ToList());
var fsr = new FileContentResult(package.GetAsByteArray(), contentType);
fsr.FileDownloadName = fileDownloadName;
return fsr;
}
private static ExcelPackage GenerateExcelFile(IEnumerable<ReportVM> datasource)
{
ExcelPackage pck = new ExcelPackage();
//Create the worksheet
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Sheet 1");
// Sets Headers
ws.Cells[1, 1].Value = "Scenario";
ws.Cells[1, 2].Value = "No.Of Chats";
// Inserts Data
for (int i = 0; i < datasource.Count(); i++)
{
ws.Cells[i + 2, 1].Value = datasource.ElementAt(i).ScenName;
ws.Cells[i + 2, 2].Value = datasource.ElementAt(i).Count;
}
//Sheet2
// Format Header of Table
using (ExcelRange rng = ws.Cells["A1:B1"])
{
rng.Style.Font.Bold = true;
rng.Style.Fill.PatternType = ExcelFillStyle.Solid; //Set Pattern for the background to Solid
rng.Style.Fill.BackgroundColor.SetColor(Color.Gold); //Set color to DarkGray
rng.Style.Font.Color.SetColor(Color.Black);
}
return pck;
}
所以,现在它为 Table GroubBy = ScenarioList 导出数据。我还想在 groupBy = Username 中包含另一列。因此,当导出数据时,Excel 文件应包含 2 张工作表。1 用于表 ScenarioList,第 2 用于表用户名。
非常感谢您的帮助。先感谢您。
解决方案
您需要创建 div/table,在其中放置所有表,然后使用下面的 javascript 函数。请在具有所有数据的同一页面上单击按钮调用此 javascript 函数。这对我有用,我已经在我的项目中使用过。
function DownloadToExcel() {
var htmls = $("#compareBodyContent")[0].innerHTML; // this main element under which
//all you data
var uri = 'data:application/vnd.ms-excel;base64,';
var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>';
var base64 = function (s) {
return window.btoa(unescape(encodeURIComponent(s)))
};
var format = function (s, c) {
return s.replace(/{(\w+)}/g, function (m, p) {
return c[p];
})
};
var ctx = {
worksheet: 'Worksheet',
table: '<table>' + htmls + '</table>'
}
var compareLink = document.createElement("a");
compareLink.download = "Compare_Test.xls";
compareLink.href = uri + base64(format(template, ctx));
compareLink.click();
}
希望这会帮助你。如果您对此有任何疑问,请告诉我。
推荐阅读
- javascript - 缓冲二维数组,从第 2 行开始
- python - 如何在将参数传递到主代码时将文件作为模块导入
- python - 运行 spaCy 和添加语言模型的问题
- javascript - 如何从javascript中的嵌套对象数组递归创建平面数组?
- javascript - 使用按钮更改两个列表中仅一个的背景颜色
- arrays - 如何制作三重嵌套地图
- widget - WidgetKit 中的地图快照不调用 MKMapSnapshotter.start 的 completionHandler 回调
- python - 二进制数据被写为字符串文字 - 如何将其转换回字节?
- python - selenium Web Driver 不返回 Wikipedia 表
- swift - 如何以 stateobject 作为参数初始化视图?