Trong trang aspx thường bạn tạo nút lệnh tìm kiếm dữ liệu và có button Export excel cho phep người dùng xuất dữ liệu đó ra excel.
<asp:Button ID="btnExport" runat="server" Text="Export to Excel"
onclick="btnExport_Click" />
Trong bài viết để dễ trình bày tôi tự tạo là một DataTable (Dữ liệu khi bạn sử dụng hàm này sẽ là kết quả của câu truy vấn SQL hay từ Store Procedure) có dữ liệu như sau:
private DataTable GetData()
{
DataTable dtb = new DataTable();
//Tạo các Columns
dtb.Columns.Add("Name");
dtb.Columns.Add("Weight");
dtb.Columns.Add("HrefUrl");
//Thêm các bản ghi
dtb.Rows.Add("hmweb", "500", "hmweb.aspx");
dtb.Rows.Add("Luyện thi", "240", "luyen-thi.aspx");
dtb.Rows.Add("Toán", "270", "toan.aspx");
dtb.Rows.Add("asp.net", "439", "aspnet.aspx");
dtb.Rows.Add("SQL server", "400", "SQL-server.aspx");
dtb.Rows.Add("Accessibility", "58", "Accessibility.aspx");
dtb.Rows.Add("Ajax", "218", "Ajax.aspx");
dtb.Rows.Add("Csharp", "390", "Csharp.aspx");
dtb.Rows.Add("OTDH", "250", "OTDH.aspx");
dtb.Rows.Add("jquery", "175", "jquery.aspx");
dtb.Rows.Add("Luyện thi", "123", "luyen-thi.aspx");
dtb.Rows.Add("Store", "234", "Store.aspx");
dtb.Rows.Add("Facebook", "234", "Facebook.aspx");
dtb.Rows.Add("Microsoft", "204", "Microsoft.aspx");
dtb.Rows.Add("google", "290", "google.aspx");
dtb.Rows.Add("silverlight", "274", "silverlight.aspx");
dtb.Rows.Add("VTV2", "304", "VTV2.aspx");
dtb.Rows.Add("Phân trang", "204", "phan-trang.aspx");
dtb.Rows.Add("Cơ sở dữ liệu", "454", "Co-so-du-lieu.aspx");
dtb.Rows.Add("Autocomplete", "278", "Autocomplete.aspx");
dtb.Rows.Add("trigger", "312", "trigger.aspx");
dtb.Rows.Add("HTML", "453", "HTML.aspx");
return dtb;
}
Giờ tôi viết hàm ExportToExcel với tham số truyền vào là tên file sẽ được save khi chọn button export.
public void ExportToExcel(string fileName)
{
Response.ContentType = "application/csv";
Response.Charset = "";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.ContentEncoding = Encoding.Unicode;
Response.BinaryWrite(Encoding.Unicode.GetPreamble());
DataTable dtb = GetData();
try
{
StringBuilder sb = new StringBuilder();
//Tạo dòng tiêu để cho bảng tính
for (int count = 0; count < dtb.Columns.Count; count++)
{
if (dtb.Columns[count].ColumnName != null)
sb.Append(dtb.Columns[count].ColumnName);
if (count < dtb.Columns.Count - 1)
{
sb.Append("\t");
}
}
Response.Write(sb.ToString() + "\n");
Response.Flush();
//Duyệt từng bản ghi
int soDem = 0;
while (dtb.Rows.Count >= soDem + 1)
{
sb = new StringBuilder();
for (int col = 0; col < dtb.Columns.Count - 1; col++)
{
if (dtb.Rows[soDem][col] != null)
sb.Append(dtb.Rows[soDem][col].ToString().Replace(",", " "));
sb.Append("\t");
}
if (dtb.Rows[soDem][dtb.Columns.Count - 1] != null)
sb.Append(dtb.Rows[soDem][dtb.Columns.Count - 1].ToString().Replace(",", " "));
Response.Write(sb.ToString() + "\n");
Response.Flush();
soDem = soDem + 1;
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
dtb.Dispose();
Response.End();
}
Sự kiện btnExport_Click
protected void btnExport_Click(object sender, EventArgs e)
{
ExportToExcel("hmweb_export_datatable_to_excel_demo.xls");
}
Chú ý là ở hàm trên nếu bạn thao tác với cơ sở dữ liệu nhất là với các Store procedure thì nó sẽ xuất tất cả các trường của store, cả những trường bạn không cho hiển thị trên kết quả tìm kiếm (Gridview) ví dụ trường ID chẳng hạn, vậy muốn chọn các trường nào để export và loại bỏ các trường còn lại thì làm sao? Bạn dùng hàm như sau:
public void ExportToExcel(string fileName)
{
Response.ContentType = "application/csv";
Response.Charset = "";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.ContentEncoding = Encoding.Unicode;
Response.BinaryWrite(Encoding.Unicode.GetPreamble());
DataTable dtb = GetData();
try
{
StringBuilder sb = new StringBuilder();
//Add Header
int[] icolumn = new int[] { 1, 2, 3, 4, 5};
for (int count = 0; count < icolumn.Length; count++)
{
if (dtb.Columns[icolumn[count]].ColumnName != null)
sb.Append(dtb.Columns[icolumn[count]].ColumnName);
if (count < icolumn.Length - 1)
{
sb.Append("\t");
}
}
Response.Write(sb.ToString() + "\n");
Response.Flush();
//Append Data
int soDem = 0;
while (dtb.Rows.Count >= soDem + 1)
{
sb = new StringBuilder();
for (int col = 0; col < icolumn.Length - 1; col++)
{
if (dtb.Rows[soDem][icolumn[col]] != null)
sb.Append(dtb.Rows[soDem][icolumn[col]].ToString().Replace(",", " "));
sb.Append("\t");
}
if (dtb.Rows[soDem][dtb.Columns.Count - 1] != null)
sb.Append(dtb.Rows[soDem][dtb.Columns.Count - 1].ToString().Replace(",", " "));
Response.Write(sb.ToString() + "\n");
Response.Flush();
soDem = soDem + 1;
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
dtb.Dispose();
Response.End();
}
Trong hàm trên giả câu truy vấn SQL hay Store Procedure dữ liệu của bạn có nhiều trường và trường thứ nhất là ID chẳng hạn và bạn bỏ qua trường này và chỉ xuất các trường 1,2,3,4,5 bỏ qua trường ID và các trường khác nếu có (Theo thứ tự chỉ số đầu tiên là 0). là do bạn khai báo ở int[] icolumn = new int[] { 1, 2, 3, 4, 5};
Phương pháp trên đây tôi đã và đang dùng cho công việc của tôi và đã chạy với dữ liệu lớn nhiều nhất khoảng 50,000 bản ghi vẫn chạy tốt. Hy vọng chia sẻ này sẽ áp dụng được với các bạn
Chúc các bạn thành công