Asp.net mvc 使用ASP.NET MVC 4将数据导出到Excel文件C#正在渲染到视图中

Asp.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

我无法将数据导出到Excel。以下内容似乎将gridview呈现到我的视图中,而不是提示用户使用Excel打开,我已经在我的机器上安装了Excel

 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"
    );
}