Може да генерира отчет в Excel и да го изпрати на клиентска машина, без да запазва файла в сървъра

В момента получавам данни от таблицата и ги конвертирам в работна книга на Excel, след това ги запазвам в пространството на сървъра и след това с помощта на клас Response изпращам файла към клиентската машина. кодът работи добре. Но имам идея да не съхранявам файла във физическо хранилище, тъй като това увеличава хранилището на сървъра и директно го избутва към клиентската машина. Моля за съвет, ако е възможно по някакъв начин. Благодаря предварително.

protected  void GenerateExcelFile()
{
    string data = null;
    int i = 0;
    int j = 0;

    Application xlApp;
    Workbook xlWorkBook;
    Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;

    xlApp = new Application();
    xlWorkBook = xlApp.Workbooks.Add(misValue);
    xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1);
    DataSet ds = new DataSet();
    ds = GetTableData();// Returns dataset
    for (int k = 0; k < ds.Tables[0].Columns.Count; k++)
    {
        xlWorkSheet.Cells[1, k + 1] = ds.Tables[0].Columns[k].ColumnName;
    }
    for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
    {
        for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
        {
            data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
            xlWorkSheet.Cells[i + 2, j + 1] = data;
        }
    }

    xlWorkBook.SaveAs("c:\\csharp.net-informations.xls", XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
    xlWorkBook.Close(true, misValue, misValue);
    xlApp.Quit();

    releaseObject(xlWorkSheet);
    releaseObject(xlWorkBook);
    releaseObject(xlApp);


    string FileName = "Report.xls";
    string filepath = "c:\\csharp.net-informations.xls";
    WebClient req = new WebClient();
    HttpResponse response = HttpContext.Current.Response;
    FileInfo file = new FileInfo(filepath);
    response.Clear();
    response.ClearContent();
    response.ClearHeaders();
    response.Buffer = true;
    Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
    Response.AddHeader("Content-Length", file.Length.ToString());
    Response.ContentType = ReturnExtension(file.Extension.ToLower());
    Response.TransmitFile(file.FullName);
    response.End();

person Ramkumar    schedule 23.09.2015    source източник
comment
натискането към клиентската машина означава изтегляне в браузъра, прав ли съм?   -  person Vinay Pratap Singh    schedule 23.09.2015
comment
Да, изтегляне в клиентски браузър. Съмнението ми е, че вместо да запазя като файл в сървъра и след това да го избера в класа за отговор, има ли някаква възможност за директно свързване на тези стъпки (вероятно всяко временно хранилище или получаване като байтове от клас на работна книга)   -  person Ramkumar    schedule 23.09.2015
comment
това е възможно, изчакайте да публикувам отговор, след като обядвам   -  person Vinay Pratap Singh    schedule 23.09.2015
comment
Всеки принос по този въпрос е високо ценен. Благодаря   -  person Ramkumar    schedule 01.10.2015


Отговори (3)


Използвам това и това директно изтегляне на excel в клиентски компютър

            System.IO.StringWriter objStringWriter1 = new System.IO.StringWriter();
            System.Web.UI.WebControls.GridView gridView1 = new System.Web.UI.WebControls.GridView();
            System.Web.UI.HtmlTextWriter objHtmlTextWriter1 = new System.Web.UI.HtmlTextWriter(objStringWriter1);

            HttpContext.Current.Response.ClearContent();
            HttpContext.Current.Response.ClearHeaders();
            HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
            HttpContext.Current.Response.Charset = "";
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName);

            gridView1.DataSource = tempDataTable;
            gridView1.DataBind();
            gridView1.RenderControl(objHtmlTextWriter1);

            gridView1.Dispose();
            HttpContext.Current.Response.Write(objStringWriter1.ToString());

            HttpContext.Current.Response.End();
person Imad    schedule 23.09.2015

Ако създавате Excel лист от страната на сървъра, тогава трябва да го запишете, преди да го изпратите на клиента.

Ако не искате да го запишете в сървъра, тогава можете просто да изпратите отговор във формат на списък, след което можете да създадете Excel лист от страната на клиента. Създаване на Excel лист в Javascript

person Shrinath    schedule 23.09.2015

Използвайте библиотеката OOXML вместо Microsoft.Office.Interop.Excel. Библиотечният пакет се нарича EPPlus. Ето как го настройвате във вашия проект:

  1. От конзолата за управление на пакети на Visual Studio въведете: Install-Package EPPlus (това ще инсталира библиотеката и препратката, ако е необходимо)
  2. Добавете този израз за използване (using OfficeOpenXml;) към вашия код

Ето примерен код за използване на библиотеката OOXML. Ще трябва да създадете ExcelPackage:

    ExcelPackage pck = new ExcelPackage();
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("exported data");
    // Excel sheet headings
    ws.Cells[1, 1].Value = "Column 1 title";
    ws.Cells[1, 2].Value = "Column 2 title";


Сега използвайте следния код, за да запишете файла на excel на клиента:

        Byte[] fileBytes = pck.GetAsByteArray(); // convert excel data to bytes

        Response.Clear();
        Response.ClearContent();
        Response.ClearHeaders();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment; filename=\"fileName1.xlsx\"");
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
        Response.AppendHeader("Content-Length", fileBytes.Length.ToString());
        Response.BinaryWrite(fileBytes);
        Response.End();
person IsaacBok    schedule 26.02.2016