title: Python操作word手册
copyright: true
top: 0
date: 2018-11-23 14:59:03
tags: python-word
categories: Python进阶笔记
permalink:
password:
keywords: python-docx
description: 使用Python-docx操作编辑word文档,实现自动化生成word文档。

人间烟火,山河远阔。 无一是你,无一不是你。

在工作生活中对word使用的比较多,需要重复的操作可以使用python完成,但是最主要的还是为了自动生成漏洞页面报告,所以使用python操作word进行自动生成还是很有必要学习相关的api的。

安装

pip install python-docx

简单创建文件和写入

# coding:utf-8
from docx import Document
# 传入实例化对象,好比from flask import Flaskdocument = Document()
# 把对象实例化,好比app=Flask()
document.add_paragraph('你好啊世界'.decode('utf-8'),'Title')
# 写入内容,中文的话需要进行utf-8编码
# 或者用unicode编码写入
document.add_paragraph('hellw,word','Subtitle')
document.add_paragraph(u'我是正文')
document.add_paragraph(u'我也是正文')
document.add_paragraph(u'难道我就不是了吗','Body Text')
document.add_paragraph(u'你说呢','Normal')# add_paragraph 方法的第一个参数是段落的文字,第二个可选参数就是段落的样式。
# 通过这个样式参数即可设置所添加段落的样式。如果不指定这个参数,则默认样式为『正文』
# 比如 document.add_paragraph('我是标题'.decode('utf-8'),'title')
# Title一级标题,Subtitle 二级标题,Heading n:n级标题,Normal:正文,Body Text 2正文
# 注意首字母一定要大写
document.save('demo.docx')
# 注意,如果一个文正已经被系统打开后是无法再进行写入的

显示效果如下

插入标题

document.add_paragraph('基本信息',style='Heading 1')
# 插入一级标题
document.add_paragraph('基本信息',style='Heading 2')
# 插入二级标题

表格的创建与使用

表格的创建使用api同样来源Dowument的基类

# coding:utf-8
from docx import Documentdocument = Document()
tables = document.add_table(rows=2, cols=6, style = 'Table Grid')
# 创建表格,rows是行数,cols是列数tables.cell(0,1).text = (u'土拨鼠')
# 第0行的第1列(就是第一行的第二列,计算机0开始计数)
# 的内容是 土拨鼠
tables.cell(1,1).text=(u'啊啊啊啊啊')
# 第1行的第1列(就是第二行的第二列)
# 的内容是啊啊啊啊啊
document.save('test2.docx')

效果如下

Cell对象最常用,另外还要两个对象Row和Column,它们在遍历表格的时候很有用。

Table对象有两个属性rows和columns,这两个对象的返回值实际上是对象Rows和Columns,但是,Rows和Columns这两个对象,可以等同于Row的列表以及Column的列表。因此迭代、求长度等对list的操作同样适用于Rows和Columns。如果想遍历所有Cell,可以先遍历所有行(table.rows),再遍历每一行所有的Cell; 也可以先遍历所有列(table.columns),再遍历每一列所有的Cell。

调整表格长宽度

使用cell对象进行调节长宽度

from docx import Document
from docx.shared import Inches
document = Document()
row = 1 # 设置长度度1
t = document.add_table(rows=1,cols=1,style = 'Table Grid')
t.autofit = False #很重要!
w = float(row) / 2.0 # 宽度对半
t.columns[0].width = Inches(w)

添加分页

document.add_page_break()

样式的设置

常见样式就三种:

  1. 段落样式
  2. 字符样式
  3. 表格样式

自定义段落样式

 # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)UserStyle1 = document.styles.add_style('UserStyle1', 1)# 设置字体尺寸UserStyle1.font.size = Pt(40)# 设置字体颜色UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00)# 居中文本UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER# 设置中文字体UserStyle1.font.name = '微软雅黑'UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

定义好段落样式后,就可以直接调用了

document.dd_paragraph('好看吗','UserStyle1')

这里还有另一种方式选择颜色,字体:

document = Document()UserStyle1 = document.styles.add_style('UserStyle1', 1)
# 设置字体尺寸
UserStyle1.font.size = Pt(9)
# 设置字体颜色
UserStyle1.font.color.rgb = RGBColor(10,105,105)
#UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00)
# 居中文本
UserStyle1.font.name = '仿宋'
UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')

附上rgb对照表RGB

插入图片

本地通目录下保存a.jpg,尺寸设置5号

from docx import Document
from docx.shared import Inches
document = Document()
document.add_picture('a.jpg', width=Inches(5))

插入有序列表

document.add_paragraph('把冰箱门打开', style='List Number')
document.add_paragraph('把大象装进去', style='List Number')
document.add_paragraph('把冰箱门关上', style='List Number')

插入无序列表

document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet')
document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet')
document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet')
document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet')

插入分页

document.add_page_break()

添加页眉页脚

# -*- coding:utf-8 -*-
#__author__:langzi
#__blog__:www.langzi.fun
import osfrom docx import Document
document = Document(docx=os.path.join(os.getcwd(),'default.docx'))section = document.sections[0]
header = section.header
paragraph = header.paragraphs[0]
paragraph.text = "Report Power By Langzi"document.add_paragraph('正文')
document.add_paragraph('我也是正文啊啊啊')document.save('页脚.docx')

打包

用pyinstaller工具把使用到python-docx库的脚本打包成exe可执行文件后,双击运行生成的exe文件,报错:

docx.opc.exceptions.PackageNotFoundError: Package not found at 'C:\Users\ADMINI~1.PC-\AppData\Local\Temp\_MEI49~1\docx\templates\default.docx'

经过在stackoverflow上搜索,发现有人遇到过类似的问题(问题链接:cx_freeze and docx - problems when freezing),经过尝试,该问题的第二个回答可以解决这个问题:

I had the same problem and managed to get around it by doing the following. First, I located the default.docx file in the site-packages. Then, I copied it in the same directory as my .py file. I also start the .docx file with Document() which has a docx=... flag, to which I assigned the value: os.path.join(os.getcwd(), 'default.docx') and now it looks like doc = Document(docx=os.path.join(os.getcwd(), 'default.docx')). The final step was to include the file in the freezing process. Et voilà! So far I have no problem.

大概的解决步骤是这样的:

找到python-docx包安装路径下的一个名为default.docx的文件,我是通过everything这个强大的搜索工具全局搜索找到这个文件的,它在我本地所在的路径是:

E:\code\env\.env\Lib\site-packages\docx\templates

把找到的default.docx文件复制到我的py脚本文件所在的目录下。
修改脚本中创建Document对象的方式:
从原来的创建方式:

document = Document()

修改为:

import os
document = Document(docx=os.path.join(os.getcwd(), 'default.docx'))

再次用pyinstaller工具打包脚本为exe文件
把default.docx文件复制到与生成的exe文件相同的路径下,再次运行exe文件,顺利运行通过,没有再出现之前的报错,问题得到解决。

打包带页眉页脚的

如果添加页眉的化,打包exe会报错的,原因是读取配置文件xml不到

因为python-docx页眉页脚会读取安装包内的default-header.xml文件,路径在:

C:\python3\Lib\site-packages\docx\templates

尝试找源代码,找到后想通过修改源码中个获取xml的值来实现,但是发现牵一发动全身,换个思维从pyinstaller出发,修改pyinstaller的打包配置文件可以实现

import sys
from os import path
site_packages = next(p for p in sys.path if 'site-packages' in p)
print(site_packages)##原来的代码是找的库'C:\\Users\\sufor\\AppData\\Roaming\\Python\\Python37\\site-packages'这个库中没有docx
#site_packages  = 'C:\Users\sufor\AppData\Local\Programs\Python\Python37\Lib\site-packages'
block_cipher = Nonea = Analysis(['main.py'],pathex=[os.getcwd()],binaries=[],datas=[(path.join(site_packages,"docx","templates"),
"docx/templates")],    #原来datas替换为现在datashiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='aaaa',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,runtime_tmpdir=None,console=True , icon='logo.ico')
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,strip=False,upx=True,name='main')

要打包的文件保存为main.py,然后目录下运行pyinstaller xxx.spec即可

参考链接

参考链接

参考链接

参考链接

参考链接

欢迎关注公众号:【安全研发】获取更多相关工具,课程,资料分享哦~

Python操作word手册,与打包生成word文件相关推荐

  1. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  2. andriod 自编译,打包生成apk文件--------------------cocos2d-x 3.0正式版本(7.7)

    一.搭建搭建环境 1. 安装JDK 和 Android SDK 2. 配置环境变量 D:\android-sdk-windows\tools C:\Program Files\Java\jdk1.6. ...

  3. vue html引入资源dev下404,webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)...

    最近在使用webpack + vue做个人娱乐项目时,发现npm run build后,css js img静态资源文件均找不到路径,报404错误...网上查找了一堆解决办法,总结如下 一.首先修改c ...

  4. svn增量打包部署_利用svn的补丁文件打包生成增量文件

    下面的代码是maven版本 1. 创建patch.txt增量文件 保存到 文件目录下 比如 E:\aa\patch.txt 2. 编写java代码 package utils; import java ...

  5. VS2019项目打包生成.exe文件与Setup的步骤实现

    对于Visual Studio Installer ,我们通常称为:setup项目,是一个用于自定义安装部署的项目方案.但是在VS2019中不见了,微软是有意废除安装项目的,合作了一个第三方的安装项目 ...

  6. python语音合成并播放_使用Python实现文字转语音并生成wav文件的例子

    目前手边的一些工作,需要实现声音播放功能,而且仅支持wav声音格式. 现在,一些网站上支持文字转语音功能,但是生成的都是MP3文件,这样还需要额外的软件来转成wav文件,十分麻烦. 后来,研究Pyth ...

  7. androidstudio打包apk 文件_Android 打包生成APK文件时报lintOptions配置错误

    问题描述: 今天在原来得基础上优化了部分功能,想打包成apk文件安装到手机上运行一下,结果在打包时发生了异常.具体异常如下图所示: 翻译右边的错误: Lint在组装释放目标时发现致命错误. 要继续下去 ...

  8. Android项目打包生成apk文件

    Android开发打包生成APK文件 打包apk文件分为两种 无需密钥的apk 有密钥的apk(常规) 他们的区别只是就是安全问题. 1.没有密钥的apk 点击之后会自动生成没有密钥的APK. 在编辑 ...

  9. VS2010 打包生成exe文件后 运行安装文件出现 TODO:文件说明已停止工作并已关闭

    一.VS2010 打包生成exe文件后  运行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

  10. 什么是pyc文件,把python的py文件编译成pyc文件,把pyc文件反编译成py文件。以及python编译的如何设置不生成pyc文件

    文章目录 1 什么是pyc文件 1.1 什么是pyc文件 1.2 pyc文件是怎么生成的,有什么好处 2 把python的py文件编译成pyc文件 2.1 使用python内置库py_compile把 ...

最新文章

  1. 开源分布式数据库中间件
  2. 英伟达的雄心:成为AI时代的计算平台
  3. IO多路复用之poll
  4. Android中WebView加载sdcard中的html时提示:ERR_FILE_NOT_FOUND和ERR_ACCESS_DENIED
  5. Linux基础命令---get获取ftp文件
  6. 华为交换机配置Telnet步骤
  7. numpy不用科学记数发 python_Python科学计算库Numpy常用的函数使用
  8. Django里面是文件静态化的方法
  9. vs2017 cmake android,CMake构建VS2017工程
  10. FIIL邬宁:AI能锦上添花,但耳机成不了下一个智能音箱
  11. 基于python的客流统计_贵阳智能车载客流(人数)统计方案
  12. Android Verified Boot 2.0 安卓P AVB实现详解
  13. 黑苹果系统--Parallels Desktop虚拟机使用
  14. 使用PHP制作 简易员工管理系统之三(管理员登陆界面以及数据库验证)
  15. Vanishing gradient and activiation funcation(ReLU、Maxout)
  16. 向量检索的索引构建算法综述
  17. python练习, 打鱼晒网问题
  18. CF1658F 题解
  19. 部署并安装Discuz论坛(首先搭建LAMP环境Apache+MySQL+PHP)
  20. 大数据主导的七大领域,看看你是否身处其中!

热门文章

  1. 【已解决】联想小新14无线图标消失 | 网络适配器有感叹号 | Windows仍在设置此设备的类配置(代码56)的解决方法
  2. 【Python打包】Windows下使用Pyinstaller打包pyqt程序遇到的问题记录
  3. 大赢家软件测试工资,C++实验:某学校对教师每月工资的计算规定如下:固定工资+课时补贴。...
  4. mysql innodb 数据打捞(一)innodb 页面结构特征
  5. 手把手Excel图表美化(1)--仪表图
  6. 图像特征提取与匹配——SIFT算法
  7. c语言奇怪的分式11,蓝桥杯-奇怪的分式-java
  8. android实现简单弹幕
  9. Android气泡弹幕,Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕...
  10. Proteus报错:External model DLL “ADC083X.DLL“ not found. GLE=0x000036B1