Экспорт Gridview в Excel с EPPLus - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь экспортировать данные из файла данных в файл Excel с помощью EPPlus, но, похоже, ничего не работает.Это код -

using (ExcelPackage xp = new ExcelPackage())
{
    ExcelWorksheet ws = xp.Workbook.Worksheets.Add(dt.TableName);

    int rowstart = 2;
    int colstart = 2;
    int rowend = rowstart;
    int colend = colstart + dt.Columns.Count;

    ws.Cells[rowstart, colstart, rowend, colend].Merge = true;
    ws.Cells[rowstart, colstart, rowend, colend].Value = dt.TableName;
    ws.Cells[rowstart, colstart, rowend, colend].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
    ws.Cells[rowstart, colstart, rowend, colend].Style.Font.Bold = true;
    ws.Cells[rowstart, colstart, rowend, colend].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
    ws.Cells[rowstart, colstart, rowend, colend].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);

    rowstart += 2;
    rowend = rowstart + dt.Rows.Count;
    ws.Cells[rowstart, colstart].LoadFromDataTable(dt, true);
    int i = 1;
    foreach (DataColumn dc in dt.Columns)
    {
        i++;
        if (dc.DataType == typeof(decimal))
        ws.Column(i).Style.Numberformat.Format = "#0.00";
    }
    ws.Cells[ws.Dimension.Address].AutoFitColumns();

    ws.Cells[rowstart, colstart, rowend, colend].Style.Border.Top.Style =
       ws.Cells[rowstart, colstart, rowend, colend].Style.Border.Bottom.Style =
       ws.Cells[rowstart, colstart, rowend, colend].Style.Border.Left.Style =
       ws.Cells[rowstart, colstart, rowend, colend].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;


    Response.AddHeader("content-disposition", "attachment;filename=logs.xlsx");
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.BinaryWrite(xp.GetAsByteArray());
    Response.Close();
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}

исключение не отображается, код работает без сбоев, но файл не создается.Я действительно не знаю, как понять, что происходит за этой строкой, поскольку это ничего не показывает.Но я вижу, что ячейки на листе заполнены.Я пробовал все остальные вопросы и решения, доступные на этом сайте, а также на других сайтах.Но, похоже, ничего не работает.поэтому, пожалуйста, не предоставляйте ссылку только на другие вопросы и решения.Любой другой совет будет оценен.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Вероятно, тип контента Response.End () и application / ms-excel решит вашу проблему.Попробуйте следующий код:

byte[] data= xp.GetAsByteArray();
Response.ContentType = "application/ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=logs.xlsx; size=" + data.Length);    
Response.BinaryWrite(data);
Response.End();

Также, если он не работает, попробуйте добавить следующий код:

Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
0 голосов
/ 03 января 2019

Я сделал это с помощью другой страницы, задача которой состояла в том, чтобы просто взять имя файла и путь и отправить в ответ.Если кто-то застрял, как я, там, где вы все делаете правильно, вещи работают на любой другой странице, но не там, где вы хотите.Так что вы можете попробовать это.В этом случае обновление или мигание не будут выполняться.Пользователь не будет чувствовать, что вообще была использована другая страница.

CardLogs.aspx.cs

string filename = "logs_" + DateTime.Now.ToString("MMddyyyy") + ".xlsx";
                FileInfo excelFile = new FileInfo(Server.MapPath("~/Uploads/" + filename));
                excel.SaveAs(excelFile);
                Session["fileName"] = excelFile.FullName;
                Response.Redirect("exportdata.aspx"); 

файл exportdata.aspx.cs -

 protected void Page_Load(object sender, EventArgs e)
    {
        string filePath = HttpContext.Current.Session["fileName"].ToString();
        if (!string.IsNullOrEmpty(filePath))
        {
            Response.ContentType = ContentType;
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filePath));
            Response.WriteFile(filePath);
            Response.Flush();
            File.Delete(filePath);                
        }

    }
0 голосов
/ 29 декабря 2018

Попробуй это.Оно работает.Response.BinaryWrite не очень хорошо работает при загрузке файла.И вы не установили content-length

byte[] bin = xp.GetAsByteArray();

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-length", bin.Length.ToString());
Response.AddHeader("content-disposition", "attachment;filename=logs.xlsx");
Response.OutputStream.Write(bin, 0, bin.Length);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...