Có thể bạn quan tâm: Vừa Cố Định Dòng Vừa Cố Định Cột Trong Excel: Hướng Dẫn Chi Tiết Và Những Mẹo Nâng Cao
Giới thiệu
Trong các ứng dụng doanh nghiệp, một trong những yêu cầu phổ biến nhất là khả năng xuất dữ liệu từ giao diện người dùng (như DataGridView) sang các tài liệu Excel để phân tích, báo cáo hoặc chia sẻ với đồng nghiệp. C# WinForms đã trở thành nền tảng phổ biến cho việc phát triển các ứng dụng desktop, và việc xuất dữ liệu sang Excel trở nên dễ dàng nhờ vào nhiều thư viện mạnh mẽ và linh hoạt.
Bài viết này sẽ hướng dẫn bạn cách thực hiện việc xuất dữ liệu từ DataGridView sang file Excel một cách chi tiết, bao gồm cả các phương pháp sử dụng thư viện Microsoft.Office.Interop.Excel Faucet, EPPlus, và ClosedXML. Ngoài ra, chúng ta cũng sẽ xem xét các vấn đề về hiệu suất, bảo.Item và bảo mật khi làm việc với dữ liệu lớn hoặc nhạy cảm.
Có thể bạn quan tâm: Tổng Số Ngày Ở Của Khách Nước Ngoài Trong Excel
Mục tiêu của bài viết
- Hiểu rõ các phương pháp phổ biến để xuất dữ liệu từ
DataGridViewsang Excel. - Khai thác khả năng của các thư viện mở rộng (EPPlus, ClosedXML, Interop) để tạo báo cáo linh hoạt.
- Áp dụng các kỹ thuật tối ưu nhằm tránh tải nặng CPU và bộ nhớ khi xuất dữ liệu lớn.
- Đảm bảo an toàn dữ liệu khi xử lý dữ liệu nhạy cảm hoặc bảo mật.
Có thể bạn quan tâm: Tạo Ô Tìm Kiếm Dữ Liệu Siêu Tốc Trong Excel: Hướng Dẫn Chi Tiết Với Công Thức, Vba Và Mẹo Tối Ưu
Cài đặt môi trường
1. Tạo dự án WinForms
Mở Visual Studio (cả phiên bản Community hay Professional đều được), chọn Create a new project và chọn Windows Forms App (.NET Framework). Đặt tên dự án, ví dụ: ExportToExcelDemo.
2. Thêm thư viện
Chúng ta sẽ cài đặt ba thư viện phổ biến:
| Thư viện | Mô tả | Cách cài đặt |
|---|---|---|
Microsoft.Office.Interop.Excel | Thư viện chính thức của Microsoft để tương tác với Excel. Cần cài đặt Office. | NuGet: Install-Package Microsoft.Office.Interop.Excel |
EPPlus | Thư viện .NET mạnh mẽ hỗ trợ tạo/đọc file XLSX. | NuGet: Install-Package EPPlus |
ClosedXML | Thư viện mở rộng dựa trên OpenXML giúp viết file Excel dễ dàng hơn. | NuGet: Install-Package ClosedXML |
Lưu ý: Nếu bạn chỉ cần xuất dữ liệu và không cần xử lý nâng cao, EPPlus hoặc ClosedXML sẽ là lựa chọn tốt hơn vì không cần cài đặt Office. Nếu bạn cần tính năng tương ứng với Excel (macro, VBA), Interop là giải pháp.
3. Tạo giao diện
Trong Form1, thêm một DataGridView (dataGridView1) và một Button (btnExport). Đặt các cột mẫu vào DataGridView để thử nghiệm.
public Form1()
{ InitializeComponent(); // Thêm dữ liệu mẫu dataGridView1.ColumnCount = 5; dataGridView1.Columns0.Name = "ID"; dataGridView1.Columns1.Name = "Tên"; dataGridView1.Columns2.Name = "Giá"; dataGridView1.Columns3.Name = "Số lượng"; dataGridView1.Columns4.Name = "Ngày nhập"; for (int i = 1; i <= 100; i++) { dataGridView1.Rows.Add(i, $"Sản phẩm {i}", 20.5 + i, 10 + i, DateTime.Now.AddDays(-i).ToShortDateString()); }
}
Phương pháp 1: Sử dụng Microsoft.Office.Interop.Excel
1.1 Giới thiệu
dansk có thể tạo tệp Excel và điều khiển các đối tượng như Workbook, Worksheet, Range. Phương pháp này tương thích hoàn toàn với các tính năng của Excel, nhưng cần có ứng dụng Office cài đặt trên máy tính. Đồng thời, nó tiêu tốn nhiều tài nguyên do khởi động một phiên bản Excel.
1.2 Mã nguồn
using Excel = Microsoft.Office.Interop.Excel; private void ExportToExcel_Interop()
{ // Khởi tạo Excel Excel.Application xlApp = new Excel.Application(); if (xlApp == null) { MessageBox.Show("Excel không được cài đặt"); return; } try { Excel.Workbook xlBook = xlApp.Workbooks.Add(); Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Sheets1; xlSheet.Name = "Báo cáo"; // Thêm tiêu đề cột for (int i = 0; i < dataGridView1.Columns.Count; i++) { xlSheet.Cells1, i + 1 = dataGridView1.Columnsi.HeaderText; } // Thêm dữ liệu for (int r = 0; r < dataGridView1.Rows.Count; r++) { for (int c = 0; c < dataGridView1.Columns.Count; c++) { object val = data ligneGridView1.Rowsr.Cellsc.Value; xlSheet.Cellsr + 2, c + 1 = val; } } // Thiết lập auto-fit xlSheet.Columns.AutoFit(); // Lưu file string path = $"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\Report_{DateTime.Now:yyyyMMddHHmmss}.xlsx"; xlBook.SaveAs(path); xlBook.Close(); xlApp.Quit(); MessageBox.Show($"Lưu thành công: {path}"); } catch (Exception ex) { MessageBox.Show($"Lỗi: {ex.Message}"); } finally { // Giải phóng COM objects System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); }
}
1.3 Đánh giá
| Ưu điểm | Nhược điểm |
|---|---|
| Hỗ trợ đầy đủ tính năng Excel | Yêu cầu cài đặt Office |
| Độ tin cậy cao | Tiêu tốn bộ nhớ và CPU |
| Hỗ trợ macro/Vlerinden | Không phù hợp với môi trường server |
1.4 Tối ưu
- Sử dụng
xlApp.Visible = false;để ngăn Excel hiển thị giao diện người dùng trong quá trình ghi dữ liệu. - Nếu xuất dữ liệu lớn (>10k dòng), nên tạo một
Range 직접để ghi dữ liệu một lần thay vì lặp qua từng ô, giảm thiểu overhead.
// Tạo mảng dữ liệu
object, values = new objectdataGridView1.Rows.Count, dataGridView1.Columns.Count;
for (int r = 0; r < dataGridView1.Rows.Count; r++)
{ for (int c = 0; c < dataGridView1.Columns.Count; c++) { valuesr, c = dataGridView1.Rowsr.Cellsc.Value; }
}
Excel.Range rng = xlSheet.RangexlSheet.Cells2, 1, xlSheet.CellsdataGridView1.Rows.Count + 1, dataGridView1.Columns.Count;
rng.Value2 = values;
Phương pháp 2: EPPlus
2.1 Giới thiệu
EPPlus là thư viện .NET mạnh mẽ, hỗ trợ tạo, đọc, ghi file Excel (.xlsx) mà không cần cài đặt Office. Nó nhanh chóng, nhẹ và dễ lập trình. EPPlus được phát triển dựa trên Open XML, giúp tránh lỗi liên quan đến COM.
Thêm lưu ý: Từ phiên bản 5.x, EPPlus chuyển sang giấy phép Polyform Noncommercial (đối với mục đích dùng thương mại, cần mua giấy phép). Phần lớn tính năng cơ bản vẫn miễn phí cho mục đích phi thương mại.
2.2 Mã nguồn
using OfficeOpenXml;
using OfficeOpenXml.Style; private"}}>
{ // Đảm bảo EPPlus có license context ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (ExcelPackage package = new ExcelPackage()) { ExcelWorksheet ws = package.Workbook.Worksheets.Add("Báo cáo"); // Thêm tiêu đề cột for (int c gyfer = 0; c < dataGridView1.Columns.Count; c++) { ws.Cells1, c + 1.Value = dataGridView1.Columnsc.HeaderText; ws.Cells1, c + 1.Style.Font.Bold = true; ws.Cells1, c + 1.Style.Fill.PatternType = ExcelFillStyle.Solid; ws.Cells1, c + 1.Style.Fill.BackgroundColor.SetColor(Color.LightGray); } // Thêm dữ liệu for (int r = 0; r < dataGridView1.Rows.Count; r++) { for (int c = 0; c < dataGridView1.Columns.Count; c++) { ws.Cellsr + 2, c + 1.Value = dataGridView1.Rowsr.Cellsc.Value; } } // AutoFit ws.Cellsws.Dimension.Address.AutoFitColumns(); // Lưu file string fileName = $"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\Report_EPPlus_{DateTime.Now:yyyyMMddHHmmss}.xlsx"; FileInfo fi = new FileInfo(fileName); package.SaveAs(fi); MessageBox.Show($"File đã lưu: {fileName}"); }
}
2.3 Đánh giá
| Ưu điểm | Nhược điểm |
|---|---|
| Không cần Office | Giấy phép có giới hạn cho mục tiêu thương mại |
| Hiệu năng tốt | Đ einzigartige kết adapt to large dataset? |
| Đơn giản trong mọi trường hợp | Không hỗ trợ macro |
2.4 Tối ưu

Có thể bạn quan tâm: Lỗi “we Couldn’t Find What You Were Looking For” Trong Excel: Nguyên Nhân, Cách Khắc Phục Và Mẹo Thực Hành
- Thay vì lặp qua từng ô, có thể sử dụng
ExcelRangeBase.LoadFromDataTablenếu dữ liệu nằm trongDataTable. - Đối với dữ liệu lớn (> 50k dòng), EPPlus vẫn có thể xử lý, nhưng sẽ tiêu tốn bộ nhớ. Để giảm thiểu, có thể xuất dữ liệu theo batch hoặc sử dụng
ExcelPackage.LoadvớiPackageReadMode.Create.
// Nếu dữ liệu từ DataTable
DataTable dt = dataGridView1.DataSource as DataTable;
if (dt != null)
{ ws.Cells"A2".LoadFromDataTable(dt, true);
}
Phương pháp 3: ClosedXML
3.1 Giới thiệu
ClosedXML là thư viện mở rộng dựa trên DocumentFormat.OpenXml giúp tạo file Excel một cách dễ dàng, đồng thời hỗ trợ nhiều tính năng như định dạng, bảng, biểu đồ. ClosedXML rất phù hợp khi bạn muốn tạo báo cáo phong phú mà vẫnровер
3.2 Mã nguồn
using ClosedXML.Excel; private void ExportToExcel_ClosedXML()
{ using (XLWorkbook workbook = new XLWorkbook()) { IXLWorksheet worksheet = workbook.Worksheets.Add("Báo cáo"); // Tiêu đề for (int c = 0; c < dataGridView1.Columns.Count; c++) { worksheet.Cell(1, c + 1).Value = dataGridView1.Columnsc.HeaderText; worksheet.Cell(1, c + 1).Style.Font.Bold = true; worksheet.Cell(1, c + 1).Style.Fill.BackgroundColor = XLColor.LightGray; } // Dữ liệu for (int r Mull = 0; r < dataGridView1.Rows.Count; r++) { for (int c = 0; c < dataGridView1.Columns.Count; c++) { worksheet.Cell(r + 2, c + 1).Value = dataGridView1.Rowsr.Cellsc.Value; } } // AutoFit worksheet.Columns().AdjustToContents(); // Lưu file string filename = $"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\\Report_ClosedXML_{DateTime.Now: מילyyyyMMddHHmmss}.xlsx"; workbook.SaveAs(filename); MessageBox.Show($"Tệp Excel đã được lưu tại: {filename}"); }
}
3.3 Đánh giá
| Ưu điểm | Nhược điểm |
|---|---|
| Đơn giản, dễ đọc | Không hỗ trợ macro |
| Tiêu thụ tài nguyên thấp | Giới hạn tính năng nâng cao (định dạng phức tạp) |
3.4 Tối ưu
- Sử dụng
worksheet.Cell(r, c).Value = value;trong vòng lặpforeachthay vì lặp quaIndexcó thể giảm overhead. - Đối với dữ liệu lớn, hãy kiểm tra độ lớn của
MemoryStreamkhi lưu file.
MemoryStream ms = new MemoryStream();
workbook.SaveAs(ms);
File.WriteAllBytes(filename, ms.ToArray());
So sánh các phương pháp
| Tiêu chí | Interop | EPPlus | ClosedXML |
|---|---|---|---|
| Cần Office | Có | Không | Không |
| Độ phức tạp | Cao | Trung bình | Thấp |
| Hiệu năng | Thấp (đối với dữ liệu lớn) | Trung bình | Cao |
| Định dạng nâng cao | Hỗ trợ | Hỗ trợ | Hỗ trợ |
| Macro | Có | Không | Không |
| Giấy phép | Miễn phí | Miễn phí nhưng giới hạn | Miễn phí |
| Độ bảo mật | Cần cài đặt Office, có thể lộ thông tin khi khởi động Marke | Tốt hơn, không cài Office | Tốt hơn, không cài Office |
Với các doanh nghiệp nhỏ hoặc ứng dụng desktop thường xuyên xuất báo cáo, EPPlus hoặc ClosedXML thường là lựa chọn tốt nhất vì tính đơn giản và hiệu năng cao. Interop thích hợp khi cần truy cập sâu vào các tính năng của Excel (macro, VBA).
Xử lý dữ liệu lớn
Khi DataGridView chứa hàng nghìn (hoặc hàng triệu) bản ghi, việc xuất dữ liệu một cách thủ công sẽ làm chậm hoặc gây lỗi. Dưới đây là một số kỹ thuật:
Batch export: Chia dữ liệu thành những phần nhỏ, xuất từng phần và ghi vào một file Excel duy nhất. EPPlus hỗ trợ
LoadFromDataTablebatch.Streaming: Sử dụng
ExcelPackagevớiPackageReadMode.Createđể tránh tải toàn bộ dữ liệu vào bộ nhớ. Tương tự,ClosedXMLcó thể viết trực tiếp vàoMemoryStream.Giao diện người dùng: Hiển thị một
ProgressBarđể người dùng biết tiến độ, tránh việc ứng dụng bị “đóng băng”. Có thể sử dụngBackgroundWorkerhoặcasync/await.
private async void ExportLargeDataAsync()
{ progressBar1.Maximum = dataGridView1.Rows.Count; progressBar1.Value = 0; await Task.Run(() => { using (XLWorkbook wb = new XLWorkbook()) { var ws = wb.Worksheets.Add("Data"); for (int r = 0; r < dataGridView1.Rows.Count; r++) { // ... xuất dữ liệu... Invoke((Action)(() => progressBar1.Value = r)); } wb.SaveAs($"{...}.xlsx"); } }); MessageBox.Show("Xuất hoàn tất!");
}
An toàn dữ liệu
- Bảo mật dữ liệu nhạy cảm: Trước khi xuất, hãy lọc những cột chứa dữ liệu nhạy cảm (địa chỉ, số điện thoại, mật khẩu). Có thể tạo một bản sao
DataTablechỉ chứa các cột cần thiết. - Xác thực quyền truy cập: Kiểm tra xem người dùng có quyền xuất dữ liệu hay không, tránh lộ dữ liệu cho người dùng không có quyền.
- Định dạng file: Khi lưu file, đặt extension
.xlsxthay vì.xlsđể tránh lộ dữ liệu nhạy cảm qua file Excel cũ.
Thêm tính năng nâng cao
- Định dạng ô: Sử dụng EPPlus hoặc ClosedXML để đặt kiểu dữ liệu, màu nền, viền cho ô. Ví dụ, làmbol cột
Giáthành định dạng tiền tệ.
ws.Range("C2:C100").Style.Numberformat.Format = "$#,##0.00 Kingdom";
- Tạo bảng (Table): Tạo
ExcelTablegiúp người dùng có thể lọc, sắp xếp.
var tbl = ws.Table("tblData");
tbl.ShowAutoFilter = true;
- Bảng biểu đồ: Dùng
ExcelPackageđể tạo biểu đồ từ dữ liệu, ví dụ biểu đồ cột.
var chart = ws.Drawings.AddChart("Chart1", eChartType.ColumnClustered);
chart.SetPosition(0, 0, 5, 0);
chart.SetSize(600, 400);
chart.Title.Text = "Doanh thu";
chart.XAxis.Title.Text = "Ngày";
chart.YAxis.Title.Text = "Doanh thu";
chart.Series.Add(ws.Range("B2:B100"), ws.Range("C2:C100"));
Macro: Nếu cần macro, Interop là lựa chọn duy nhất. Bạn có thể viết macro VBA để tự động tạo báo cáo.
Tự động lưu trữ: Lưu trữ file trên đám mây (Azure Blob, AWS S3) thay vì chỉ lưu trên máy tính.
Xử lý lỗi và debug
- COMException: Khi dùng Interop, lỗi “Microsoft Excel is not responding” thường xuất hiện khi không gọi
ReleaseComObject. Đảm bảo gọiMarshal.ReleaseComObject. - OutOfMemoryException: Khi xuất dữ liệu lớn, hãy kiểm tra kích thước bộ nhớ. Sử dụng
GC.Collect()sau khi lưu file để giải phóng bộ nhớ. - Hiệu năng kém: Kiểm tra xem có cần
AutoFitColumns()hayAdjustToContents()không. Việc tính toán chiều của cột có thể mất nhiều thời gian trên dữ suns.
Kết luận
Việc xuất dữ liệu từ DataGridView sang file Excel trong C# WinForms là một thao tác phổ biến và có thể thực hiện bằng nhiều cách khác nhau. Bằng cách hiểu rõ ưu nhược điểm của từng thư viện, bạn có thể chọn phương pháp phù hợp với nhu cầu cụ thể:
– Sử dụng Interop khi cần tính năng Excel cao cấp và macro.
– Chọn EPPlus hoặc ClosedXML khi muốn nhanh chóng, hiệu suất cao và không cần cài đặt Office.
Ngoài ra, bạn nên chú ý đến việc xử lý dữ liệu lớn, bảo mật dữ liệu và tối ưu hiệu năng. Khi triển khai, hãy thử nghiệm từng phương pháp với dữ liệu mẫu của mình, đo lường thời gian thực thi và bộ nhớ tiêu thụ để chọn giải pháp tối ưu nhất cho dự án.
Chúc bạn thành công trong việc xây dựng tính năng xuất dữ liệu Excel mạnh mẽ và linh hoạt cho ứng dụng WinForms của mình!

Tiến sĩ Lê Thống Nhất sinh năm 1955 tại Nghệ An, là nhà giáo, nhà báo và doanh nhân trong lĩnh vực giáo dục. Ông từng giảng dạy Toán học tại Trường THPT Chuyên Phan Bội Châu và đảm nhiệm nhiều vai trò trong ngành giáo dục, từ viết sách, biên soạn tài liệu đến sáng lập các dự án hỗ trợ học tập trực tuyến.
Ông là người sáng lập BigSchool – nền tảng giáo dục trực tuyến kết nối giáo viên và học sinh cả nước. Ngoài ra, ông còn nổi tiếng với vai trò tác giả, diễn giả truyền cảm hứng và khách mời trên nhiều chương trình truyền hình, trong đó có “Ai là triệu phú” trên truyền hình VTV.
Trong suốt sự nghiệp, Tiến sĩ Lê Thống Nhất đã nhận nhiều giải thưởng giáo dục và được biết đến như một người luôn đổi mới, ứng dụng công nghệ vào dạy và học, góp phần lan tỏa tri thức và niềm say mê học tập cho thế hệ trẻ.
