鱼C论坛

 找回密码
 立即注册
查看: 1997|回复: 2

[技术交流] python在word文档里插入文件对象

[复制链接]
发表于 2020-5-28 12:18:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 txxcat 于 2020-5-28 12:17 编辑

    工作需要制作每周一次的汇总报表,除了正文以外,还需要把上周的各种报表以附件的方式打包到报表里,有word文档,有excel表格,手工操作是这样的:插入-对象-由文件创建-勾选显示为图标-选择文件-确认,如图:
    批注 2020-05-28 101307.png
    插入后效果,双击图标可以打开:
    批注 2020-05-28 101932.png
    看似简单的工作,但是一共有12个文件,目录不全相同,每次选择要选一次目录,费时费力还容易搞错。想用python来解决问题,发现python-docx只能插入图片,不能插入文件对象,在网上泡了几天没能找到方法。
    没办法只好自己动手,我们知道docx实际上是一个压缩文件,解压缩后分析,在word\embeddings找到了这些插入的文件(注意文件名):
    批注 2020-05-28 104608.png
    那么是否可以替换掉这些文件然后再打包来达到我的目的,经过手工测试后发现行得通,下一步就是写代码了。
    过程就不说了,绕了很多弯,碰了不少壁,现在分享一下心得和代码:
    1.需要先制作word模版文件,要包含插入的文件对象,插入的文件对象可以是空文件,但是对象的文件名不能更改;
    2.根据模版文件写入新word文件;
    3.解压word文件;
    4.替换掉word\embeddings的附件,注意顺序和文件名;
    5.重新压缩还原word文件,这一步需要注意的是压缩格式,python zipfile包默认的格式office不认,要指定格定为DEFLATED。
    下面是3-5步的代码:
   
  1. #filename为相关文件列表,filename[0]就是需要处理的主word文件,filename[1]-[12]是12个需要插入的附件
  2. import os,zipfile,shutil       #需要用到的包
  3. azip = zipfile.ZipFile(filename[[0])          #以压缩格式打开word文件
  4. tempdir=''
  5. while True:
  6.     tempdir= ''.join(random.sample(string.ascii_letters + string.digits, 8))   #生行8位临时文件夹名
  7.     if not os.path.exists(tempdir):
  8.         break
  9. os.mkdir(tempdir)                  #创建临时目录
  10. os.chdir(tempdir)                   #转到临时目录
  11. azip.extractall()                     #解压word文件到临时文件夹
  12. azip.close()                           #关闭word文档,否则后面重新压缩会报错
  13. #把正确文件拷贝覆盖模版文件的空附件
  14. try:
  15.     shutil.copy(filename[1],'word\\embeddings\\Microsoft_Excel____.xlsx')
  16.     shutil.copy(filename[2],'word\\embeddings\\Microsoft_Excel____1.xlsx')
  17.     shutil.copy(filename[3],'word\\embeddings\\Microsoft_Excel____2.xlsx')
  18.     shutil.copy(filename[4],'word\\embeddings\\Microsoft_Excel____3.xlsx')
  19.     shutil.copy(filename[5],'word\\embeddings\\Microsoft_Excel____4.xlsx')
  20.     shutil.copy(filename[6],'word\\embeddings\\Microsoft_Word___.docx')
  21.     shutil.copy(filename[7],'word\\embeddings\\Microsoft_Word___5.docx')
  22.     shutil.copy(filename[8],'word\\embeddings\\Microsoft_Word___6.docx')
  23.     shutil.copy(filename[9],'word\\embeddings\\Microsoft_Word___7.docx')
  24.     shutil.copy(filename[10],'word\\embeddings\\Microsoft_Word___8.docx')
  25.     shutil.copy(filename[11],'word\\embeddings\\Microsoft_Word___9.docx')
  26.     shutil.copy(filename[12],'word\\embeddings\\Microsoft_Word___10.docx')
  27.     azip = zipfile.ZipFile(filename[0], 'w')    #以压缩格式新建word文档
  28.     for i in os.walk('.'):                             #使用os.walk遍历整个目录及子目录,保证原有的目录结构不变
  29.         for j in i[2]:
  30.             azip.write(os.path.join(i[0],j), compress_type=zipfile.ZIP_DEFLATED)     #将文件逐个打包到word文档中,压缩格式指定为ZIP_DEFLATED
  31.     azip.close()                                       #关闭文件
  32.     os.chdir('..')
  33.     shutil.rmtree(tempdir,ignore_errors=True)    #删除临时文件夹
  34. except:
  35.     pass
复制代码

    PS:除了word文件,其他的office文档插入的文件对象也可以照这个思路处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-2 10:50:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-2 11:18:35 | 显示全部楼层
高手呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 08:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表