Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用backgroundworker导出到excel_C#_Asp.net_Excel_Export To Excel_Closedxml - Fatal编程技术网

C# 使用backgroundworker导出到excel

C# 使用backgroundworker导出到excel,c#,asp.net,excel,export-to-excel,closedxml,C#,Asp.net,Excel,Export To Excel,Closedxml,如何在ASP.Net(C#)WEB应用程序中实现backgroundworker或thread,以便将大量数据导出到Excel?是否有其他方法可以在后台导出到excel <%@ Page Title="" Language="C#" MasterPageFile="~/export_module.master" AutoEventWireup="true" CodeFile="GenerateReport.aspx.cs" Inherits="" Async="true" %>

如何在ASP.Net(C#)WEB应用程序中实现backgroundworker或thread,以便将大量数据导出到Excel?是否有其他方法可以在后台导出到excel

 <%@ Page Title="" Language="C#" MasterPageFile="~/export_module.master"
AutoEventWireup="true" CodeFile="GenerateReport.aspx.cs"
Inherits="" Async="true" %>


public readonly BackgroundWorker worker = new BackgroundWorker();

protected void Page_Load(object sender, EventArgs e)
{
 if (!Page.IsPostBack)
    {
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        worker.DoWork += new DoWorkEventHandler(DoWork);
        //worker.ProgressChanged += new ProgressChangedEventHandler(WorkerProgressChanged);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted);
    }
}
//背景法

  private void DoWork(object sender, DoWorkEventArgs e)
  {
    exportToExcel();
  }

  private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  { 
  }
//使用ClosedXML导出到Excel

  public void ExportReportWithHeaderClosedXML(string reportName, string fileName,  DataTable dataTable)
{
    int usedCells = dataTable.Columns.Count;
    string ReportDate = string.Empty;
    string attachment = "inline;filename=" + fileName + ".xlsx";
    using (XLWorkbook wb = new XLWorkbook())
    {

        //Add method of ClosedXML class library only accepts worksheet name of 31 characters.

        IXLWorksheet worksheet = wb.Worksheet(1);           

        //Insert Report Data
        worksheet.Cell(4, 1).InsertTable(dataTable);
        HttpContext.Current.Response.Clear();

        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.Buffer = true;

        HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=" + fileName + ".xlsx");
        using (MemoryStream MyMemoryStream = new MemoryStream())
        {
            wb.SaveAs(MyMemoryStream);
            MyMemoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
            HttpContext.Current.Response.End();
        }
    }
}

如果您想启动新的单线程,那么它将是有用的

var worker = new BackgroundWorker();
worker.DoWork += (o, ea) =>
{
       //It will execute after start new Thread.
       //Write your code for execute Export Excel.
};
worker.RunWorkerCompleted += (o, ea) =>
{
       //You will get pointer when this worker finished the job.
};
worker.RunWorkerAsync();

我也尝试过同样的方法,但当用户单击“导出到excel”按钮时,会显示“在此上下文中不允许异步操作。启动异步操作的页面必须将Async属性设置为true,并且只能在PreRenderComplete事件之前的页面上启动异步操作”的异常因此,我已将页面设为Async=“true”,但excel文件仍无法按我的视图生成。脚本管理员可能需要使用runat=“server”在表单中添加。请发送导出excel的代码块以进行调试并进行更多解释。要导出到excel,我使用closedXML库。我已创建了示例项目,它工作正常。您可以从下面的链接“”中引用它。您所说的大量数据是什么意思?它有40000多行,这将花费时间来呈现excel文件,并使浏览器无响应,因此我尝试在后台生成报告,以便它不会停止用户处理其他任务。40K数据不是大量数据。这取决于您如何编写代码以及应用程序中的所有其他依赖项。数据旋转非常复杂,因此excel需要时间来呈现数据
var worker = new BackgroundWorker();
worker.DoWork += (o, ea) =>
{
       //It will execute after start new Thread.
       //Write your code for execute Export Excel.
};
worker.RunWorkerCompleted += (o, ea) =>
{
       //You will get pointer when this worker finished the job.
};
worker.RunWorkerAsync();