C # Экспорт в Excel из класса - PullRequest
0 голосов
/ 16 января 2019

Я следую приведенному ниже примеру, чтобы экспортировать данные из таблицы / хранимой процедуры в Excel. https://www.c -sharpcorner.com / UploadFile / rahul4_saxena / как к экспорту-несколько-данных-таблицы-к-множественных рабочих листов-в /

Единственное отличие состоит в том, что, поскольку у меня есть проект Angular / MVC, я использую этот код в классе. В методе 'Export_To_Excel ()' есть Response.Clear (); и другие методы ответа. Но я получаю сообщение об ошибке: «Ответ не существует в текущем контексте». Поэтому я попытался перейти на полностью квалифицированную ссылку: HttpContext.Current.Response или System.Web.HttpContext.Current.Response но теперь я получаю сообщение об ошибке «Ссылка на объект не установлена ​​на экземпляр объекта»

Пожалуйста, руководство, что делать? Вот мой полный код в файле CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ClosedXML.Excel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyProject.DAL
{
    public class CreateWorkBook
    {
        private DataTable getAllEmployeesList()
        {

            using (SqlConnection con = Connection.GetConnection())
            {
                using (SqlCommand cmd = new SqlCommand(@"SELECT * FROM Employee ORDER BY ID;"))
                {
                    using (SqlDataAdapter da = new SqlDataAdapter())
                    {
                        DataTable dt = new DataTable();
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = con;
                        da.SelectCommand = cmd;
                        da.Fill(dt);
                        return dt;
                    }
                }
            }
        }

        private DataTable getAllEmployeesOrderList()
        {

            using (SqlConnection con = Connection.GetConnection())
            {
                using (SqlCommand cmd = new SqlCommand("SELECT * FROM OrderDetails ORDER BY Order_ID;"))
                {
                    using (SqlDataAdapter da = new SqlDataAdapter())
                    {
                        DataTable dt = new DataTable();
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = con;
                        da.SelectCommand = cmd;
                        da.Fill(dt);
                        return dt;
                    }
                }
            }
        }

        public DataSet getDataSetExportToExcel()
        {
            DataSet ds = new DataSet();
            DataTable dtEmp = new DataTable("Employee");
            dtEmp = getAllEmployeesList();

            DataTable dtEmpOrder = new DataTable("Order List");
            dtEmpOrder = getAllEmployeesOrderList();
            ds.Tables.Add(dtEmp);
            ds.Tables.Add(dtEmpOrder);
            return ds;
        }
        public string SetToExport(string channel, string assets )
        {
            string status = Export_To_Excel();
            return "success";
        }
        protected string Export_To_Excel()
        {
            try
            {
                DataSet ds = getDataSetExportToExcel();
                using (XLWorkbook wb = new XLWorkbook())
                {
                    wb.Worksheets.Add(ds);
                    wb.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                    wb.Style.Font.Bold = true;
// Error here – 
//An object reference not set to an instance of Object  
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.Buffer = true;
                    System.Web.HttpContext.Current.Response.Charset = "";
                    System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename= SubmissionForm.xlsx");
                    using (MemoryStream MyMemoryStream = new MemoryStream())
                    {
                        wb.SaveAs(MyMemoryStream);
                        MyMemoryStream.WriteTo(System.Web.HttpContext.Current.Response.OutputStream);
                        System.Web.HttpContext.Current.Response.Flush();
                        System.Web.HttpContext.Current.Response.End();
                    }
                }

                return "success";
            }
            catch (Exception e)
            {
                throw e;
                //return "Export to Excel failed";
            }

        }

        }
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как отметил @Scott в комментариях, вы должны разбить это на более мелкие проблемы.

  1. Сначала создайте код для успешного создания файла Excel.Это должно вернуть byte[].Для упрощения вы можете создать консольное приложение, которое сначала сохранит файл локально на ПК, протестируйте его и убедитесь, что оно работает.
  2. Как только часть 1 заработает, скопируйте код, который генерирует byte[], в ваш веб-проект.Тогда вам просто нужно выяснить, как загрузить файл в MVC на клиент.

Следующий код может помочь.

    // CreateWorkBook class
    public byte[] Export_To_Excel()
    {           
        DataSet ds = getDataSetExportToExcel();
        using (XLWorkbook wb = new XLWorkbook())
        {
            wb.Worksheets.Add(ds);
            wb.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
            wb.Style.Font.Bold = true;

            using (MemoryStream myMemoryStream = new MemoryStream())
            {
                wb.SaveAs(myMemoryStream);

                // return memory stream as byte array
                return myMemoryStream.ToArray();
            }
        }
    }

Тогда в вашем контроллере вы можете использовать FileResult чтобы вернуть файл excel.Ниже приведен пример того, как вы можете сделать это в контроллере MVC.

// your MVC controller
[HttpGet]
public FileResult DownloadExcel()
{
    var createExcel = new CreateWorkBook();
    byte[] excelFile = null;
    try
    {
        excelFile = createExcel.Export_To_Excel();
    }
    catch (Exception ex)
    {
        // handle exception
    }
    string fileType = @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    string fileName = "excel.xlsx";

    return File(excelFile, fileType, fileName);
}
0 голосов
/ 16 января 2019

просто не используйте приведенный ниже код, который не относится к операции экспорта в Excel.

//HttpContext.Current.Response.Clear();
//HttpContext.Current.Response.Buffer = true;
//System.Web.HttpContext.Current.Response.Charset = "";
//System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
//System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename= SubmissionForm.xlsx");

using (MemoryStream MyMemoryStream = new MemoryStream())
{
    wb.SaveAs(MyMemoryStream);
    //you need to replace below line according to your need. **
    //MyMemoryStream.WriteTo(System.Web.HttpContext.Current.Response.OutputStream);
    //System.Web.HttpContext.Current.Response.Flush();
    //System.Web.HttpContext.Current.Response.End();
}

** Не зная структуры вашего проекта и ваших намерений, невозможно сказать вам правильный способ загрузки / сохранения этого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...