使用c#(Mvc)将数据集导出为Excel

时间:2017-09-01 11:28:36

标签: c# asp.net-mvc

我尝试将具有2个表的数据集导出到Excel工作表,遗憾的是我不能。

我有将数据表导出为ex​​cel的代码。因此,我在代码中调用ExportToExcel函数而不是数据集,将数据表导出为ex​​cel 4次。但是一旦它创建了第一张纸,就会停止控制流程。 Control不会调用第二个函数

ExportToExcel(getReports.Tables[1], "ConsumerBookedSlots");

以下是代码:

public ActionResult GetCuratorsAvailability(string availabilitydate)
        {
            string fromDate = "";
            string endDate = "";
            if (availabilitydate != "")
            {
                 fromDate = availabilitydate.Split('-')[0];
                 endDate = availabilitydate.Split('-')[1];
                if (DateTime.Parse(endDate) >= DateTime.Parse(fromDate))
                {
                    DataSet getReports = AdminBLL.GetCuratorsAvailability(fromDate, endDate);
                    ExportToExcel(getReports.Tables[0], "CuratorsAvailableSlots");                    
                    ExportToExcel(getReports.Tables[1], "ConsumerBookedSlots");                                      
                }
            }            
            return View("Reports");
        }

          public void ExportToExcel(DataTable dt, string FileName)
        {
            if (dt.Rows.Count > 0)
            {
                if (System.Web.HttpContext.Current.Response.RedirectLocation == null)
                {                   
                    string filename = FileName + ".xls";
                    System.IO.StringWriter tw = new System.IO.StringWriter();
                    System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
                    DataGrid dgGrid = new DataGrid();
                    dgGrid.DataSource = dt;
                    dgGrid.DataBind();
                    //Get the HTML for the control.
                    dgGrid.RenderControl(hw);
                    //Write the HTML back to the browser.
                    //Response.ContentType = application/vnd.ms-excel;                                         
                    Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + "");
                    Response.ContentType = "application/vnd.ms-excel";                  
                    Response.Write(tw.ToString());                   
                    Response.Flush();                 
                    Response.End();
                }
            }   
        }       

我无法下载getReports.Tables[1]数据,因为我收到此错误:

  发送http标头后,

服务器无法附加标头。 MVC

它在浏览器中出错后正在下载firstfile。

2 个答案:

答案 0 :(得分:1)

下载第一个文件后,执行命中此行 -

Response.End();

这意味着,响应已结束,标头已发送到客户端。您无法启动第二个文件的下载。如果您想通过单击按钮下载多个文件,则需要将其压缩为一个文件,然后启动下载。

要压缩文件,您可以执行此操作 -

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string startPath = @"c:\example\start";
            string zipPath = @"c:\example\result.zip";
            string extractPath = @"c:\example\extract";

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}

来自here的摘录。

如果您希望将两个excel电子表格作为单个Excel文档的一部分,将其中每个电子表格作为工作表,则可以使用ClosedXML

答案 1 :(得分:0)

我曾多次使用ClosedXML(一个OpenXML实现),包括在ASP.NET MVC应用程序中,它就像一个魅力。

导出数据非常简单:

using (var memoryStream = new MemoryStream())
{
    using (XLWorkbook workbook = new XLWorkbook())
    {
        using (IXLWorksheet worksheet = workbook.AddWorksheet("WorksheetName"))
        {
            var toExport = GetData();
            worksheet.Row(1).Style.Font.Bold = true;
            worksheet.Cell(1, 1).Value = "Column 1";
            worksheet.Cell(1, 2).Value = "Column 2";
            worksheet.Cell(1, 3).Value = "Column 3";

            // Export the data and set some properties           
            worksheet.Cell(2, 1).Value = toExport.AsEnumerable();
            worksheet.RangeUsed().SetAutoFilter();
            worksheet.Columns().AdjustToContents();
            workbook.SaveAs(memoryStream);
            memoryStream.Position = 0;

            return File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "filename.xlsx");
        }
    }
}