• 【办公类-19-03】办公中的思考——Python批量制作word单元格照片和文字(小照片系列)


    背景需求:

    工会老师求助:如何在word里面插入4*8的框,我怎么也拉不到4*8大小(她用的是我WORD 文本框)

    我一听,这又是要手动反复黏贴“文本框”“照片”“文字”的节奏哦

    我问:你要做几个人?超过20个,我写个程序批量插图(写代码测试要费时间,如果数量少不如手动做)

    工会老师:大约十几个人吧,你能直接插图?我一个个弄太麻烦了。

    我说:OK,你把照片和文字发给我吧

    材料准备:

    全部材料路径(红框两个必备)

    第一步:word框架

    重要的事情!!!

    第二步:图片下载,用“序号+名言+JPG” 方式命名照片

    图片文件名结构——“序号”+“名言”+".jpg"

    每位老师的序号和名言都不同

    WORD里面表格的文字就是提取“图片名称里面的索引”2“到导引”倒数-4“中间的内容(留头,不留尾巴,尾部索引+1)

    代码展示:

    1. '''
    2. 工会小照片插入同一个WORD里
    3. 阿夏
    4. 时间:2023年9月7日)
    5. '''
    6. import os
    7. from PIL import Image
    8. import random
    9. import os,time
    10. import docx
    11. from docx import Document
    12. from docx.shared import Inches,Cm,Pt
    13. from docx.shared import RGBColor
    14. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
    15. from docx.oxml.ns import qn
    16. from docxtpl import DocxTemplate
    17. import pandas as pd
    18. from docx2pdf import convert
    19. from docx.shared import RGBColor
    20. print('----------第1步:把打照片变成小照片------------')
    21. # 减小图片质量像素
    22. pr=r"C:\Users\jg2yXRZ\OneDrive\桌面\工会教师小照片\教师照片座右铭"
    23. # 新建小图文件夹
    24. smallpath=pr[:-7]+'\\'+'教师照片座右铭(小图)'
    25. os.mkdir(smallpath)
    26. imgs1=os.listdir(pr)
    27. print(imgs1)
    28. for img1 in imgs1:
    29. # print(img1)
    30. if img1.endswith(".jpg"):
    31. a=pr+'\\'+img1
    32. # 减小图片质量像素
    33. img = Image.open(a)
    34. w,h = img.size
    35. w,h = round(w * 0.2),round(h * 0.2)
    36. # // 去掉浮点,防报错
    37. img = img.resize((w,h), Image.ANTIALIAS)
    38. img.save(smallpath+'\\'+img1, optimize=True, quality=85) # 9.99MB照片变成127KB
    39. # 质量为85效果最好
    40. print('----------第2步:读取写入小照片和文字------------')
    41. path=[]
    42. name=[]
    43. imgs2=os.listdir(smallpath)
    44. for img2 in imgs2:
    45. if img1.endswith(".jpg"):
    46. path.append(smallpath+'\\'+img2)
    47. name.append(img2[2:-4])
    48. print(path)
    49. print(name)
    50. # 制作零时文件夹
    51. lspath=pr[:-7]+'\\'+'零时Word'
    52. os.mkdir(lspath)
    53. # 制作12个docx
    54. for z in range(0,len(path)):
    55. doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\工会教师小照片\模板.docx')
    56. # # 制作列表
    57. # 单元格位置3*4格
    58. table = doc.tables[0] # 4567(8)
    59. k=path[z]
    60. k2=name[z]
    61. # 写入图片
    62. run=doc.tables[0].cell(0,0).paragraphs[0].add_run() # 在第1个表格中第2个单元格内插入国旗
    63. run.add_picture('{}'.format(k),width=Cm(3.5),height=Cm(6))
    64. table.cell(0,0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT #居中
    65. # 写入序号和生肖名称
    66. run=table.cell(1,0).paragraphs[0].add_run(k2) # 在单元格0,0(第1行第1列)输入第0个图图案
    67. run.font.name = '楷体'#输入时默认华文彩云字体
    68. # run.font.size = Pt(46) #输入字体大小默认30号 换行(一页一份大卡片
    69. run.font.size = Pt(10) #输入字体大小默认30号 一行里(可以一页两份)
    70. run.font.bold= True #是否加粗
    71. run.font.color.rgb = RGBColor(0,0,0) #数字小,颜色深0-255
    72. # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
    73. r = run._element
    74. r.rPr.rFonts.set(qn('w:eastAsia'), '楷体')#将输入语句中的中文部分字体变为华文行楷
    75. table.cell(1,0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
    76. endlisth=lspath+'\\{}.docx'.format(z)
    77. doc.save(endlisth)
    78. print('----------第3步:doc 文档合并------------')
    79. # 合并所有Word
    80. import win32com.client as win32
    81. import os
    82. word = win32.gencache.EnsureDispatch('Word.Application')
    83. #启动word对象应用
    84. word.Visible = False
    85. path = lspath
    86. files = []
    87. for filename in os.listdir(path):
    88. filename = os.path.join(path,filename)
    89. files.append(filename)
    90. #新建合并后的文档(使用模板,进行12个文件夹的合并,把12个文件夹的内容贴到已有的模板(包含0.7边、四分栏))
    91. output = word.Documents.Add(r'C:\Users\jg2yXRZ\OneDrive\桌面\工会教师小照片\模板.docx')
    92. for file in files:
    93. output.Application.Selection.InsertFile(file)#拼接文档
    94. #获取合并后文档的内容
    95. doc = output.Range(output.Content.Start, output.Content.End)
    96. # 合并word
    97. lspathall=pr[:-7]+'\\小照片合并打印(需手动整理).docx'
    98. output.SaveAs(lspathall) #保存
    99. output.Close()
    100. print('----------第4步:删除临时文件夹------------')
    101. import shutil
    102. shutil.rmtree(lspath) #递归删除文件夹,即:删除非空文件夹
    103. shutil.rmtree(smallpath)
    104. # 合并word打开
    105. lspathall=pr[:-7]+'\\小照片合并打印(需手动整理).docx'

    终端运行(直接运行)

    运行中,先出现“小图”文件夹(最后会删掉)

    (这些黄衣服的照片是请摄影师拍摄的,每张图片10MB,如果插到word里,整个word太大了,所以先压缩成小图)

    做小图的代码(质量改成85)

    运行中,其次会出现“零时WORD”文件夹,这是存放13个文档(每个文档只有一个单元格,不同的照片和其喜欢的名言)

     

    word合并版

    运行结束:

    必须调整图片质量(制作小图)的意义

    调整:

    发给领导后,领导提示修改意见

    这一刻觉得写个代码太值得了,只要微调一个格子,就能批量做13份照片,绝对比人工调13次表格和照片方便!!!

    调整方法:单元格宽度修改

               

    现在就是3.5*8的单元格(包含小照片和名言)

    其他提示:关于表格与表格之间的空行

    如果不空第一行会出现什么结果呢?

    结果,虽然第一张照片顶格了,但是图片与图片之间被表格黏连了(一个空行回车也在表格)

    需求:工会老师要用花边剪刀裁剪,就需要每张小照片周边都是白色边框,所以我还是让“模板边框前面的一行回车空行,确保,每个小照片周边都是白色。”

    就是需要打开后手动删除第一行的回车。确保每张照片都是矩阵排列。

    感悟:

    前几天我总是问老师:数量多不多?多的话(超过10个)我写个代码批量做一下(写代码、测试代码都要时间)。少的话(10个以内)手动做吧(速度更快)

    今天我觉得:既然同事们来求助,一定是潜意识希望有一个提高制作效率的方法手动复制黏贴有点累、烦。

    现在哪怕只有5个重复黏贴电脑操作,我也希望用代码(word模板、EXCEL)。因为手动做一次没问题,但一旦需要调整大小样式,就出现大量的重复操作,让人感觉低效、琐碎、不值得

    结:python批量解决这个问题,大大减少人工重复劳动。

    1、在遇到输入错误(手动操作有遗漏、错误)时,可以快速批量修正,提高正确率

    2、在遇到模板调整(字体、大小、颜色)时,更能以一当百,自动复制黏贴,快速生成统一新样式,极大提高工作效率。

    进步:

    上一次制作WORD文本框(爱心、五角星)标签字帖(只能插入EXCEL文字){{name}},

    本次运用word表格单元格(正方形、长方形)制作照片帖(可以写入文字和照片),进一步丰富了批量办公制作的范畴。(读取列表,写入单元格)

    继续探究更多python与办公的可能性,提高工作效率。优化版式结构。

  • 相关阅读:
    LINUX基础培训三十之理论基础知识自测题(附答案)
    0-1 背包问题
    Java练习题2022-1
    如何写好技术文档 - 排版格式和规范(一)
    计算机体系结构:不同方案的机器性能比较例题(1.6)
    智康护智慧养老——物联系统解决方案
    Kubernetes安装GitLab
    xilinx PL测 DP 点屏 /接收(二)--RX
    SQL面试题今天你登录了吗?(扩展表连接)
    Python高级_第2章_计算机网络及TCP网络应用程序开发
  • 原文地址:https://blog.csdn.net/reasonsummer/article/details/132747236