2015-12-16 2 views
0

Я написал код, который экспортирует данные с веб-страницы, чтобы использовать EPPlus, которые я хочу повторно использовать несколько раз в моем проекте, поэтому я переместил код в свой класс.Перемещение кода в класс вызывает ошибку HttpException

Это прекрасно работает, когда в коде на странице, но когда я переместить его в своем классе я получаю следующее сообщение об ошибке на Response.Clear() линии:

System.Web.HttpException (0x80004005): Response is not available in this context

Вот мой код

ExcelHelper Класс

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.IO; 
using System.Data; 
using OfficeOpenXml; 
using OfficeOpenXml.Table; 

namespace myClassLib 
{ 
    public class ExcelHelper : System.Web.UI.Page 
    { 

     public void exportExcel(DataTable myDataTable) 
     { 
      Response.Clear(); 
      Response.Charset = ""; 
      Response.ContentEncoding = System.Text.Encoding.UTF8; 
      Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.AddHeader("content-disposition", "attachment;filename=Output.xlsx"); 

      DataTable dt= myDataTable; 

      ExcelPackage pck = new ExcelPackage(); 
      using(pck) 
      { 
       ExcelWorksheet wsDt = pck.Workbook.Worksheets.Add("Sheet1"); 
       wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.None); 

       int colNumber = 1; 

       foreach (DataColumn col in dt.Columns) 
       { 

        if (col.DataType == typeof(DateTime)) 
        { 
         wsDt.Column(colNumber).Style.Numberformat.Format = "yyyy-mm-dd"; 
        } 
        colNumber = colNumber + 1; 
       } 

       wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); 

       Response.BinaryWrite(pck.GetAsByteArray()); 
      } 

      Response.Flush(); 
      Response.End(); 

     } 

    } 
} 

код для вызова класса

ExcelHelper myExcelHelper = new ExcelHelper(); 
myExcelHelper.exportExcel(myDataTable); 

Любая помощь очень ценится

+0

Вы должны избавиться от всех System.Web кода, связанного с вашего класса, если вы действительно хотите использовать его везде и передать необходимые значения свойств в качестве параметров метода –

+0

Используете ли вы WebForms или MVC? Является ли этот код отдельным проектом или веб-проектом? В принципе, вы не можете получить доступ к объекту Response, поэтому нам нужно сначала определить другие вопросы. – ragerory

+0

Извинения. используя webforms, код находится в отдельном проекте, но я правильно добавил ссылки, так как другие классы работают нормально. –

ответ

0

Вы унаследовали ваш помощник от Page, вероятно, потому, что вы хотите доступ к HttpResponse например, предлагаемых в Response собственности. Однако класс Page должен быть создан HTTP-конвейером ASP.NET, чтобы он правильно настроил свое внутреннее состояние. Это не происходит в вашем сценарии. Если вы реорганизуете его следующим образом, вы можете создать свое поколение Excel в вспомогательном классе с дополнительными положительными эффектами для экспорта в файл.

public class ExcelExporter 
{ 
    DataTable dt; 
    string filename = "Output.xlsx"; 
    // create exporter for datatable 
    public ExcelExporter(DataTable dt) 
    { 
     this.dt = dt; 
    } 

    // creates an exporter for a datatable and filename 
    public ExcelExporter(DataTable dt, string filename):this(dt) 
    { 
     this.filename = filename; 
    } 

    // exports excel to given httpResponse 
    public void Export(HttpResponse response) 
    { 
     Response.Clear(); 
     Response.Charset = ""; 
     Response.ContentEncoding = System.Text.Encoding.UTF8; 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader(
      "content-disposition", 
      String.Format("attachment;filename={0}",filename)); 

     Response.BinaryWrite(Export()); 

     Response.Flush(); 
     Response.End(); 

    } 

    // export excel package in path with defaukt name 
    public void Export(string path) 
    { 
     Export(path, filename); 
    } 

    // export excel package as file in path 
    public void Export(string path, string file) 
    { 
     var full = Path.Combine(path, file); 
     File.WriteAllBytes(full, Export()); 
    } 

    //exort Excel package as Byte array 
    public byte[] Export() 
    { 
     ExcelPackage pck = new ExcelPackage(); 
     using (pck) 
     { 
      ExcelWorksheet wsDt = pck.Workbook.Worksheets.Add("Sheet1"); 
      wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.None); 

      int colNumber = 1; 

      foreach (DataColumn col in dt.Columns) 
      { 

       if (col.DataType == typeof(DateTime)) 
       { 
        wsDt.Column(colNumber).Style.Numberformat.Format = "yyyy-mm-dd"; 
       } 
       colNumber = colNumber + 1; 
      } 

      wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); 
      return pck.GetAsByteArray(); 
     } 
    } 

} 

Чтобы использовать эту новую версию вы будете называть это как следует из вашей страницы ASP.NET:

myExcelHelper = new ExcelExproter(myDataTable); 
myExcelHelper.Export(Response); // Response will be the HttpResponse of the current executing page 
Смежные вопросы