02/10/2018, 00:13

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 

Mail Merge VB.NET

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

mail merge ms word

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.yes

ĐỪNG QUÊN LIKE AND SHARE NHA CÁC BẠN. 

CÁM ƠN CÁC BẠN ĐÃ THEO DÕI.

LINK DOWNLOAD

Tags: winformmailemailgoogle
0