- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
Hướng dẫn tạo Mail Merge trong VB.NET
Hôm nay, mình xin hướng dẫn các bạn cách tạo Mail Merge trong VB.NET, vậy mail merge là gì?
Mail Merge là chức năng soạn thư hàng loạt trong Microsoft Word, được nhiều người gọi bằng thuật ngữ trộn thư.
Với Mail Merge, bạn có thể tạo cùng lúc nhiều thư với cùng nội dung nhưng khác nhau ở một vài thông tin.
Ví dụ: Mình có một mẫu đơn thông tin nhân viên giống nhau cùng form, nếu mình muốn in ra nhiều lần.
Ex: mẫu form nhân viên
Mình có thể sử dụng report để thiết kế, nhưng nếu sử dụng report để thiết kế theo mẫu sẵn có, thì tính người dùng cuối sẽ không cao.
Như mình muốn in bảng lương của nhân viên, nhưng sau này công ty đổi mẫu khác, không lẽ mình phải đi thiết kế report lại. Nếu dùng Mail Merge trong Word, mình chỉ cần chỉnh sửa nội dung trong file Word là xong. Tính khả thi nó cao phải không các bạn.
Để có thể sử dụng Mail Merge trong VB.Net hay C#, đầu tiên các bạn cần phải tạo 1 file word có chứa sẵn nội dung chung. Như hình bên dưới
Trong bài viết này mình sử dụng thư viện Spire để sử dụng Mail Merge.
Các bạn , chỉ cần load dữ liệu từ cơ sở dữ liệu vào datatable và sau đó sử dụng hàm có sẵn trong thư viện để chạy Mail Merge.
Video Demo ứng dụng:
Giờ mình bắt đầu code ứng dụng:
- Đầu tiên mình cần import thư viện vào
Imports System.Data.SqlClient
Imports Spire.Doc
Imports Spire.Doc.Documents
Imports Spire.Doc.Fields
Imports Spire.Doc.Interface
Imports Spire.Doc.Reporting
- Dưới đây là nguyên đoạn code của form
Public Class Form1
Dim con As New SqlConnection
Public lastIndex As Integer = 0
Private WithEvents mailMerge As Spire.Doc.Reporting.MailMerge
Public Sub Taoketnoi()
Dim str As String = "Data Source=.;Initial Catalog=NORTHWND;Integrated Security=True"
con.ConnectionString = str
con.Open()
End Sub
Public Sub Dongketnoi()
con.Close()
End Sub
Public Function LayDulieu(sql As String) As DataTable
Taoketnoi()
Dim dt As New DataTable
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sql, con)
da.Fill(dt)
Dongketnoi()
Return dt
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ds As DataTable = LayDulieu("select EmployeeID, (FirstName + ' ' + LastName) as FullName from Employees")
'MessageBox.Show(ds.Tables(0).Rows(0)(2))
ComboBox1.DataSource = ds
ComboBox1.DisplayMember = "FullName"
ComboBox1.ValueMember = "EmployeeID"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ID As String
ID = ComboBox1.SelectedValue
Dim dt As DataTable = LayDulieu("SELECT EmployeeID, FirstName, LastName, BirthDate, HireDate, Address, HomePhone, Notes, PhotoPath from Employees where EmployeeID='" & ID & "'")
'Tạo file word
Dim document_Renamed As New Document()
Dim str As String = Application.StartupPath + "Employee.doc"
document_Renamed.LoadFromFile(str)
Dim EmployeeID As String = dt.Rows(0)(0)
Dim FirstName As String = dt.Rows(0)(1)
Dim LastName As String = dt.Rows(0)(2)
Dim BirthDate As String = dt.Rows(0)(3)
Dim HireDate As String = dt.Rows(0)(4)
Dim Address As String = dt.Rows(0)(5)
Dim HomePhone As String = dt.Rows(0)(6)
Dim Notes As String = dt.Rows(0)(7)
Dim PhotoPath As String = dt.Rows(0)(8)
Dim filedNames() As String = {"EmployeeID", "FirstName", "LastName", "BirthDate", "HireDate", "Address", "HomePhone", "Notes", "PhotoPath"}
Dim filedValues() As String = {EmployeeID, FirstName, LastName, BirthDate, HireDate, Address, HomePhone, Notes, PhotoPath}
document_Renamed.MailMerge.Execute(filedNames, filedValues)
'Lưu file
document_Renamed.SaveToFile("example.doc", FileFormat.Doc)
'Mở file mới tạo xong
WordDocViewer("example.doc")
End Sub
Private Sub WordDocViewer(ByVal fileName As String)
Try
Process.Start(fileName)
Catch
End Try
End Sub
Private Sub MailMerge_MergeField(ByVal sender As Object, ByVal args As MergeFieldEventArgs) Handles mailMerge.MergeField
'Next row
If args.RowIndex > lastIndex Then
lastIndex = args.RowIndex
AddPageBreakForMergeField(args.CurrentMergeField)
End If
End Sub
Private Sub AddPageBreakForMergeField(ByVal mergeField As IMergeField)
'Find position of needing to add page break
Dim foundGroupStart As Boolean = False
Dim paramgraph As Paragraph = TryCast(mergeField.PreviousSibling.Owner, Paragraph)
Dim merageField As MergeField = Nothing
While Not foundGroupStart
paramgraph = TryCast(paramgraph.PreviousSibling, Paragraph)
For i As Integer = 0 To paramgraph.Items.Count - 1
merageField = TryCast(paramgraph.Items(i), MergeField)
If (merageField IsNot Nothing) AndAlso (merageField.Prefix = "GroupStart") Then
foundGroupStart = True
Exit For
End If
Next
End While
paramgraph.AppendBreak(BreakType.PageBreak)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim document_Renamed As New Document()
Dim str As String = Application.StartupPath + "grpEmployee.doc"
document_Renamed.LoadFromFile(str)
lastIndex = 0
Dim dt As DataTable = LayDulieu("SELECT EmployeeID, FirstName, LastName, BirthDate, HireDate, Address, HomePhone, Notes, PhotoPath from Employees")
Dim employeeRecords As New List(Of Employees)()
For i As Integer = 0 To dt.Rows.Count - 1
Dim a As New Employees
a.EmployeeID = dt.Rows(i)(0)
a.FirstName = dt.Rows(i)(1)
a.LastName = dt.Rows(i)(2)
a.BirthDate = dt.Rows(i)(3)
a.HireDate = dt.Rows(i)(4)
a.Address = dt.Rows(i)(5)
a.HomePhone = dt.Rows(i)(6)
a.Notes = dt.Rows(i)(7)
a.PhotoPath = dt.Rows(i)(8)
employeeRecords.Add(a)
Next
'Execute mailmerge
mailMerge = document_Renamed.MailMerge
document_Renamed.MailMerge.ExecuteGroup(New MailMergeDataTable("Employee", employeeRecords))
'Save doc file.
document_Renamed.SaveToFile("group.doc", FileFormat.Doc)
'Launching the MS Word file.
WordDocViewer("group.doc")
End Sub
End Class
Public Class Employees
Private m_EmployeeID As Integer
Public Property EmployeeID() As Integer
Get
Return m_EmployeeID
End Get
Set(ByVal value As Integer)
m_EmployeeID = value
End Set
End Property
Private m_FirstName As String
Public Property FirstName() As String
Get
Return m_FirstName
End Get
Set(ByVal value As String)
m_FirstName = value
End Set
End Property
Private m_LastName As String
Public Property LastName() As String
Get
Return m_LastName
End Get
Set(ByVal value As String)
m_LastName = value
End Set
End Property
Private m_BirthDate As String
Public Property BirthDate() As String
Get
Return m_BirthDate
End Get
Set(ByVal value As String)
m_BirthDate = value
End Set
End Property
Private m_HireDate As String
Public Property HireDate() As String
Get
Return m_HireDate
End Get
Set(ByVal value As String)
m_HireDate = value
End Set
End Property
Private m_Address As String
Public Property Address() As String
Get
Return m_Address
End Get
Set(ByVal value As String)
m_Address = value
End Set
End Property
Private m_HomePhone As String
Public Property HomePhone() As String
Get
Return m_HomePhone
End Get
Set(ByVal value As String)
m_HomePhone = value
End Set
End Property
Private m_Notes As String
Public Property Notes() As String
Get
Return m_Notes
End Get
Set(ByVal value As String)
m_Notes = value
End Set
End Property
Private m_PhotoPath As String
Public Property PhotoPath() As String
Get
Return m_PhotoPath
End Get
Set(ByVal value As String)
m_PhotoPath = value
End Set
End Property
End Class
Chúc các bạn thành công. Mọi câu hỏi thắc mắc đến bài viết xin truy cập http://hoidap.laptrinhvb.net để được support.
ĐỪNG QUÊN LIKE AND SHARE NHA CÁC BẠN.
CÁM ƠN CÁC BẠN ĐÃ THEO DÕI.