Может создавать отчет 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 (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