2008-09-29 22 views
5

Chúng tôi cho phép người dùng tạo truy vấn đặc biệt trên trang web của chúng tôi. Chúng tôi muốn người dùng chọn tiêu chí của họ, sau đó nhấp vào gửi và tự động phát trực tuyến kết quả cho Excel. Tôi có ứng dụng populating một DataTable, sau đó sử dụng datatable để tạo ra một chuỗi phân cách tab. Vấn đề là nhận được điều đó để vượt trội.Gửi kết quả truy vấn tới Excel từ trang web ASP.NET

Cách tốt nhất để truyền dữ liệu đến Excel là gì? Ưu tiên hơn, chúng tôi sẽ không phải khiến người dùng đóng cửa sổ trống sau khi nhấp vào nút gửi.

Trả lời

10

Thay đổi loại tệp của trang thành excel và chỉ luồng HTML cần thiết để tạo bảng cho trang. mã từ here

//for demo purpose, lets create a small datatable & populate it with dummy data 
System.Data.DataTable workTable = new System.Data.DataTable(); 

//The tablename specified here will be set as the worksheet name of the generated Excel file. 
workTable.TableName = "Customers"; 
workTable.Columns.Add("Id"); 
workTable.Columns.Add("Name"); 
System.Data.DataRow workRow; 

for (int i = 0; i <= 9; i++) 
{ 
workRow = workTable.NewRow(); 
workRow[0] = i; 
workRow[1] = "CustName" + i.ToString(); 
workTable.Rows.Add(workRow); 
} 

//...and lets put DataTable2ExcelString to work 
string strBody = DataTable2ExcelString(workTable); 

Response.AppendHeader("Content-Type", "application/vnd.ms-excel"); 
Response.AppendHeader("Content-disposition", "attachment; filename=my.xls"); 
Response.Write(strBody); 
+1

Chỉ cần lưu ý rằng điều này không tạo ra một tệp excel bình thường như thể bạn đã mở excel và tạo một cách thủ công ... đó là tệp html. –

0

tôi khuyên bạn nên sử dụng một filehandler (.ashx) Vấn đề duy nhất là tạo ra các tập tin excel từ DataTable. Có rất nhiều sản phẩm của bên thứ ba sẽ làm điều này cho bạn (ví dụ: Infragistics cung cấp một thành phần chỉ thực hiện việc này).

Một điều tôi khuyên bạn nên chống lại là sử dụng Excel interop trên máy chủ của bạn ... nó rất nặng và không được hỗ trợ.

1

Nếu bạn tạo trang chỉ là một bảng có kết quả và đặt loại nội dung của trang thành "application/vnd.ms-excel", thì đầu ra sẽ có trong Excel.

Response.ContentType = "application/vnd.ms-excel"; 

Nếu bạn muốn buộc một lưu, bạn sẽ làm điều gì đó như sau:

Response.AddHeader("Content-Disposition", "attachment; filename=somefilename.xls"); 
0

Một khi bạn có Dataset của bạn, bạn có thể chuyển nó sang một đối tượng [,] và chèn nó vào một Tài liệu Excel. Sau đó, bạn có thể lưu tài liệu vào đĩa và truyền nó tới người dùng.

 //write the column headers 
     for (int cIndex = 1; cIndex < 1 + columns; cIndex++) 
      sheet.Cells.set_Item(4, cIndex, data.Columns[cIndex - 1].Caption); 
     if (rows > 0) 
     { 

      //select the range where the data will be pasted 
      Range r = sheet.get_Range(sheet.Cells[5, 1], sheet.Cells[5 + (rows - 1), columns]); 

      //Convert the datatable to an object array 
      object[,] workingValues = new object[rows, columns]; 

      for (int rIndex = 0; rIndex < rows; rIndex++) 
       for (int cIndex = 0; cIndex < columns; cIndex++) 
        workingValues[rIndex, cIndex] = data.Rows[rIndex][cIndex].ToString(); 

      r.Value2 = workingValues; 
     } 
+0

Nhưng đừng làm điều đó (tự động hoá Excel) trên máy chủ. http://support.microsoft.com/kb/257757 – Cheeso

+0

Điều này được thực hiện ở phía khách hàng. –

0

Tôi sẽ sử dụng trình xử lý cho phần mở rộng tệp .xls và thành phần miễn phí để chuyển đổi DataTable thành định dạng xls gốc. Thành phần từ trang web này http://www.csvreader.com/ có ý nghĩa nhiều hơn về URL. Phiên bản mới nhất của excel sẽ khiếu nại về tệp XLS được định dạng HTML. Cũng nên ghi nhớ kích thước của dữ liệu được trả về. Máy chủ web của bạn nên sử dụng tính năng nén cho tiện ích mở rộng này và mã của bạn nên kiểm tra xem số hàng được trả về có lớn hơn số lượng excel có thể hiển thị trong một trang tính hay không; có thể yêu cầu nhiều trang tính. http://www.mrexcel.com/archive2/23600/26869.htm

1

Tôi có một hàm utils đã thực hiện điều này. Một khi bạn đặt nó vào một DataTable, bạn có thể xuất nó với các ứng dụng

 public static void DataTabletoXLS(DataTable DT, string fileName) 
    { 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.Charset = "utf-16"; 
     HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250"); 
     HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName)); 
     HttpContext.Current.Response.ContentType = "application/ms-excel"; 

     string tab = ""; 
     foreach (DataColumn dc in DT.Columns) 
     { 
      HttpContext.Current.Response.Write(tab + dc.ColumnName.Replace("\n", "").Replace("\t", "")); 
      tab = "\t"; 
     } 
     HttpContext.Current.Response.Write("\n"); 

     int i; 
     foreach (DataRow dr in DT.Rows) 
     { 
      tab = ""; 
      for (i = 0; i < DT.Columns.Count; i++) 
      { 
       HttpContext.Current.Response.Write(tab + dr[i].ToString().Replace("\n", "").Replace("\t", "")); 
       tab = "\t"; 
      } 
      HttpContext.Current.Response.Write("\n"); 
     } 
     HttpContext.Current.Response.End(); 
       } 
+0

+1. Điều gì về điều này, mặc dù: trả về nhiều bộ kết quả, sử dụng một mẫu excel hiện có, nhiều trang tính và đặt mỗi bộ kết quả vào (các) ô thích hợp trên trang tính thích hợp? – mg1075

0

Vui lòng sử dụng mã này để giải quyết đang problem.This của bạn sẽ chuyển đổi excel sang văn bản format.Hope này sẽ giải quyết vấn đề của bạn

grdSrcRequestExport.RenderControl(oHtmlTextWriter); 
    string s = ""; 
    s=oStringWriter.ToString().Replace("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">", ""); 
    s="<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type content=\"text/html; charset=us-ascii\"><meta name=ProgId content=Excel.Sheet><meta name=Generator content=\"Microsoft Excel 11\"><table x:str border=0 cellpadding=0 cellspacing=0 width=560 style='border-collapse: collapse;table-layout:fixed;width:420pt'>"+s.ToString()+"</table></body></html>"; 
    //Byte[] bContent = System.Text.Encoding.GetEncoding("utf-8").GetBytes(); 
    Response.Write(s); 
Các vấn đề liên quan