Asp.net mvc 使用ASP.NET MVC 4将数据导出到Excel文件C#正在渲染到视图中
我无法将数据导出到Excel。以下内容似乎将gridview呈现到我的视图中,而不是提示用户使用Excel打开,我已经在我的机器上安装了ExcelAsp.net mvc 使用ASP.NET MVC 4将数据导出到Excel文件C#正在渲染到视图中,asp.net-mvc,export-to-excel,Asp.net Mvc,Export To Excel,我无法将数据导出到Excel。以下内容似乎将gridview呈现到我的视图中,而不是提示用户使用Excel打开,我已经在我的机器上安装了Excel Public ActionResult ExportToExcel() { var products = this.Repository.Products.ToList(); var grid = new GridView(); grid.DataSource = from p in product
Public ActionResult ExportToExcel()
{
var products = this.Repository.Products.ToList();
var grid = new GridView();
grid.DataSource = from p in products
select new
{
Id = p.Id,
Name = p.Name
};
grid.DataBind();
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
Response.ContentType = "application/ms-excel";
Response.Charset = "";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
return View("MyView");
}
我做错了什么?我已经试过你的代码,它运行得很好。 创建文件时没有任何问题,这是我使用的代码(这是您的代码,我刚刚更改了数据源以进行测试):
步骤1:查看页面代码
<input type="button" id="btnExport" value="Export" class="btn btn-primary" />
<script>
$(document).ready(function () {
$('#btnExport').click(function () {
window.location = '/Inventory/ExportInventory';
});
});
</script>
我以前做过,我认为您需要删除ActionResult。将其设为空并删除返回视图(MyView)。这是解决方案您可以在任何控制器中调用helper类
//view
@Html.ActionLink("Export to Excel", "Excel")
//controller Action
public void Excel()
{
var model = db.GetModel()
Export export = new Export();
export.ToExcel(Response, model);
}
//helper class
public class Export
{ public void ToExcel(HttpResponseBase Response, object clientsList)
{
var grid = new System.Web.UI.WebControls.GridView();
grid.DataSource = clientsList;
grid.DataBind();
Response.ClearContent();
Response.AddHeader("content-disposition", "attachment; filename=FileName.xls");
Response.ContentType = "application/excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}
}
使用(MemoryStream mem=new MemoryStream())
{
SpreadsheetDocument SpreadsheetDocument=SpreadsheetDocument.Create(mem,SpreadsheetDocumentType.工作簿);
//将工作簿部件添加到文档中。
WorkbookPart WorkbookPart=电子表格文档.AddWorkbookPart();
workbookpart.工作簿=新工作簿();
//将工作表部件添加到工作簿部件。
WorksheetPart WorksheetPart=workbookpart.AddNewPart();
worksheetPart.Worksheet=新工作表(new SheetData());
//将工作表添加到工作簿中。
Sheets Sheets=spreadsheetDocument.WorkbookPart.Workbook.AppendChild(新工作表());
SheetData SheetData=worksheetPart.Worksheet.GetFirstChild();
//向单元格表中添加一行。
行行;
行=新行(){RowIndex=1};
sheetData.Append(行);
//在新行中,找到要在A1中插入单元格的列位置。
Cell refCell=null;
foreach(row.Elements()中的单元格)
{
if(string.Compare(cell.CellReference.Value,“A1”,true)>0)
{
refCell=单元格;
打破
}
}
//将单元格添加到A1处的单元格表中。
Cell newCell=newCell(){CellReference=“A1”};
row.InsertBefore(newCell、refCell);
//将单元格值设置为100的数值。
newCell.CellValue=新的CellValue(“100”);
newCell.DataType=新的枚举值(CellValues.Number);
//附加新工作表并将其与工作簿关联。
图纸=新图纸()
{
Id=电子表格文档.WorkbookPart.GetIdOfPart(工作表部分),
SheetId=1,
Name=“mySheet”
};
附页(页);
workbookpart.Workbook.Save();
电子表格文档。关闭();
返回文件(mem.ToArray(),System.Net.Mime.MediaTypeNames.Application.Octet,“text.xlsx”);
}
我在控制器类中使用一个列表将数据设置到网格视图中。代码对我来说很好:
public ActionResult ExpExcl()
{
List<PersonModel> person= new List<PersonModel>
{
new PersonModel() {FirstName= "Jenny", LastName="Mathew", Age= 23},
new PersonModel() {FirstName= "Paul", LastName="Meehan", Age=25}
};
var grid= new GridView();
grid.DataSource= person;
grid.DataBind();
Response.ClearContent();
Response.AddHeader("content-disposition","attachement; filename=data.xls");
Response.ContentType="application/excel";
StringWriter sw= new StringWriter();
HtmlTextWriter htw= new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
return View();
}
public ActionResult ExpExcl()
{
列表人=新列表
{
new PersonModel(){FirstName=“Jenny”,LastName=“Mathew”,Age=23},
new PersonModel(){FirstName=“Paul”,LastName=“Meehan”,Age=25}
};
var grid=new GridView();
grid.DataSource=person;
grid.DataBind();
Response.ClearContent();
AddHeader(“内容处置”、“附件;文件名=data.xls”);
Response.ContentType=“应用程序/excel”;
StringWriter sw=新的StringWriter();
HtmlTextWriter htw=新的HtmlTextWriter(sw);
网格渲染控制(htw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
返回视图();
}
在MVC中导出excel的温和方法是使用Microsoft CloseXml。我编写了一个简单的函数,用于将查询结果导出为excel工作表:
using ClosedXML.Excel;
...
public ActionResult ToExcel(List<Dictionary<string, string>> data, Dictionary<string, string> columnMap, string fileName, string sheetName)
{
var dtDataBuffer = new System.Data.DataTable("buffer");
foreach (string col in columnMap.Values)
{
dtDataBuffer.Columns.Add(col, typeof(string));
}
foreach (var row in data)
{
List<string> rowData = new List<string> { };
foreach (string col in columnMap.Keys)
{
rowData.Add(row[col]);
}
dtDataBuffer.Rows.Add(rowData.ToArray());
}
var memoryStream = new MemoryStream();
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add(dtDataBuffer, sheetName);
worksheet.Rows().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
worksheet.Rows().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
worksheet.Columns().AdjustToContents();
workbook.SaveAs(memoryStream);
}
return File(memoryStream.ToArray(), "application/vnd.ms-excel", fileName);
}
使用ClosedXML.Excel;
...
public ActionResult ToExcel(列表数据、字典列映射、字符串文件名、字符串表名)
{
var dtDataBuffer=new System.Data.DataTable(“缓冲区”);
foreach(columnMap.Values中的字符串列)
{
Add(col,typeof(string));
}
foreach(数据中的var行)
{
List rowData=新列表{};
foreach(columnMap.Keys中的字符串列)
{
添加(行[col]);
}
添加(rowData.ToArray());
}
var memoryStream=新的memoryStream();
使用(var工作簿=新的XL工作簿())
{
var worksheet=workbook.Worksheets.Add(dtDataBuffer,sheetName);
worksheet.Rows().Style.Alignment.Horizontal=XLAlignmentHorizontalValues.Center;
worksheet.Rows().Style.Alignment.Vertical=XLAlignmentVerticalValues.Center;
工作表.Columns().AdjustToContent();
工作簿.SaveAs(memoryStream);
}
返回文件(memoryStream.ToArray(),“application/vnd.ms excel”,文件名);
}
这是一个使用示例(实际上,我使用自己的类来运行查询并生成数据。您可以在此处找到和):
public ActionResult myReportExport(){
var data=List(){
{{“Column1_索引”、“Column1_值”}、{“Column2_索引”、“Column2_值”}、…}
...
};
返回到EXCEL(数据,新字典{
{“Column1_索引”,“Column1标题”},
{“Column2_索引”,“Column2标题”},
...
},
“myFileName.xlsx”,
“我的工作表名”
);
}
嗯,你说得对。一定是我的应用程序中的其他内容导致了这种情况。谢谢我在这上面花的时间比我应该花的时间长!为什么不使用FileResult
操作呢?这是一个很好的例子,不过可以使用returncontent方法,只设置filename的标题。示例:Response.AddHeader(“内容处置”、“附件;文件名=MyExcelFile.xls”);返回内容(sw.ToString(),“应用程序/ms excel”)代码>使用此选项,您可以删除所有其他响应。上面示例中的语句。此外,您不必返回从未真正使用过的视图。有关内容编码问题(可能会烧坏您),请参阅-伙计们,感谢您的回答,如何在多个工作簿中导出任何想法。当我尝试返回视图时,应用程序中的某个问题不起作用。我结束了不得不使用return-RedirectToAction(“Action”,“MyController”);结果不是正确的excel文件格式。
using (MemoryStream mem = new MemoryStream())
{
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(mem, SpreadsheetDocumentType.Workbook);
// Add a WorkbookPart to the document.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// Add Sheets to the Workbook.
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
// Add a row to the cell table.
Row row;
row = new Row() { RowIndex = 1 };
sheetData.Append(row);
// In the new row, find the column location to insert a cell in A1.
Cell refCell = null;
foreach (Cell cell in row.Elements<Cell>())
{
if (string.Compare(cell.CellReference.Value, "A1", true) > 0)
{
refCell = cell;
break;
}
}
// Add the cell to the cell table at A1.
Cell newCell = new Cell() { CellReference = "A1" };
row.InsertBefore(newCell, refCell);
// Set the cell value to be a numeric value of 100.
newCell.CellValue = new CellValue("100");
newCell.DataType = new EnumValue<CellValues>(CellValues.Number);
// Append a new worksheet and associate it with the workbook.
Sheet sheet = new Sheet()
{
Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "mySheet"
};
sheets.Append(sheet);
workbookpart.Workbook.Save();
spreadsheetDocument.Close();
return File(mem.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, "text.xlsx");
}
public ActionResult ExpExcl()
{
List<PersonModel> person= new List<PersonModel>
{
new PersonModel() {FirstName= "Jenny", LastName="Mathew", Age= 23},
new PersonModel() {FirstName= "Paul", LastName="Meehan", Age=25}
};
var grid= new GridView();
grid.DataSource= person;
grid.DataBind();
Response.ClearContent();
Response.AddHeader("content-disposition","attachement; filename=data.xls");
Response.ContentType="application/excel";
StringWriter sw= new StringWriter();
HtmlTextWriter htw= new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
return View();
}
using ClosedXML.Excel;
...
public ActionResult ToExcel(List<Dictionary<string, string>> data, Dictionary<string, string> columnMap, string fileName, string sheetName)
{
var dtDataBuffer = new System.Data.DataTable("buffer");
foreach (string col in columnMap.Values)
{
dtDataBuffer.Columns.Add(col, typeof(string));
}
foreach (var row in data)
{
List<string> rowData = new List<string> { };
foreach (string col in columnMap.Keys)
{
rowData.Add(row[col]);
}
dtDataBuffer.Rows.Add(rowData.ToArray());
}
var memoryStream = new MemoryStream();
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add(dtDataBuffer, sheetName);
worksheet.Rows().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
worksheet.Rows().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
worksheet.Columns().AdjustToContents();
workbook.SaveAs(memoryStream);
}
return File(memoryStream.ToArray(), "application/vnd.ms-excel", fileName);
}
public ActionResult myReportExport(){
var data=List<Dictionary<string, string>>(){
{{"Column1_Index","Column1_Value"},{"Column2_Index","Column2_Value"},...}
...
};
return ToExcel(data, new Dictionary<string, string> {
{ "Column1_Index", "Column1 Title" } ,
{ "Column2_Index", "Column2 Title" } ,
...
},
"myFileName.xlsx",
"my sheet name"
);
}