Ishakkhan Ответов: 1

Экспорт файла Excel-outofmemoryexception


Getting Out of memory exception while exporting large amount of Data (more than 90,000 records , Columns 80) to excel 


Что я уже пробовал:

protected void imgBtnExcel_Click(object sender, ImageClickEventArgs e)
{
    string strExcelPath = string.Empty;
    string strCharTypeID = "";
    foreach (ListItem item in lstChartType.Items)
    {
        if (item.Selected == true)
        {
            strCharTypeID += item.Value.ToString() + ",";
        }
    }
    strCharTypeID = strCharTypeID.TrimEnd(',');
    DataTable dtReports = new DataTable();
    dtReports = objReportBL.GetHospitalInvoiceProductionReport(txtBeginDate.Text.Trim(), txtEndDate.Text.Trim());
      if (Session["dtReport"] != null)
    {
        DataTable dtReport = Session["dtReport"] as DataTable;
    strExcelPath = GenerateExcelWorkSheet(dtReports, "Production Report");
        if (dgvProduction.Rows.Count > 0)
        {
            dgvProduction.UseAccessibleHeader = true;
            dgvProduction.HeaderRow.TableSection = TableRowSection.TableHeader;
            imgBtnExcel.Visible = true;
        }
        else
        {
            imgBtnExcel.Visible = false;
        }
        try
        {
            FileInfo file = new FileInfo(strExcelPath);
            if (file.Exists)
            {
                Response.Clear();
                Response.ClearHeaders();
                Response.ClearContent();
                Response.AddHeader("content-disposition", "attachment; filename=" + "ProductionReport" + DateTime.Now.ToString().Replace("/", "").Replace(" ", "").Replace(":", "").ToString() + ".xlsx");
                Response.AddHeader("Content-Type", "application/Excel");
                Response.ContentType = "application/vnd.xls";
                Response.AddHeader("Content-Length", file.Length.ToString());
                Response.WriteFile(file.FullName);
                Response.End();
            }
            else
            {
                Response.Write("This file does not exist.");
            }
        }
        catch (Exception ex)
        {
        }
    }

}

private string GenerateExcelWorkSheet(DataTable dtExcelData, string sheetName, string fileName)
{
    string _strAppendFileName = string.Empty;

    int rowIndex = 1;
    int colIndex = 0;
    exclSheets = exclBook.Worksheets.Add(sheetName);
    exclBook.ShowGridLines = false;

    colIndex++;

    fileName = fileName + ".xlsx";

    exclSheets.Cell(rowIndex, colIndex).Style.Font.Bold = true;

    exclSheets.Range(1, 1, 1, dtExcelData.Columns.Count).Style.Fill.BackgroundColor = Excel.XLColor.Yellow;
    exclSheets.Range(1, 1, 1, dtExcelData.Columns.Count + 1).Style.Border.LeftBorder = Excel.XLBorderStyleValues.Thin;
    exclSheets.Range(1, 1, 1, dtExcelData.Columns.Count).Style.Alignment.Horizontal = Excel.XLAlignmentHorizontalValues.Center;
    exclSheets.Range(1, 1, 1, dtExcelData.Columns.Count).Style.Font.SetFontColor(Excel.XLColor.Black);
    exclSheets.Range(1, 1, 1, dtExcelData.Columns.Count).Style.Font.Bold = true;

    string strText = "";

    foreach (DataColumn dCol in dtExcelData.Columns)
    {
        strText = dCol.Caption.ToString();
        exclSheets.Cell(rowIndex, colIndex).Value = strText;
        colIndex++;
    }
    colIndex = 1;
    rowIndex++;
    colIndex = 0;
    string strCellvalue = "";
    for (int i = 0; i < dtExcelData.Rows.Count; i++)
    {

        for (int j = 0; j < dtExcelData.Columns.Count; j++)
        {

            colIndex++;
            strCellvalue = dtExcelData.Rows[i][j].ToString().ToUpper();
            exclSheets.Cell(rowIndex, colIndex).Value = "'" + strCellvalue;
        }
        colIndex = 0;
        rowIndex++;
    }

    char c = Convert.ToChar((64 + dtExcelData.Columns.Count - 2));
    string strHeaderRange = GetExcelColumnName(dtExcelData.Columns.Count);

    exclSheets.Range("A1", "A1").Style.Border.BottomBorder = Excel.XLBorderStyleValues.Thin;

    if (File.Exists(Server.MapPath(@"~/Output/") + fileName.Trim()))
    {
        File.Delete(Server.MapPath(@"~/Output/") + fileName.Trim());
    }
    exclBook.SaveAs(Server.MapPath(@"~/Output/") + fileName.Trim());
    exclBook = null;
    exclSheets = null;
    string path = Server.MapPath(@"~/Output/") + fileName.Trim();
    return path;

}

AnvilRanger

На какой линии возникает ошибка? В вашем коде есть несколько мест, где это может произойти?

1 Ответов

Рейтинг:
1

AnvilRanger

В вашем коде есть несколько мест,где вы можете получить исключение из памяти. Но я могу сказать, что вы используете объектный интерфейс Office для Excel, и вы не должны использовать его в веб-среде. Вы должны посмотреть на OpenXML SDK или EPPlus.