上一篇文章讲了Word批量导出图片的案例,这节课讲一个图片批量导入图片的案例。


一、实际案例引入


我有一个制作Word参赛卡的需求,结果如截图所示:

导入多张图片java java批量导入图片_poi向word插入图片

每个队伍的图片来自于各个文件夹

导入多张图片java java批量导入图片_vba根据内容调整word表格_02

每个队伍文件夹中,图片的命名都是:职位+姓名+身份证号

导入多张图片java java批量导入图片_poi向word插入图片_03

我需要做的就是,选择总文件夹,Word会自动把每个队伍文件夹下面的照片批量插入表格。这个就涉及到Word VBA批量插入图片的知识了。


二、思路及代码


大致思路我用流程图画了出来:

导入多张图片java java批量导入图片_java word插入图片_04

完整代码如下:

Sub 插入图片()
    Dim tb As Table, brr(), pic As InlineShape
    kk = 1
    Call 清除表格 '清空表格中原有的内容
    arr = Array("领队", "教练", "鼓手", "舵手", "划手", "替补", "空") '一维数组放置职位信息,为了自定义排序
    MsgBox "请选择图片文件夹!"
    Set FSO = CreateObject("scripting.filesystemobject")
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then PathSht = .SelectedItems(1) Else Exit Sub
    End With
    col = InputBox("生成几列照片?", "提示!", 5) '让用户输入需要生成多少列图片
    Set fl_name = FSO.getfolder(PathSht)
    For Each fl In fl_name.subfolders '对选择的文件夹里面所有队伍的文件夹进行遍历
        '-------------------------------------
        folnum = folnum + 1
        f_num = FSO.getfolder(fl.Path).Files.Count '获取每个队伍文件夹中照片的数量
        Selection.EndKey unit:=wdStory
        ActiveDocument.Paragraphs.Add
        Selection.MoveDown '(下)'以上3句是为了另起一行,输入新的数据
        Selection.TypeText fl.Name '输入队伍名称
        Selection.TypeParagraph
        ActiveDocument.Paragraphs.Add
        Selection.EndKey unit:=wdStory
        Set tb = ActiveDocument.Tables.Add(Selection.Range, (f_num \ col + 1) * 3, col) '新建表格
        tb.Style = "网格型" '表格类型为网格型,这种类型有黑色边框线
        For i = 1 To tb.Rows.Count Step 3 '对表格的行进行循环,设置表格高度
            tb.Rows(i).Height = 120
            tb.Rows(i + 1).Height = 15
            tb.Rows(i + 2).Height = 15
        Next
        '===================对人物照片进行自定义排序====================
        For a = 0 To UBound(arr) '将排序后的照片【全路径】写入数组brr
            For Each fil In FSO.getfolder(fl).Files
                If InStr(FSO.Getfile(fil).Name, arr(a)) Then
                    k = k + 1
                    ReDim Preserve brr(1 To k)
                    brr(k) = fil
                Else
                End If
            Next
        Next
        '===============================================================
        For i = 1 To ActiveDocument.Tables(folnum).Range.Cells.Count
            ActiveDocument.Tables(folnum).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter '居中显示
            If ActiveDocument.Tables(folnum).Range.Cells(i).Row.Height = 120 And kk <= f_num Then '对于行高为120的单元格,插入图片
                Set pic = tb.Range.Cells(i).Range.InlineShapes.AddPicture(FileName:=brr(kk))
                pic.Width = tb.Range.Cells(i).Width - 10 '设置图片的宽度
                pic.Height = tb.Range.Cells(i).Height - 10 '设置图片的高度
                tb.Range.Cells(i + col).Range = Split(FSO.getbasename(brr(kk)), "+")(0) & ":" & Split(FSO.getbasename(brr(kk)), "+")(1) '写入职位
                tb.Range.Cells(i + col * 2).Range = Split(FSO.getbasename(brr(kk)), "+")(2) '写入身份证号
                kk = kk + 1
            Else
            End If
        Next
        '---------------------------
        k = 0: kk = 1: Erase brr
    Next
    MsgBox "完成!"
End Sub
Sub 清除表格()
    If ActiveDocument.Paragraphs.Count >= 2 Then
        ActiveDocument.Range(ActiveDocument.Paragraphs(2).Range.Start, ActiveDocument.Range.End).Delete
    Else
    End If
End Sub

运行过程:

导入多张图片java java批量导入图片_java word插入图片_05


三、知识点


■选择文件夹并遍历子文件夹

以下代码只能获取第一层子文件夹,如果要进一步获取子文件夹的子文件夹,需要递归。

Sub 获取子文件夹路径fso方法()
    Set fso = CreateObject("scripting.filesystemobject")
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then PathSht = .SelectedItems(1) Else Exit Sub
    End With
    Set f_num = fso.getfolder(PathSht)
    For Each fl In f_num.subfolders '遍历子文件夹
    MsgBox fl.Path '显示子文件夹路径
    Next
End Sub

■Word VBA批量插入图片,并调整尺寸

下段代码,根据自己需要去选择需要插入的图片,然后利用AddPicture方法,插入图片。

Sub 批量插入图片()
    Set myfile = Application.FileDialog(msoFileDialogFilePicker)
    With myfile
        If .Show = -1 Then
            For Each fn In .SelectedItems
                Set mypic = Selection.InlineShapes.AddPicture(FileName:=fn)
                mypic.Width = 28.345 * 6.3 '根据需要设置
                mypic.Height = 28.345 * 5.4
            Next fn
        End If
    End With
    Set myfile = Nothing
End Sub