两行代码搞定(其实一行就可以创建了,不过关闭语句必须得有,或者你可以使用with open语句创建文档,就可以不使用close()方法关闭,它会自动关闭):
f=open('test.docx','w')#创建docx格式文件
f.close()#关闭文档,为了解除当前python程序对test.docx文档的占用
测试:
首先此目录并无docx的文档:
已经多个一个test.docx,word的空文档。因为没有写入数据,所以是空文档。
你可以在f.close()之前,使用f.wrie('testadfas')写入数据,然后再调用f.close()关闭
B. 如何用python读取word
使用Python的内部方法open()读取文本文件
try:
f=open('/file','r')
print(f.read())
finally:
iff:
f.close()
如果读取word文档推荐使用第三方插件,python-docx 可以在官网上下载
使用方式
#-*-coding:cp936-*-
importdocx
document=docx.Document(文件路径)
docText=' '.join([
paragraph.text.encode('utf-8')forparagraphindocument.paragraphs
])
printdocText
C. 说说 python-docx 解析 word 文档的原理
首先通过 pip 安装 python-docx,命令为 pip install python-docx 。
python-docx 使用 Document 对象来表示整个 docx 文档。其内部包含 一个Paragraph 对象列表。每个 Paragraph 对应 docx 文档的一个段落。
word 文档中除了字符串,还包含字体、大小、颜色等样式信息。相同样式的连续字符串,就会被保存在一个 Run 对象中。
假设 docx 文档中有下面这些内容:
那么经过 python-docx 解析,就会生成 3 个 Run 对象:
D. python设置word文档格式内容
import docx
doc=docx.Document()
整数 0 表示标题是 Title 样式,这用于文档的顶部。整数 1 到 45是不同的标题层次,是主要的标题, 45是最低层的子标题。
doc.add_heading('标题0',0)
doc.add_heading('标题1',1)
doc.add_heading('标题2',2)
doc.add_heading('标题3',3)
doc.add_heading('标题4',4)
doc.add_heading('标题5',5)
doc.save('example3.docx')
1# 添加内容
paragraph = doc_.add_paragraph()
run_ = paragraph.add_run("Python 博客")
2# 获取字体对象
font_ = run_.font
3# 设置下划线
font_.underline = True
4# 设置加粗
font_.bold = True
5# 设置字体颜色
font_.color.rgb = RGBColor(0xFF,0x00,0x00)
6# 设置字体大小
font_.size = Pt(20)
7# 获取段落格式
paragraph_format = paragraph.paragraph_format
8# 设置首行缩进
paragraph_format.first_line_indent = Inches(0.2)
9# 设置段前距,单位为英镑
paragraph_format.space_after = Pt(10)
10# 设置段后距,单位为英镑
paragraph_format.space_before = Pt(5)
11# 添加表格
table_ = doc_.add_table(rows=2, cols=2, style="Medium Grid 1 Accent 1")
12# 填写第一行第一列内容
table_.cell(0,0).text ="
13# 填写第一行第二列内容
table_.cell(0,1).text =""
14# 填写第二行第一列内容
table_.cell(1,0).text ="描述"
15# 填写第二行第二列内容
table_.cell(1,1).text =""
16# 添加图片、width 属性设置大小
doc_.add_picture(r"/usr/load/download/test.png", width=Inches(4.25))
17# 保存文档
doc_.save('Python--Word 内容格式.docx')
E. python从word中读取规则数据存到excel中
word中文件的格式如图,类似一个标准的参考文献格式,而我的需求是按照作者,论文名,期刊名,时间,期卷号存到一个excel中。
1.首先,word的python读取每次读的是块。
2.通过对格式的分析,确定了利用,来分割字符串,然后再用.来分割上次分割的第一个字符串,这对于期刊论文很适用,对于会议论文的可用性就弱很多。
3.数据的传递使用的是list而不是字典,如果有机会的话,可能字典更好用,只是时间有限。
python自带的split
并且支持反向切割,str.rsplit()语法和正向一致
2.re库带的split,自认为的亮点是可以支持吧不同的符号作为切割位点,例如,
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
F. Python Word文档处理 上篇:python-docx
某天我收到一个需求:希望能够用python对word文档进行一些处理,比如更换一些文字以及添加批注。
简单搜索后,我发现 python-docx 是一个处理docx文档的常用python库,因此我打算用它来进行进一步开发。
官方文档 提供了一个简单的示例
python-docx 将文档抽象为document对象、paragraph对象以及run对象,提供了围绕这些对象进行简单处理的API
然而在文档中并没有出现关于批注操作的部分,我在搜寻 一些文章 后发现了在某个 issue 中提及了添加批注相关信息,然而还是没有得到具体的解决办法
docx文档底层是由XML文件组成的
我们可以将一个 xx.docx 文件的后缀名改为 .rar 然后将其手动解压,可以得到下面这些文件
在诸多文件当中主要用到的是 document.xml 文件,这里保存了文档的内容
打开一份 document.xml 文件,抛开header、footer、table以及其他特殊项,去掉样式等修饰项,一份朴素的docx文档主要可以分为三个部分:paragraph、run、text
paragraph即段落,就是我们在word当中看到的一段。text即文本,就是真实的内容。run比较抽象,我们可以将其理解为片段,即语句的切分。
为了更好地理解run是什么,打开一篇word文档定位其中一句话
让我们看看这篇文档解压之后的 document.xml 文件中对应的部分
OK,我们可以看到原本完整的一句话在word中被拆分成了许多个 <w:r> 标签,这就是 run ,word切分 run 的规则很多,有的根据标点符号,有的根据中文分词,句子中如果存在不同样式的字词也会单独切分出来,因此我们很难预估一句话究竟会被分成几个片段。
在issue中搜索comment关键字发现在一个 merge request 上已经给出了添加批注的解决方案,可以通过 paragraph 对象上的 add_comment 方法给一个段落添加批注
但这还是不符合我的需求,我的目标是精准添加到某个词或者短语上
打开 这个贡献者的源码 进行研究
其实就是在P标签内插入comment标签引用,同时添加comment标签到xx文件
同理我们可以在r标签内插入comment标签引用,同时添加comment标签到xx文件,这样就能实现给特定词添加批注的需求了
G. python新建word文档
话说,你是在自己电脑上好好的,然后突然不行了
还是在别人电脑不行了?
word.displayalerts
这个是2013的属性
Microsoft Word 14.0,这是2010版
H. python怎么在word表中插图片
# -*- coding: UTF8 -*-from docx import Documentfrom docx.shared import Pt doc = Document() # 文件存储路径path = "C:\\Users\\Administrator\\Desktop\\word文档\\" # 读取文档# doc = Document(path + "hello.docx") # 添加图片,后面的参数设置图片尺寸,可以选填doc.add_picture(path + 'cat.jpg', width=Pt(300))
I. python合并word
合并多个 word文件到 一个文件 中,用于文件的批量打印。
要求:
采用 python 实现,使用python中的 python-docx 和 docxcompose 结合的方式来实现此功能。
优点:
缺点:
只支持docx 文件的合并, 不支持doc文件 。如想通过此模式合并doc文件,需将doc文档转换为docx文档。
将一个文件夹中的所有文件,都合并到一个文档中。
要求每个文档,都从一个新页面开始,因此需在除第一个文档的每个文档前面加上 分页符 ,所以单独定义了一个只包含分页符的文档 page_break_doc 。
部分情况下会出现问题,如文档当前已经到 最后一行 了,新加的分页符会导致生成一页空白的文件, 此种情况,后续更新此文章时解决 。
定义目标文档,初始化时,采用 target_doc = Document(source_file_path_list[0]) 的方式,以第一个要拼接的文档作为初始文档。
主要是因为,如果创建的空的文档 target_doc = Document() ,新生成的文档中 自带的文档样式 (如标题样式、正文样式等) 将会影响新拼接的文档中的采用了默认样式的内容 ,故模板文档从第一个文档中进行加载默认样式,避免了这种情况。
这也是网上大多数采用此种方式合并word,样式发生变更的原因 ,需注意此问题。
同时需注意,如果拼接的文档中,存在默认格式不一样,并且未为段落、文字指定单独样式的情况时,需检查,第一个文件作为模板加载的默认样式, 是否会影响后续的其他文件合并后的默认样式 。
200个文件合并,耗时10秒左右。速度非常快
python脚本的程序,其他程序可以直接通过 命令行的形式调用 ,或者python提供http接口,程序通过 http接口调用 。
切记通过http接口调用其他程序是,需设置好调用超时时间,防止无限等待请求结果,导致负载均衡时,大量请求超时而导致的程序整体不再分发请求。
J. python输出word内容
程序导出word文档的方法
将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob、Apache POI、Java2Word、iText等各种方式,以及使用freemarker这样的模板引擎这样的方式。php中也有一些相应的方法,但在python中将web/html内容生成world文档的方法是很少的。其中最不好解决的就是如何将使用js代码异步获取填充的数据,图片导出到word文档中。
1. unoconv
功能:
1.支持将本地html文档转换为docx格式的文档,所以需要先将网页中的html文件保存到本地,再调用unoconv进行转换。转换效果也不错,使用方法非常简单。
\# 安装
sudo apt-get install unoconv
\# 使用
unoconv -f pdf *.odt
unoconv -f doc *.odt
unoconv -f html *.odt
缺点:
1.只能对静态html进行转换,对于页面中有使用ajax异步获取数据的地方也不能转换(主要是要保证从web页面保存下来的html文件中有数据)。
2.只能对html进行转换,如果页面中有使用echarts,highcharts等js代码生成的图片,是无法将这些图片转换到word文档中;
3.生成的word文档内容格式不容易控制。
2. python-docx
功能:
1.python-docx是一个可以读写word文档的python库。
使用方法:
1.获取网页中的数据,使用python手动排版添加到word文档中。
from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first item in ordered list', style='ListNumber'
)
document.add_picture('monty-truth.png', width=Inches(1.25))
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for item in recordset:
row_cells = table.add_row().cells
row_cells[0].text = str(item.qty)
row_cells[1].text = str(item.id)
row_cells[2].text = item.desc
document.add_page_break()
document.save('demo.docx')
from docx import Document
from docx.shared import Inches
document = Document()
for row in range(9):
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.save('table-step.docx')
缺点:
1.功能非常弱。有很多限制比如不支持模板等,只能生成简单格式的word文档。
程序导出PDF文档方法
1.pdfkit
功能:
1.wkhtmltopdf主要用于HTML生成PDF。
2.pdfkit是基于wkhtmltopdf的python封装,支持URL,本地文件,文本内容到PDF的转换,其最终还是调用wkhtmltopdf命令。是目前接触到的python生成pdf效果较好的。
优点:
1.wkhtmltopdf:利用webkit内核将HTML转为PDF
webkit是一个高效、开源的浏览器内核,包括Chrome和Safari在内的浏览器都使用了这个内核。Chrome打印当前网页的功能,其中有一个选项就是直接“保存为 PDF”。
2.wkhtmltopdf使用webkit内核的PDF渲染引擎来将HTML页面转换为PDF。高保真,转换质量很好,且使用非常简单。
使用方法:
\# 安装
pip install pdfkit
\# 使用
import pdfkit
pdfkit.from_url('', 'out.pdf')
pdfkit.from_file('test.html', 'out.pdf')
pdfkit.from_string('Hello!', 'out.pdf')
缺点:
1.对使用echarts,highcharts这样的js代码生成的图标无法转换为pdf(因为它的功能主要是将html转换为pdf,而不是将js转换为pdf)。对于纯静态页面的转换效果还是不错的。
2.其他
其他生成pdf的插件还有:weasyprint,reportlab,PyPDF2等,经简单试验都不如pdfkit效果好,且有些用法复杂。