2013-06-14 28 views
5

Tôi đã phát triển một ứng dụng mà tôi đang nhận dữ liệu từ cơ sở dữ liệu, liên kết nó với lưới Infragistics và sau đó tải xuống excel bằng tiện ích xuất.Quá trình tải xuống Excel chết trang trong trường hợp số liệu lớn trong ASP.NET

Có sự cố với phương pháp này khi tập dữ liệu lớn (20000 bản ghi trở lên), sẽ mất nhiều thời gian để xử lý và tải xuống và thường sẽ chết trang và hiển thị trang trống người dùng.

Có phương pháp nào tốt hơn để xử lý vấn đề này và thực hiện các cải tiến hợp lý trong excel tải xuống quy trình không?

Mã cũng giống như một cái gì đó dưới đây:

public void LoadExcelPostingData() 
     { 
      try 
      { 
       query = "Some complex query here with up to 10 columns"; 
       dt.Clear(); 
       dt = new DataTable(); 
       db2.GetDataTable(query, CommandType.Text, ref dt); 

       grdJurdata.DataSource = dt; 
       grdJurdata.DataBind(); 

       ExportToExcel(); 
      } 
      catch (Exception ex) 
      { 
       lblresult.Text = "Grd Err : " + ex.Message; 
      } 

     } 
    private void ExportToExcel() 
     { 
      try 
      { 
       // Infragistics built in excel export utility 
       UltraWebGridExcelExporter2.Export(grdJurdata);    
      } 
      catch (Exception ex) 
      { } 

     } 
+0

Đơn giản bạn cần một cơ chế tốt để tải xuống các tệp excel lớn. Đúng? – Freak

+0

Chia sẻ mã của bạn cũng như – Freak

+0

@freak, tôi đang yêu cầu/tìm kiếm cơ chế tốt! –

Trả lời

2

Về tập tin tải về của Microsoft MSDN cung cấp một detailed explanation

  • Nhận phản hồi
  • Với phản hồi, Đặt loại nội dung thành "APPLICATION/OCTET-STREAM" (nghĩa là không có ứng dụng nào để mở tệp).
  • Đặt tiêu đề thành "Nội dung bố trí", "tệp đính kèm; tên tệp = \" "+ +" \ "".
  • Viết nội dung tệp vào phản hồi.
  • Đóng phản hồi.

Cũng nên nhớ rằng không bao giờ sử dụng yêu cầu Ajax để tải về tập tin bởi vì đối với chuyển tập tin, Nó cần hoàn PostBack Yêu cầu
Đây là đoạn mã mẫu được trên MSDN

<% 
try 
{ 
    System.String filename = "myFile.txt"; 

    // set the http content type to "APPLICATION/OCTET-STREAM 
    Response.ContentType = "APPLICATION/OCTET-STREAM"; 

    // initialize the http content-disposition header to 
    // indicate a file attachment with the default filename 
    // "myFile.txt" 
    System.String disHeader = "Attachment; Filename=\"" + filename + 
     "\""; 
    Response.AppendHeader("Content-Disposition", disHeader); 

    // transfer the file byte-by-byte to the response object 
    System.IO.FileInfo fileToDownload = new 
     System.IO.FileInfo("C:\\downloadJSP\\DownloadConv\\myFile.txt"); 
    Response.Flush(); 
    Response.WriteFile(fileToDownload.FullName);} 
catch (System.Exception e) 
// file IO errors 
{ 
    SupportClass.WriteStackTrace(e, Console.Error); 
} 
%> 



Tôi cũng đề nghị bạn đọc this good discussion

Chỉnh sửa # 1: Một giải pháp khác cho trường hợp của bạn là Tạo trang mới để giữ UltraWebGridExcelExport er và trong trang chính của bạn, tạo thẻ iframe để giữ trang mới đó. Hãy để postback iframe. Và cũng nâng cấp phiên bản Infgraistics của bạn lên phiên bản mới nhất.

+0

Bạn có nghĩ rằng, nó sẽ hoạt động OK trong trường hợp tập dữ liệu lớn. Nếu chúng tôi cố gắng để có được phản ứng trực tiếp và cố gắng để xuất nó trong excel sau đó nó có thể gây ra bộ nhớ IO ngoại lệ. Bạn có muốn giải thích nó không? –

+0

Có Không. Bạn nên thử với mã này – Freak

+0

OK, Chắc chắn. Tôi sẽ thử phương pháp này. –

0

Trước tiên, bạn cần phải relook vào mã như thế nào bạn đã viết. bạn cần phải refactor hoặc cải thiện codebase.

nếu bạn muốn tăng thời gian chờ yêu cầu, sau đó bạn có thể làm này bạn cần phải thêm thời gian timeout hơn trong web.config

<system.web> 
     <httpruntime executionTimeout="4800"/> //or higher values 
    </system.web> 
+0

Mã là được cập nhật trong mô tả câu hỏi. Nếu chúng tôi tăng thời gian thực thi thì nó sẽ chỉ tăng khả năng nhận phản hồi, nhưng nó sẽ không khắc phục được vấn đề hiệu suất. –

Các vấn đề liên quan