• 批量替换Word中的表格为图片并保存


    之前我在《将Word中的表格以图片形式复制到微信发送》分享了如何将指定word中的表格以图片形式粘贴,参考:https://xxmdmst.blog.csdn.net/article/details/125999841

    今天群友提问如何将一个Word中所有的表格替换为图片形式,下面请看我的完整代码:

    import os
    import win32com.client as win32
    from io import BytesIO
    import win32clipboard
    from PIL import Image, ImageGrab, ImageChops
    
    
    def crop_image(im, backgroud_color=(255, 255, 255)):
        '''裁剪图片边缘空白并给透明通道填充白色背景,作者:小小明'''
        bg = Image.new(mode='RGBA', size=im.size)
        bbox = ImageChops.difference(im, bg).getbbox()
        if bbox:
            im = im.crop(bbox)
        img = Image.new('RGB', im.size, backgroud_color)
        img.paste(im, (0, 0, *im.size), im)
        return img
    
    
    def write_img2clipboard(img):
        """将指定图片写入到剪切板中,作者:小小明"""
        win32clipboard.OpenClipboard()
        try:
            win32clipboard.EmptyClipboard()
            out = BytesIO()
            img.save(out, "BMP")
            # BMP图片有14字节的header,需要额外去除
            data = out.getvalue()[14:]
            # DIB: 设备无关位图(device-independent bitmap)
            win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
        finally:
            win32clipboard.CloseClipboard()
    
    
    def process_clipboard_pic(backgroud_color=(255, 255, 255)):
        """将剪切板中的图片裁剪边缘空白并给透明部分添加背景色,作者:小小明"""
        img = ImageGrab.grabclipboard()
        img = crop_image(img, backgroud_color)
        write_img2clipboard(img)
        return img
    
    
    # 获取正在运行的Word应用
    wordApp = win32.GetActiveObject("Word.Application")
    # 获取当前激活的word文档
    doc = wordApp.ActiveDocument
    # 遍历所有的表格对象
    for t in doc.Tables:
        t.Select()
        wordApp.Selection.CopyAsPicture()
        img = process_clipboard_pic()
    #     display(img)
        t.Delete()
        wordApp.Selection.Paste()
    
    # 另存为word文件
    doc.SaveAs2(os.path.abspath("替换图片.docx"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    只要我们打开需要批量替换的Word文件,然后执行上述代码,可以看到运行前后的效果。

    打开的Word文档:

    image-20220731183531601

    运行上述代码后:

    image-20220731183641986

    能够顺利替换表格,若需要更换图片的背景色,可以向process_clipboard_pic()传入指定的颜色值,例如豆沙色背景:

    process_clipboard_pic(backgroud_color=(204, 232, 207))
    
    • 1

    当一张表格长到跨越多页时还存在一些问题,程序只能截图到第一页的内容,这就要求必须人工事先将长表格进行拆分。

    我使用WPS的按行拆分功能:

    image-20220731184342389

    手工拆分表格后再次运行上述代码,已经成功截图完整的表格图片:

    image-20220731184556503

    注意:如果不需要另存为Word文档,可以直接保存,最后一行代码修改为如下形式即可:

    doc.Save()
    
    • 1

    当然也可以删除最后一行关于保存的代码,人工查看修改结果,决定是保存还是另存为。

    建议还是另存为保存原始文档备份,万一哪张表格过长忘记拆分了呢?

  • 相关阅读:
    windows桌面运维----第六天
    重温C语言十三------动态内存分配
    抖音小店无货源,月入过万的玩法技巧!更多实操细节分享
    【甄选靶场】Vulnhub百个项目渗透——项目二十七:Pinkys-Palace-2(LFI,端口敲震,ssh爆破,64位缓冲区溢出)
    Java 8 Stream API 引入和使用
    [计算机入门] IP地址的查询和设置
    机器学习-决策树
    BUUCTF misc 专题(106)[MRCTF2020]Unravel!!
    day01-项目开发流程
    Part2_扩展MATSIM_Subpart6_附加选择维度_第27章 目的地创新
  • 原文地址:https://blog.csdn.net/as604049322/article/details/126089061