工作需要制作每周一次的汇总报表,除了正文以外,还需要把上周的各种报表以附件的方式打包到报表里,有word文档,有excel表格,手工操作是这样的:插入-对象-由文件创建-勾选显示为图标-选择文件-确认,如图:

插入后效果,双击图标可以打开:
看似简单的工作,但是一共有12个文件,目录不全相同,每次选择要选一次目录,费时费力还容易搞错。想用python来解决问题,发现python-docx只能插入图片,不能插入文件对象,在网上泡了几天没能找到方法。
没办法只好自己动手,我们知道docx实际上是一个压缩文件,解压缩后分析,在word\embeddings找到了这些插入的文件(注意文件名):

那么是否可以替换掉这些文件然后再打包来达到我的目的,经过手工测试后发现行得通,下一步就是写代码了。
过程就不说了,绕了很多弯,碰了不少壁,现在分享一下心得和代码:
1.需要先制作word模版文件,要包含插入的文件对象,插入的文件对象可以是空文件,但是对象的文件名不能更改;
2.根据模版文件写入新word文件;
3.解压word文件;
4.替换掉word\embeddings的附件,注意顺序和文件名;
5.重新压缩还原word文件,这一步需要注意的是压缩格式,python zipfile包默认的格式office不认,要指定格定为DEFLATED。
下面是3-5步的代码:

#filename为相关文件列表,filename[0]就是需要处理的主word文件,filename[1]-[12]是12个需要插入的附件
import os,zipfile,shutil       #需要用到的包
azip = zipfile.ZipFile(filename[[0])          #以压缩格式打开word文件
tempdir=''
while True:tempdir= ''.join(random.sample(string.ascii_letters + string.digits, 8))   #生行8位临时文件夹名if not os.path.exists(tempdir):break
os.mkdir(tempdir)                  #创建临时目录
os.chdir(tempdir)                   #转到临时目录
azip.extractall()                     #解压word文件到临时文件夹
azip.close()                           #关闭word文档,否则后面重新压缩会报错
#把正确文件拷贝覆盖模版文件的空附件
try:shutil.copy(filename[1],'word\\embeddings\\Microsoft_Excel____.xlsx')shutil.copy(filename[2],'word\\embeddings\\Microsoft_Excel____1.xlsx')shutil.copy(filename[3],'word\\embeddings\\Microsoft_Excel____2.xlsx')shutil.copy(filename[4],'word\\embeddings\\Microsoft_Excel____3.xlsx')shutil.copy(filename[5],'word\\embeddings\\Microsoft_Excel____4.xlsx')shutil.copy(filename[6],'word\\embeddings\\Microsoft_Word___.docx')shutil.copy(filename[7],'word\\embeddings\\Microsoft_Word___5.docx')shutil.copy(filename[8],'word\\embeddings\\Microsoft_Word___6.docx')shutil.copy(filename[9],'word\\embeddings\\Microsoft_Word___7.docx')shutil.copy(filename[10],'word\\embeddings\\Microsoft_Word___8.docx')shutil.copy(filename[11],'word\\embeddings\\Microsoft_Word___9.docx')shutil.copy(filename[12],'word\\embeddings\\Microsoft_Word___10.docx')azip = zipfile.ZipFile(filename[0], 'w')    #以压缩格式新建word文档for i in os.walk('.'):                             #使用os.walk遍历整个目录及子目录,保证原有的目录结构不变for j in i[2]:azip.write(os.path.join(i[0],j), compress_type=zipfile.ZIP_DEFLATED)     #将文件逐个打包到word文档中,压缩格式指定为ZIP_DEFLATEDazip.close()                                       #关闭文件os.chdir('..')shutil.rmtree(tempdir,ignore_errors=True)    #删除临时文件夹
except:pass

PS:除了word文件,其他的office文档插入的文件对象也可以照这个思路处理。

python在word文档里插入文件对象相关推荐

  1. python数据写入表格生成图片_python在word文档里插入图片和表格实例代码演示

    # -*- coding: UTF8 -*- from docx import Document from docx.shared import Pt doc = Document() # 文件存储路 ...

  2. word文档里插入图片显示不完整,只显示一半,怎么处理?

    word文档里插入图片显示不完整,只显示一半,怎么处理? 目录 word文档里插入图片显示不完整,只显示一半,怎么处理? 1.把鼠标光标放置图片的末尾,然后点击鼠标右键,选择[段落]选项 2.在[缩进 ...

  3. 在word文档中插入外部对象(例如插入另一个外部word文档或excel文档)

    一.插入外部文件 例如插入外部word文档: 插入--对象--对象--由文件创建--选择文件,勾选链接到文件.显示为图标. 确定即可. 二.插入外部flv文件 第1步 首先打开一个WORD文件,点击& ...

  4. python从word文档里提取标题并生成目录

    可以使用 python-docx 库来读取 word 文档并提取标题.可以先安装这个库: pipinstall python-docx

  5. pdf内容怎么复制到word文档里_pdf文件怎么放到word里?这招实在是太好用了

    PDF文件怎么放到word里? 工作的时候,"爱转角,转角遇见PDF"(滑稽).总而言之,工作的时候碰到PDF文件是百分百的事情.即使是教师类职业,也会偶尔在学校通知群里看到PDF ...

  6. 电脑长截图软件_电脑屏幕长截图+WORD文档里没有插入PDF文件选项时怎么办? 简单一招轻松完成...

    111111        办 公 小 技 巧 在用电脑查看网页时,想把网页上的内容截下来,保存成一张图片,可是内容又不全在一屏里,不能简单的用截屏完成,这时怎么办? 想把一个PDF文件插入到WORD ...

  7. php怎么在表格里插图片,Python操作word文档插入图片和表格的实例演示

    今天带来Python操作word文档插入图片和表格的实例演示教程详解 前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多 ...

  8. python批量读取图片并复制入word_提取出 Word 文档里的图片 并利用 python 批量转换格式...

    日常工作中,你是否遇到过这样的场景,领导发来一份 Word 文档,要求你将文档中的图片存储到一个文件夹内,并且还要将图片都改成 .jpg 或者 .png,你会怎么办?你是不是一边内心崩溃,一边开始一张 ...

  9. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

最新文章

  1. 西门子smart200以太网通讯协议
  2. ubuntu 搭建webrtc环境
  3. DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说
  4. network3D: 交互式桑基图
  5. 怎么清空topic数据_20.Roscpp/Rospy:Topic_demo
  6. Mine Video Player – 视频播放器WordPress插件
  7. 做了项目才知道的Cookie和Session
  8. [mysql]三种方法为root账户指定密码
  9. @DateTimeFormat 和 @JsonFormat 注解的区别和使用
  10. 数模比赛经验分享(美赛分享)
  11. 数字信号处理经典书籍
  12. Centos7查看硬盘容量
  13. laravel实现打包多个文件,并下载
  14. sucess - money - freedom
  15. Elasticsearch - Indices stats 获取索引级别的统计信息之三 【indexing】索引操作信息
  16. 《操作系统真象还原》——0.25 指令集、体系结构、微架构、编程语言
  17. 掌控健身节奏 飞利浦降噪运动耳机A7507 上市
  18. daily reading
  19. 语音模块LD3320模块的二次开发,并与树莓派进行串口通信
  20. 第二天送宇轩幼儿园记事

热门文章

  1. Android版九连环NingRings
  2. 虚拟机和主机的文件交互
  3. 开始懂了《大话西游》
  4. Linux 网络编程 TCP
  5. dell戴尔手机详细评测_拆机_root刷机
  6. 北京圣皇国际钻石画是骗人的
  7. 单耳蓝牙耳机怎么连接_apple watch怎么连接蓝牙耳机
  8. 安卓shell 定时执行命令
  9. 我在快手总部的一天探访:发现所有人都变得紧张起来了
  10. 使用AFS, Active Directory和SSSD搭建用于集成电路设计的分布式存储系统 【十一】部署前的准备 3