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 ...
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.
LINK DOWNLOAD