快速创建Word箱单(2/2)

在日常办公中,经常需要将 Excel 中的表格数据导出到 Word 文档进行汇报或打印。本文介绍一种 VBA 方法,可以批量将 Excel 数据导出到 Word。

实例需求:Excel数据表包含三列:箱号、数量、型号。

根据数据创建Word文档

  • 设置文档字体(微软雅黑)、字号(40)及水平居中格式
  • 每页第一行为空行
  • 每组数据分页显示
  • 如果第3列有多个型号(逗号分隔),那么拆分为单个型号

Word文档如下图所示。

示例代码如下:

vb 复制代码
Sub ExportToWord_2()
    Const wdAlignParagraphCenter As Long = 1
    Const wdBreakPage As Long = 7
    Const wdFormatXMLDocument As Long = 16
    Const wdReplaceAll As Long = 2
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim dataArr As Variant
    dataArr = ws.Range("A1").CurrentRegion.Value
    Dim wdApp As Object: Set wdApp = CreateObject("Word.Application")
    wdApp.Visible = False
    Dim wdDoc As Object: Set wdDoc = wdApp.Documents.Add()
    With wdDoc.Styles("Normal").Font
        .Name = "微软雅黑"
        .Size = 40
    End With
    With wdDoc.Styles("Normal").ParagraphFormat
        .Alignment = wdAlignParagraphCenter
        .SpaceAfter = 0
        .SpaceBefore = 0
    End With
    Dim boxNo As String, qty As String, models As String, fname As String
    Dim arrModels, j As Long, modelItem As String, i As Long, sTxt As String
    Const PAGE_BREAK = "$$$"
    For i = 2 To UBound(dataArr, 1)
        boxNo = Trim(CStr(dataArr(i, 1)))
        qty = Trim(CStr(dataArr(i, 2)))
        models = Trim(CStr(dataArr(i, 3)))
        If Len(boxNo & qty & models) Then
            arrModels = Split(models, ",")
            For j = LBound(arrModels) To UBound(arrModels)
                modelItem = Trim(arrModels(j))
                sTxt = Join(Array(sTxt & PAGE_BREAK, "", _
                            dataArr(1, 1), boxNo, _
                            dataArr(1, 2), qty, _
                            dataArr(1, 3), modelItem), vbCrLf)
            Next j
        End If
    Next i
    sTxt = Mid(sTxt, Len(PAGE_BREAK) + 3)
    wdDoc.Characters.Last.Text = sTxt
    With wdDoc.Content.Find
        .Text = PAGE_BREAK
        .Replacement.Text = "^m"
        .Forward = True
        .Wrap = 1
        .Format = False
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll
    End With
    fname = wb.Path & "\" & Format(Now, "yyyymmdd_hhnnss") & ".docx"
    wdDoc.SaveAs2 Filename:=fname, FileFormat:=wdFormatXMLDocument
    wdDoc.Close False
    wdApp.Quit
    MsgBox "已生成 Word 文件:" & vbCrLf & fname, vbInformation
End Sub

【代码解析】

第1~21行代码与前一篇博客相同,不再赘述, 请参考《快速创建Word箱单(1/2)》。

第24行代码定义分页符占位符常量 PAGE_BREAK 为字符串 $$$

第25行代码开始循环,从数据第二行起(跳过表头)逐行处理 Excel 数据。

第26~28行代码获取当数据行内容,并去除空格,保存在变量中。

第29行代码判断当前行是否为空,若三列均为空则跳过,否则进入处理逻辑。

第30行代码将型号字符串按英文逗号拆分为数组 arrModels,用于逐个输出。

第31行代码开始循环遍历当前行的每个型号项。

第32行代码去除当前型号项两端空格,赋值给 modelItem。

第33~36行代码将表头字段及当前数据拼接为文本段落,并在每组前面加上分页符占位符。

此处使用了Join函数,其第二参数(即分割符)为换行符 vbCrLf,改用这个结构之后,代码更简洁清晰。

第40行代码去除字符串开头多余的分页符占位符和换行符,得到最终文本 sTxt。

第41行代码将处理后的完整文本写入 Word 文档末尾。

第42~50行代码使用 Word 查找替换功能,将占位符 $$$ 替换为实际分页符^m,实现每行数据分页显示。

第51行代码生成 Word 文件名 fname,命名格式为"年月日_时分秒.docx",并保存在当前工作簿目录。

第52行代码将 Word 文档保存为 .docx 格式。

第53行代码关闭 Word 文档对象,但不保存后续修改。

第54行代码退出 Word 应用程序,释放资源。

第55行代码弹出提示框,显示生成文件的完整路径及文件名。

相关推荐
taller_20005 天前
快速创建Word箱单(1/2)
word文档·自动创建word文档·箱单·根据excel创建word·word分页
鹏大师运维1 个月前
麒麟系统中修改 WPS 默认新建文件格式的方法
linux·操作系统·wps·docx·麒麟·word文档·excel文档
nuclear20117 个月前
使用Python在Word中创建、读取和删除列表 - 详解
python·多级列表·word文档·编号列表·项目符号列表·自定义列表·获取列表编号和内容
黛琳ghz1 年前
办公软件的答案?ONLYOFFICE 桌面应用编辑器会是最好用的 Office 软件?ONLYOFFICE 桌面编辑器使用初体验
编辑器·onlyoffice·文档·在线协作·电子表格·演示文稿·word文档