C# 使用backgroundworker导出到excel
如何在ASP.Net(C#)WEB应用程序中实现backgroundworker或thread,以便将大量数据导出到Excel?是否有其他方法可以在后台导出到excelC# 使用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" %>
<%@ 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();