Xuất Dữ Liệu Từ Datagridview Vào File Excel Trong C# Winforms

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.

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ừ DataGridView sang 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à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ệnMô tảCách cài đặt
Microsoft.Office.Interop.ExcelThư 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
EPPlusThư viện .NET mạnh mẽ hỗ trợ tạo/đọc file XLSX.NuGet: Install-Package EPPlus
ClosedXMLThư 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ểmNhược điểm
Hỗ trợ đầy đủ tính năng ExcelYêu cầu cài đặt Office
Độ tin cậy caoTiêu tốn bộ nhớ và CPU
Hỗ trợ macro/VlerindenKhô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ểmNhược điểm
Không cần OfficeGiấ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ợpKhông hỗ trợ macro

2.4 Tối ưu

Xuất Dữ Liệu Từ Datagridview Vào File Excel C# Winform
Xuất Dữ Liệu Từ Datagridview Vào File Excel C# Winform
  • Thay vì lặp qua từng ô, có thể sử dụng ExcelRangeBase.LoadFromDataTable nếu dữ liệu nằm trong DataTable.
  • Đố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.Load với PackageReadMode.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ểmNhược điểm
Đơn giản, dễ đọcKhông hỗ trợ macro
Tiêu thụ tài nguyên thấpGiớ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ặp foreach thay vì lặp qua Index có thể giảm overhead.
  • Đối với dữ liệu lớn, hãy kiểm tra độ lớn của MemoryStream khi 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íInteropEPPlusClosedXML
Cần OfficeCóKhôngKhông
Độ phức tạpCaoTrung bìnhThấp
Hiệu năngThấp (đối với dữ liệu lớn)Trung bìnhCao
Định dạng nâng caoHỗ trợHỗ trợHỗ trợ
MacroCóKhôngKhông
Giấy phépMiễn phíMiễn phí nhưng giới hạnMiễn phí
Độ bảo mậtCần cài đặt Office, có thể lộ thông tin khi khởi động MarkeTốt hơn, không cài OfficeTố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:

  1. 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ợ LoadFromDataTable batch.

  2. Streaming: Sử dụng ExcelPackage với PackageReadMode.Create để tránh tải toàn bộ dữ liệu vào bộ nhớ. Tương tự, ClosedXML có thể viết trực tiếp vào MemoryStream.

  3. 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ụng BackgroundWorker hoặc async/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 DataTable chỉ 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 .xlsx thay 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

  1. Đị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";
  1. Tạo bảng (Table): Tạo ExcelTable giúp người dùng có thể lọc, sắp xếp.
var tbl = ws.Table("tblData");
tbl.ShowAutoFilter = true;
  1. 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"));
  1. 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.

  2. 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ọi Marshal.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() hay AdjustToContents() 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!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận