批量数据导出到Excel并在ashx文件中下载

时间:2016-11-24 07:37:48

标签: asp.net excel export-to-csv ashx

我有一个asp.net应用程序,其中有一个js文件和一个ashx文件。在下载按钮中单击我在ajax调用中调用处理程序文件并在 json格式化字符串/数据表中检索sql表数据并且我尝试导出 json格式化字符串/数据表 excel / csv 文件并下载它。请帮我找一个解决方案。 (需要一个有助于导出大量数据并下载的解决方案)

我尝试了下面的代码,但它没有下载excel文件。

public void ProcessRequest(HttpContext context)
        {
            context.Response.AddHeader("content-disposition", "attachment; filename=FileName.xls");
            context.Response.ContentType = "application/csv";
            HttpResponse response = context.Response;
            string exportContent = ExportToSpreadsheet(JsonStringToDataTable(GetDataFromTable()),'excelfilename');            
            response.Write(exportContent);
            context.Response.End();
        } 

public DataTable JsonStringToDataTable(string jsonString)
        {
            DataTable dt = new DataTable();
            string[] jsonStringArray = Regex.Split(jsonString.Replace("[", "").Replace("]", ""), "},{");
            List<string> ColumnsName = new List<string>();
            foreach (string jSA in jsonStringArray)
            {
                string[] jsonStringData = Regex.Split(jSA.Replace("{", "").Replace("}", ""), ",");
                foreach (string ColumnsNameData in jsonStringData)
                {
                    try
                    {
                        int idx = ColumnsNameData.IndexOf(":");
                        string ColumnsNameString = ColumnsNameData.Substring(0, idx - 1).Replace("\"", "");
                        if (!ColumnsName.Contains(ColumnsNameString))
                        {
                            ColumnsName.Add(ColumnsNameString);
                        }
                    }
                    catch (Exception ex)
                    {
                        //throw new Exception(string.Format(ex.Message + "Error Parsing Column Name : {0}", ColumnsNameData));
                        throw ex;
                    }
                }
                break;
            }
            foreach (string AddColumnName in ColumnsName)
            {
                dt.Columns.Add(AddColumnName);
            }
            foreach (string jSA in jsonStringArray)
            {
                string[] RowData = Regex.Split(jSA.Replace("{", "").Replace("}", ""), ",");
                DataRow nr = dt.NewRow();
                foreach (string rowData in RowData)
                {
                    try
                    {
                        int idx = rowData.IndexOf(":");
                        string RowColumns = rowData.Substring(0, idx - 1).Replace("\"", "");
                        string RowDataString = rowData.Substring(idx + 1).Replace("\"", "");
                        nr[RowColumns] = RowDataString;
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
                dt.Rows.Add(nr);
            }
            return dt;
        }


private static string GetDataFromTable()
        {
            string returnValue = string.Empty;
            var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue };
            try
            {
                var result = //get data from sql table;
                returnValue = serializer.Serialize(result);
            }
            catch (Exception e)
            {
                returnValue = serializer.Serialize(e.Message);
            }
            return returnValue;
        }


public string ExportToSpreadsheet(DataTable table, string name)
            {
                string res = string.Empty;
                try
                {
                    //var resp = Response;
                    System.Web.HttpResponse resp = System.Web.HttpContext.Current.Response;
                    resp.Clear();
                    if (table != null)
                    {
                        foreach (DataColumn column in table.Columns)
                        {
                            resp.Write(column.ColumnName + ",");
                        }
                    }

                    resp.Write(Environment.NewLine);
                    if (table != null)
                    {
                        foreach (DataRow row in table.Rows)
                        {
                            for (int i = 0; i < table.Columns.Count; i++)
                            {
                                resp.Write(row[i].ToString().Replace(",", string.Empty) + ",");
                            }

                            resp.Write(Environment.NewLine);
                        }
                    }

                    res = "successfully downloaded";
                    resp.ContentType = "text/csv";
                    resp.AppendHeader("Content-Disposition", "attachment; filename=" + name + ".csv");                
                   // resp.End();

                }
                catch(Exception ex)
                {
                    res = ex.Message;
                }
                return res;
            }

1 个答案:

答案 0 :(得分:1)

开始使用像EPPlus这样的专业图书馆。它将创建真正的Excel文件。

private void exportToExcel(DataTable dataTable)
{
    using (ExcelPackage excelPackage = new ExcelPackage())
    {
        //create the worksheet
        ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("Sheet 1");

        //load the datatable into the sheet, with headers
        worksheet.Cells["A1"].LoadFromDataTable(dataTable, true);

        //send the file to the browser
        byte[] bin = excelPackage.GetAsByteArray();
        Response.ClearHeaders();
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-length", bin.Length.ToString());
        Response.AddHeader("content-disposition", "attachment; filename=\"ExcelDemo.xlsx\"");
        Response.OutputStream.Write(bin, 0, bin.Length);
        Response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
}