Export Dữ Liệu Từ Datagridview Sang Excel Trong Vb.net

Giới thiệu

Trong các ứng dụng quản lý doanh nghiệp, phần mềm thường được xây dựng bằng Visual Basic .NET (VB.NET) để tận dụng tính năng mạnh mẽ của .NET Framework và khả năng tương tác với Windows Forms. Một trong những tính năng phổ biến mà người dùng thường yêu cầu là khả năng xuất dữ liệu từ một DataGridView – một ô bảng dữ liệu trong giao diện người dùng – ra file Excel để lưu trữ, chia sẻ hoặc phân tích thêm. Việc thực hiện chức năng này không những giúp nâng cao tính linh động của ứng dụng, mà còn giảm thiểu công sức nhập dữ liệu thủ công cho người dùng cuối.

Trong bài viết này, chúng ta sẽ đi sâu vào cách export dữ liệu từ DataGridView sang прие Excel trongtask VB.NET. Để đáp ứng nhu cầu thực tế, chúng ta sẽ trình bày hai phương pháp chính:
1. Sử dụng Microsoft.Office.Interop.Excel – thư viện chính thức của Microsoft để điều khiển Excel từ .NET.
2. Sử dụng Open XML SDK – một thư viện miễn phí, không cần cài đặt Excel trên máy khách, cho phép tạo file .xlsx một cách trực tiếp.

ensku. Chúng ta sẽ đi qua từng bước chi tiết, từ cài đặt thư viện, viết code, cho tới xử lý lỗi và tối ưu hiệu suất. Ngoài ra, bài viết cũng sẽ đề cập đến các vấn đề thường gặp khi export dữ liệu, cách xử lý các trường hợp đặc biệt như dữ liệu lớn, dữ liệu có kiểu dữ liệu phức tạp, và bảo mật dữ liệu khi lưu trữ.

Bạn có thể copy và chạy ngay code mẫu dưới đây trong Visual Studio, hoặc tùy chỉnh cho phù hợp với ứng dụng của mình. Hãy bắt đầu!

1. Tầm quan trọng của việc export dữ liệu

Trước khi đi vào chi tiết kỹ thuật, hãy nhìn nhận tầm quan trọng của việc export dữ liệu:

  • Tăng tính linh động: Người dùng có thể dễ dàng xuất dữ liệu ra Excel để phân tích, tạo báo cáo, gửi email, hoặc lưu trữ lâu dài.
  • Tiết kiệm thời gian: Tránh việc nhập dữ liệu thủ công khi cần chuyển sang một hệ thống khác.
  • Tích hợp với công cụ phân tích: Excel là nền tảng phổ biến nhất cho phân tích dữ liệu, biểu đồ, và báo cáo.
  • Đảm bảo tính nhất quán: Khi xuất dữ liệu từ hệ thống chính thức, dữ liệu luôn đồng bộ vàWeather.
  • Dễ dàng chia sẻ: File Excel có thể gửi qua email, lưu trên mạng, hoặc chia sẻ trên nền tảng cloud.

Vì vậy, việc xây dựng một tính năng export một cách chính xác và hiệu quả là điều không thể thiếu trong bất kỳ ứng dụng quản lý nào.

2. Chuẩn bị môi trường

2.1. Visual Studio

Bạn cần cài đặt Visual Studio (phiên bản 2026 trở lên) với .NET Framework (tối thiểu 4.6) hoặc .NET 6/7 nếu đang phát triển ứng dụng .NET Core/ .NET 5+. Đảm bảo rằng bạn đã cài đặt Windows Forms App template.

2.2. Tham khảo thư viện

2.2.1. Microsoft.Office.Interop.Excel

  • Cài đặt:
  • Mở NuGet Package Manager (Project > Manage NuGet Packages).
  • Tìm kiếm Microsoft.Office.Interop.Excel và cài đặt.
  • Cài đặt Microsoft.Office.Core nếu cần thiết.

  • Yêu cầu: Excel phải cài đặt trên máy tính chạy ứng dụng.

2.2.2. DocumentFormat.OpenXml

  • Cài đặt:
  • Tìm kiếm DocumentFormat.OpenXml trong NuGet và cài đặt.
  • Không yêu cầu cài đặt Excel, vì thư viện tạo file .xlsx trực tiếp.

2.2.3. EPPlus (tùy chọn)

  • EPPlus là một thư viện mạnh mẽ khác cho việc tạo và ghi file Excel mà không cần cài đặt Excel. Version 5 trở lên yêu cầu license, nhưng version 4 vẫn miễn phí. Bạn có thể cài đặt qua NuGet EPPlus.

3. Phương pháp 1: Sử dụng Microsoft.Office.Interop.Excel

Phương pháp này rất trực quan vì chúng ta có thể điều khiển Excel giống như viết macro. Tuy nhiên, nó phụ thuộc vào việc Excel đã cài đặt.

3.1. Cấu trúc cơ bản

Imports Microsoft.Office.Interop Public Sub ExportToExcel(ByVal dgv As DataGridView, ByVal filePath As String) Dim excelApp As Excel.Application = Nothing Dim workbook As Excel.Workbook = Nothing Dim worksheet As Excel.Worksheet = Nothing Try excelApp = New Excel.Application() excelApp.Visible = False workbook = excelApp.Workbooks.Add() worksheet = workbook.Sheets(1) '\/ 1. Ghi header For colIndex As Integer = 0 To dgv.Columns.Count - 1 worksheet.Cells(1, colIndex + 1).Value2 = dgv.Columns(colIndex).HeaderText Next '\/ 2. Ghi data For rowIndex As Integer = 0 To dgv.Rows.Count - 1 For colIndex As Integer = 0 To dgv.Columns.Count - 1 worksheet.Cells(rowIndex + 2, colIndex + 1).Value2 = dgv.Rows(rowIndex).Cells(colIndex).Value Next Next '\/ 3. Lưu file workbook.SaveAs(filePath) MessageBox.Show("Export thành công!", "Thông báo") Catch ex As Exception MessageBox.Show("Lỗi: " & ex.Message, "Lỗi") Finally If workbook IsNot Nothing Then workbook.Close(False) If excelApp IsNot Nothing Then excelApp.Quit() ReleaseObject(worksheet) ReleaseObject(workbook) ReleaseObject(excelApp) End Try
End Sub Private Sub ReleaseObject(ByVal obj As Object) Try System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing Catch obj = Nothing Finally GC.Collect() End Try
End Sub

3.2. Giải thích chi tiết

  • Khởi tạo Excel: excelApp = New Excel.Application() khởi tạo một instance của Excel.
  • Tạo workbook và worksheet: workbook = excelApp.Workbooks.Add() tạo workbook mới, worksheet = workbook.Sheets(1) lấy sheet đầu tiên.
  • Ghi header: Dùng vòng lặp qua dgv.Columns để ghi tiêu đề vào hàng đầu tiên.
  • Ghi dữ liệu: Dùng vòng lặp qua dgv.Rows và dgv.Columns để ghi từng ô dữ liệu vào Excel.
  • Lưu file: workbook.SaveAs(filePath) lưu file với đường dẫn đã chỉ định.
  • Xử lý lỗi: Bắt ngoại lệ và hiển thị thông báo lỗi.
  • Giải phóng tài nguyên COM: Cần gọi ReleaseComObject để tránh rò rỉ bộ nhớ và giữ cho Excel không còn chạy trong background.

3.3. Tối ưu khi dữ liệu lớn

Nếu DataGridView chứa hàng ngàn, việc lặp qua từng ô một sẽ chậm. Bạn có thể tối ưu bằng cách:

  • Sử dụng Range Batch: Ghi mảng dữ liệu một lần vào vùng Range.
  • Disable screen updating: excelApp.ScreenUpdating = False.
  • Sử dụng Application.Calculation qualifiers: excelApp.Calculation = Excel.XlCalculation.xlCalculationManual.

Ví dụ:

Dim dataArray(dgv.Rows.Count, dgv.Columns.Count) As Object
For i As Integer = 0 To dgv.Rows.Count - 1 For j As Integer = 0 To dgv.Columns.Count - 1 dataArray(i + 1, j + 1) = dgv.Rows(i).Cells(j).Value Next
Next SU
worksheet.Range(worksheet.Cells(2, 1), worksheet.Cells(dgv.Rows.Count + 1, dgv.Columns.Count)).Value2 = dataArray

3.4. Định dạng Excel

Bạn có thể thêm định dạng, màu nền, và tùy chỉnh cột:

' Định dạng tiêu đề
With worksheet.Range(worksheet.Cells(1, 1), worksheet.Cells(1, dgv.Columns.Count)) .Font.Bold = True .Interior.Color = Excel.XlRgbColor.rgbLightGray
End With ' Định dạng cột ngày
For i As Integer = 0 To dgv.Columns.Count - 1 If TypeOf dgv.Columns(i).CellTemplate Is DataGridViewTextBoxCell Then Dim colType = dgv.Columns(i).CellTemplate.GetType() If colType.Name.Contains("Date") Then worksheet.Columns(i + 1).NumberFormat = "mm/dd/yyyy" End If End If പുതിയ
Next

4. Phương pháp 2: Sử dụng Open XML SDK

Open XML SDK cho phép tạo file .xlsx mà không cần cài đặt Excel. Đây là phương pháp phổ biến khi bạn cần chạy trên aisl server hoặc môi trường không có Excel.

4.1. Cài.policy

  • Cài đặt DocumentFormat.OpenXml qua NuGet.

4.2. Cấu trúc code

Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet Public Sub ExportToExcelOpenXml(ByVal dgv As DataGridView, ByVal filePath As String) Using spreadsheetDoc As SpreadsheetDocument = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook) Dim workbookPart As WorkbookPart = spreadsheetDoc.AddWorkbookPart() workbookPart.Workbook = New Workbook() Dim worksheetPart As WorksheetPart = workbookPart.AddNewPart(Of WorksheetPart)() worksheetPart.Worksheet = New Worksheet(New SheetData()) Dim sheets As Sheets = spreadsheetDoc.WorkbookPart.Workbook.AppendChild(Of Sheets)(New Sheets()) Dim sheet As Sheet = New Sheet With { .Name = "Sheet1", .SheetId = 1, .Id = spreadsheetDoc.WorkbookPart.GetIdOfPart(worksheetPart) } sheets.Append(sheet) Dim sheetData As SheetData = worksheetPart.Worksheet.GetFirstChild(Of SheetData)() ' Header Dim headerRow As Row = New Row() For i As Integer = 0 To dgv.Columns.Count - 1 Dim cell As Cell = New Cell With { .CellValue = New CellValue(dgv.Columns(i).HeaderText), .DataType = CellValues.String verminderen } headerRow.Append(cell) Next sheetData.Append(headerRow) ' Data rows For Each dgvRow As DataGridViewRow In dgv.Rows If dgvRow.IsNewRow Then Continue For Dim row As Row = New Row() For j As Integer = 0 To dgv.Columns.Count - 1 Dim cellValue As String = dgvRow.Cells(j).Value?.ToString() ?? String.Empty Dim cell As Cell = New Cell With { .CellValue = New CellValue(cellValue), .DataType = CellValues.String } row.Append(cell) Next sheetData.Append(row) Next workbookPart.Workbook.Save() End Using
End Sub

4.3. Định dạng dữ liệu

Open XML hỗ trợ định dạng. Ví dụ, để định dạng cột số:

' Định dạng kiểu số
Dim cells = sheetData.Descendants(Of Cell)()
For Each cell In cells If cell.CellValue IsNot Nothing AndAlso Decimal.TryParse(cell.CellValue.Text, Nothing) Then cell.DataType = CellValues.Number End If
Next

Bạn cũng có thể thêm StyleSheet để định dạng màu nền, phông chữ, cỡ chữ, v.v. Để thực hiện, bạn cần tạo một WorkbookStylesPart và tham chiếu đến style index trong mỗi Cell. Đây là một phần phức tạp hơn, vì vậy nếu bạn chỉ cần export dữ liệu cơ bản, bạn có thể bỏ qua.

Export Data From Datagridview To Excel In Vb Net
Export Data From Datagridview To Excel In Vb Net

4.4. Lợi ích

  • Không cần cài Excel: Thích hợp cho môi trường server.
  • Hiệu năng Pari: Đối với dữ liệu lớn, thư viện có thể nhanh hơn vì không cần tạo COM objects.
  • Khả năng mở rộng: Bạn có thể tùy chỉnh kiểu dữ liệu, bảng tính, biểu đồ, v.v.

5. Phương pháp 3: EPPlus

EPPlus là thư viện rất phổ biến để tạo và chỉnh sửa file Excel. Phiên bản 4.5.3.3 (được bảo trì miễn phí) vẫn rất προστα hưng.

Imports OfficeOpenXml Public Sub ExportToExcelEPPlus(ByVal dgv As DataGridView, ByVal filePath As String) Using package As New ExcelPackage() Dim ws As ExcelWorksheet = package.Workbook.Worksheets.Add("Sheet1") ' Thêm header For col As Integer = 0 To dgv.Columns.Count - 1 ws.Cells(1, col + 1).Value = dgv.Columns(col).HeaderText Next ' Thêm dữ liệu For row As Integer = 0 To dgv.Rows.Count - 1 If dgv.Rows(row).IsNewRow Then Continue For For col As Integer = 0 To dgv.Columns.Count - 1 ws.Cells(row + 2, col + 1).Value = dgv.Rows(row).Cells(col).Value Next Next ' Lưu file package.SaveAs(New IO.FileInfo(filePath)) End Using
End Sub

5.1. Định dạng

EPPlus hỗ trợ định dạng dễ dàng:

ws.Cells(1, 1, 1, dgv.Columns.Count).Style.Font.Bold = True
ws.Cells(1, 1, 1, dgv.Columns.Count).Style.Fill.PatternType = ExcelFillStyle.Solid
ws.Cells(1, 1, 1, dgv.Columns.Count).Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray)

5.2. Lưu ý license

  • Phiên bản 5+ yêu cầu mua license hoặc sử dụng bản community license.
  • Phiên bản 4.x vẫn miễn phí và phù hợp với hầu hết nhu cầu.

6. Xử lý dữ liệu lớn

6.1. Đọc dữ liệu từ nguồn

Nếu DataGridView chứa nhiều hàng, bạn có thể tải dữ liệu trực tiếp từ cơ sở dữ liệu bằng DataTable hoặc DataReader mà không cần load toàn bộ vào DataGridView. Khi export, bạn chỉ cần truy xuất dữ liệu từ nguồn gốc.

Dim dt As DataTable = GetDataTableFromDatabase()
' Export dt bằng phương pháp EPPlus

6.2. Chunk export

Nếu số hàng vượt quá giới hạn của Excel (1,048,576 rows), bạn có thể chia nhỏ dữ liệu vào nhiều sheet hoặc nhiều file.

Dim chunkSize As Integer = 500000
Dim sheetIndex As Integer = 1
For i = 0 To dt.Rows.Count - 1 Step chunkSize Dim subTable As DataTable = dt.Clone() For j = i To Math.Min(i + chunkSize - 1, dt.Rows.Count - 1) subTable.ImportRow(dt.Rows(j)) Next ExportDataTableToExcel(subTable, $"Export_{sheetIndex}.xlsx") sheetIndex += 1
Next

7. Bảo mật dữ liệu khi export

7.1. Đặt mật khẩu cho file Excel

Sử dụng EPPlus:

package.Workbook.Protection.SetPassword("MyPasswordNí")

Sử dụng Interop:

workbook.Password = "MyPassword"

7.2. Lọc dữ liệu trước khi export

Không ghi toàn bộ dữ liệu ra file, chỉ lưu những cột hoặc hàng cần thiết. Điều này giảm kích thước file và hạn chế rò rỉ dữ liệu.

For Each col In dgv.Columns If col.Name = "Password" Or col.Name = "SensitiveInfo" Then Continue For End If ' Ghi dữ liệu
Next

8. Xử lý lỗi và debugging

8.1. Các lỗi thường gặp

LỗiNguyên nhânGiải pháp
System.Runtime.InteropServices.COMExceptionExcel không cài đặt, hoặc phiên bản .NET không tương thíchKiểm tra cài đặt Excel, cập nhật .NET
FileNotFoundException recieveĐường dẫn file sai hoặc chưa tạo thư mụcKiểm tra đường dẫn, tạo thư mục trước khi ghi
IOException: The process cannot access the file because it is being used by another processFile Excel đang mở trong ExcelĐóng Excel hoặc sử dụng FileShare.None
NullReferenceExceptionÔ dữ liệu rỗngKiểm tra Nothing trước khi ghi
OutOfMemoryExceptionDữ liệu quá lớnChia nhỏ dữ liệu, hoặc sử dụng phương pháp Open XML

8.2. Debugging

  • Sử dụng Output window: Ghi log chi tiết từng bước.
  • Sử dụng Excel Visible: Khi debug, đặt excelApp.Visible = True để xem Excel mở ra.
  • Xác định phạm vi lỗi: Đặt breakpoint tại mỗi bước ghi dữ liệu.

9. Tư vấn về UI/UX

9.1. Button Export

Private Sub btnExport_Click(sender As Object, e As EventArgs) Handles btnExport.Click Dim dlg As New SaveFileDialog() With { .Filter = "Excel Files|.xlsx", .Title = "Lưu dữ liệu ra file Excel" } If dlg.ShowDialog() = DialogResult.OK Then ExportToExcelEPPlus(dataGridView1, dlg.FileName) End If
End Sub

9.2. Thông báo khi export

  • Sử dụng ProgressBar để hiển thị tiến trình khi dữ liệu lớn.
  • Hiển thị message box “Export thành công” hoặc “Có lỗi xảy ra”.

10. Kết luận

Export dữ liệu từ DataGridView sang Excel trong VB.NET có thể được thực hiện bằng nhiều phương pháp khác nhau, tùy thuộc vào yêu cầu công nghệ, môi trường triển khai và độ phức tạp dữ liệu. Phương pháp sử dụng Microsoft.Office.Interop.Excel là nhanh chóng và dễ hiểu, nhưng yêu cầu cài đặt Excel. Phương pháp Open XML SDK và EPPlus cung cấp giải pháp nhẹ, không phụ maji Excel và phù hợp cho môi trường server.

Các yếu tố quan trọng khi triển khai:

  • Hiệu suất: Sử dụng batch write, disable screen updating, tránh lặp lẫn lộn.
  • Bảo mật: Đặt mật khẩu, lọc dữ liệu, bảo vệ file.
  • Khả năng mởspace: Chia.naming, đồng thời export nhiều sheet.
  • Tính ổn định: Giải phóng tài nguyên COM, xử lý lỗi, logging.

Với những kiến thức và mẫu code đã trình bày, bạn có thể nhanh chóng tích hợp tính năng export vào ứng dụng VB.NET của mình. Hãy thử nghiệm, tinh chỉnh và tận dụng các tính năng nâng cao (định dạng, biểu đồ, bảng dữ liệu) để mang đến trải nghiệm người dùng tốt hơn. Chúc bạn thành công!

⚠️
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