以下是关于使用pycharm 的docx库学习自动化处理的记录
注意,使用的是python-docx,而不是19年左右使用的docx。
File>settings>project:XXXX(项目名称)>右侧列表左下角小加号
此时在窗口中查找python-docx
老版的docx
但是
可以看到python-docx包已经更新至0.8.10版本了(现在是2021-03-29)
这是作者的发布网站,上面有全部的教程:https://python-docx.readthedocs.io/en/latest/index.html
他在github上:https://github.com/python-openxml/python-docx
记得及时更新
小试牛刀,赋予处理文档的功能
from docx import Document
document = Document()
“这会打开一个基于默认“模板”的空白文档,这几乎是您在Word中使用内置默认值启动新文档时所获得的。您可以使用打开和处理现有的Word文档python-docx”
看一下自己的需求
(仅仅作为个人学习用,请让我使用这个字体吧)
- 标题: 居中 小一 加粗 /跟上的时间使用11号 加粗
- 副标题 : 居中 11号 加粗
- 节抬头: 左对齐 11号 下划线 加粗
- 试卷名: 三号 加粗
- 题目序号:左对齐 楷体 下划线 加粗 小四 ##形式为: 有序数字加点(半月)##
- 题目内容:楷体 小四 ##形式为:题目内容( )。##
- 以及无数的回车
思路是从小至大把需求解决,第一步做到时间、文字格式、段落格式及间距、完成抬头输出,第二部做到读取十几份word的题目,创立一个数据库存好题目,第三步在抬头后输出带序号的题目,并编辑文字格式。最后展望,使用这个数据库学习做一个私人网站。
- 这里留给若干年后的自己,回溯这篇学习记录,请点根烟,喝口茶。学医后悔吗,过得怎么样了?
逐步实现文档编写——1.格式化时间
第一步,在文档中插入时间使用time,并进行处理
localtime求验:
import time
print(time.localtime())
time.struct_time(tm_year=2021, tm_mon=3, tm_mday=29, tm_hour=5, tm_min=25, tm_sec=15, tm_wday=0, tm_yday=88, tm_isdst=0)
asctime求验:
import time
print(time.asctime())
Mon Mar 29 05:22:22 2021
strftime求验
import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))
2021-03-29 05:23:06
所以需求代码为
print(time.strftime("%Y-%m-%d"))
2021-03-29
逐步实现文档编写——2.字体设置
- 首先复习一下中英文字号的互换数据
字号‘八号’对应磅值5
字号‘七号’对应磅值5.5
字号‘小六’对应磅值6.5
字号‘六号’对应磅值7.5
字号‘小五’对应磅值9
字号‘五号’对应磅值10.5
字号‘小四’对应磅值12
字号‘四号’对应磅值14
字号‘小三’对应磅值15
字号‘三号’对应磅值16
字号‘小二’对应磅值18
字号‘二号’对应磅值22
字号‘小一’对应磅值24
字号‘一号’对应磅值26
字号‘小初’对应磅值36
字号‘初号’对应磅值42
2.阅读docx作者Font 对象的介绍内容(直达链接:https://python-docx.readthedocs.io/en/latest/api/text.html#font-objects)
3 总结docx中对字体设置的代码(需求为中文)
思路是先把全体设置为宋体,再每句进行修改
- 这时我遇到了使用
document.styles['Normal'].font.name = u'宋体'
控制字体,但在输出的文档里,部分字符仍旧是西文字体的问题。
解决:
我网上冲浪了许多大神的文字控制代码,并且在docx作者发布的介绍内容Paragraph Style的Expected usage中有这样一段话
——“需要检测缺少样式的开发人员可以轻松地使用oxml层来检查XML,如果发现这些用例比预期的要普遍得多,则可以添加更多功能”
XML 指可扩展标记语言(eXtensible Markup Language),相关衍生出的代码我觉得老程序员都比我懂太多了 ,虽然找到了这句document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
,但我还是不能立马想通为什么,待研究吧。 - 另外我还学习到了docx.shared是一个在全局都可调用,作者设置了诸多类的对象,例如接下来需要使用的Pt,RGBColor都出自这里。源代码https://python-docx.readthedocs.io/en/latest/_modules/docx/shared.html?highlight=oxml#
我事后存下的小单片
from docx import Document
from docx.oxml.ns import qn ##调出设置全局字体时需要的xml操作命令##
from docx.shared import Pt,RGBColor##调出docx共享模块中
document = Document()
##设置全局字体类型##
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
##用paragraph创建一个段落##
##从此处阅读本代码开始,注意paragraph和run的层次关系##
maintitle = document.add_paragraph()
##用run创建一块name字符##
sentence = maintitle.add_run('李菲雯学业放弃指南')
##用font控制字体,其中size控制字体大小,bold控制加粗,color.rgb控制颜色##
##
sentence.font.size = Pt(24)##中文字号‘小一’即为24磅
sentence.font.bold = True
sentence.font.color.rgb = RGBColor(0,0,0)
document.save('试运行2.docx')##保存试运行文档
打开试运行2.docx(通过左侧辅助窗口Tool windows)
操作成功
这里提一嘴,翻了Font这部分的介绍内容
类docx.text.run.Font
包装了<w:rPr>的内容,并提供对字符属性(如字体名称,字体大小,粗体和下标)的访问。
【加粗效果bold】
读/写。使此字体的文本以粗体显示。
【斜体效果italic】
读/写三态值。如果为True,则使运行文本以斜体显示。None会继承父级样式。
【字体颜色color,之前我采用了大神们的RGB调色】
ColorFormat提供一种获取和设置此字体的文本颜色的方法的对象。
【单删线strike】
读/写三态值。何时True使行中的文本显示为带有一条删除线。
【双删线double_strike】
读/写三态值。如果为True,则使运行中的文本以双删除线显示。
【字体大小size】
读/写。Length值或None,以英制公制单位(EMU)指示字体高度。None会继承父级样式。Length是int 具有可方便转换为点或其他长度单位的属性的子类。本docx.shared.Pt类允许点值的方便规格。
##字号转换在前文已记录,若深造请阅读作者原文以及公制单位转换##
【下划线underline】
下划线样式,None,True,False,或从值WD_UNDERLINE。None指示字体从样式层次结构继承其下划线值。False 表示没有下划线。True表示单个下划线。WD_UNDERLINE中的值用于指定其他轮廓样式,例如double,wavy和dotted。
##如果使用,需先引用:from docx.enum.text import WD_UNDERLINE,可以实现【wavy波浪】、【dotted点线】、及【double双下划】##
【浮起效果emboss】
读/写三态值。如果为True,则使运行中的文本看起来像是从页面上浮起的。
【轮廓效果outline】
读/写三态值。当True通过在每个字符字形的内部和外部边框周围绘制一个像素宽的边框时,使运行中的字符看起来像轮廓一样。
【阴影效果shadow】
读/写三态值。何时True使运行中的文本看起来好像每个字符都有阴影一样。
【高亮效果highlight_color】
WD_COLOR_INDEX的成员,指示所应用突出显示的颜色;如果未应用突出显示,则为None。
##如果使用,需先引用:from docx.enum.text import WD_COLOR_INDEX。太简单不做源代码链接了,不过不确定能不能打印出来##
【嵌入效果imprint】
读/写三态值。如果为True,则使运行中的文本看起来像按入页面一样。
都2021了,得整明白 发光效果 和 映像效果 是哪个,这项待实验吧
==以下为不常用或今天没有用到的==
【上下标】
subscript
布尔值,指示其中的字符是否Font显示为下标。None会继承层次样式。
superscript
布尔值,指示其中的字符是否Font显示为上标。None会继承层次样式。
【word自动语法检查】
no_proof
读/写三态值。如果为True,则指定在扫描文档的拼写和语法时该运行的内容不应报告任何错误。
all_caps
读/写。使此字体的文本以大写字母显示。
【处理英文文档时,一键安排大小写可以用】
complex_script
读/写三态值。如果为True,则将运行中的字符视为复杂脚本,而不考虑其Unicode值。
math
读/写三态值。当设置True为时,指定此运行包含应该像处理Office Open XML Math一样处理的WML。
【这我不懂,往后补上】
name
获取或设置此Font实例的字体名称,如果找到匹配的字体,则导致其控制的文本以命名字体显示。None会继承父级样式。
##【淦,我之前就设了个重复名字的变量,还好没事。请大家注意不要和我烦一样的错误】##
rtl
读/写三态值。何时True使运行中的文本具有从右到左的特征。
small_caps
读/写三态值。何时True使运行中的小写字符显示为大写字母,比运行中指定的字体大小要小两点。
【未实验,可能是故事书里段落开头的大小写效果】
snap_to_grid
读/写三态值。True何时布置运行中的字符时,会导致运行使用docGrid元素中定义的每行设置的文档网格字符。
spec_vanish
读/写三态值。当为时True,指定给定的运行将始终像被隐藏一样运行,即使当前文档中显示了隐藏的文本也是如此。
【奇奇怪怪的魔法功能,若深造请阅读作者原文】
cs_bold
读/写三态值。如果为True,则使运行中的复杂脚本字符以粗体显示。
hidden
读/写三态值。如果True为,则除非在应用程序设置中强制显示隐藏的文本,否则将隐藏运行中的文本。
web_hidden
读/写三态值。当为时True,指定当文档在网页视图中显示时,此运行的内容应隐藏。
cs_italic
读/写三态值。如果为True,则使运行中的复杂脚本字符以斜体显示。
【奇怪的斜体】
逐步实现文档编写——3.段落设置
目前用下来,发现作者做了三种可以输入文字的方式,对应标题、段落、文字内容。
heading
paragraph
run
试运行了几次,认知如下:
- heading 没有找到文字格式的控制方法,但1、可以设置标题级别;2、作者给了0~9的级别值,好像每个还有不同的样式。
##这里摘的是介绍网页上的样式##
document = Document()
document.add_heading('Document Title', 0)
document.add_heading('Heading, level 1', level=1)
- paragraph 没有找到文字格式的编辑方法,但1、是真正意义上的段落,即为“输完字符后敲下回车”;2、可以控制段落格式:左右对齐居中,段间距。
(插两句嘴:
1、在写的时候发现大神对涉及段落格式的命令做了详细遍历统计,很实用,https://blog.csdn.net/weixin_44015805/article/details/95673437
2、以为作者可能没有做换行(我指在docx实现 硬回车 效果)的命令,傻傻找了一小时,好像他说还在Candidate protocol,往后可能会实现.breaks加上自动左右对齐的功能。也可能是我仍旧没找到,但反过来说一点,不断地添加paragraph已经满足目前的需求了。【根据源代码https://python-docx.readthedocs.io/en/latest/_modules/docx/text/paragraph.html#Paragraph.add_run当码农在字符串中输入\r或者\n只能实现软回车效果(add_run把回车代码、换行代码都视作换行,即向下小箭头)】 - run 妥妥的文字内容,本身自带下划线以及,也可以随便你用font七十二变。docx字体的魔法已经在前面全部写到了。
事后存下的,由几个单片叠加而成(不断添加paragraph创造段落,再添加run输入文字内容)
from docx import Document
from docx.oxml.ns import qn ##调出设置全局字体时需要的xml操作命令##
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT##调用段落格式命令##
from docx.shared import Pt,RGBColor
import time
time = time.strftime("%Y-%m-%d")
document = Document()
##设置全局字体类型##
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
##用paragraph创建一个段落##
##从此处阅读本代码开始,注意paragraph和run的层次关系##
maintitle = document.add_paragraph()
##用run创建一块name字符##
sentence = maintitle.add_run('李菲雯学业放弃指南')
##用font控制字体,其中size控制字体大小,bold控制加粗,color.rgb控制颜色##
##
sentence.font.size = Pt(24)
sentence.font.bold = True
sentence.font.color.rgb = RGBColor(0,0,0)
todaytime = maintitle.add_run(time)
todaytime.font.size = Pt(11)
todaytime.font.bold = True
todaytime.font.color.rgb = RGBColor(0,0,0)
##
maintitle.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
maintitle.paragraph_format.space_before = Pt(0)
maintitle.paragraph_format.space_after = Pt(0)
subtitle = document.add_paragraph()
sentence = subtitle.add_run('第一章'+'【单选】')
sentence.font.size = Pt(11)
sentence.font.bold = True
sentence.font.color.rgb = RGBColor(0,0,0)
subtitle.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
subtitle.paragraph_format.space_before = Pt(0)
subtitle.paragraph_format.space_after = Pt(0)
chapters = document.add_paragraph()
sentence = chapters.add_run('第一章内容')
sentence.font.size = Pt(11)
sentence.font.bold = True
sentence.font.color.rgb = RGBColor(0,0,0)
sentence.font.underline = True
chapters.paragraph_format.space_before = Pt(0)
chapters.paragraph_format.space_after = Pt(0)
paper = document.add_paragraph()
sentence = paper.add_run('卷'+'A')
sentence.font.size = Pt(16)
sentence.font.bold = True
sentence.font.color.rgb = RGBColor(0,0,0)
paper.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
paper.paragraph_format.space_before = Pt(0)
paper.paragraph_format.space_after = Pt(0)
document.save('试运行2.docx')
打开试运行2.docx
操作成功agian!
这里再提一嘴,还是翻了一些东西读了部分源代码,按照实用性降序排列记录在这里。
——翻了Document这部分的介绍内容
类docx.document.Document
WordprocessingML(WML)文档。
使用docx.Document()打开或创建文档。
save(path_or_stream )
将此文档保存到path_or_stream,该路径可以是文件系统位置(字符串)的路径,也可以是类似文件的对象。
【不搞这个等于白写】
add_heading(文字= u'',等级= 1 )
返回新添加到文档末尾的标题段落。
标题段落将包含文本,并且其段落样式由级别确定。如果level为0,则样式设置为Title。如果level为1(或省略),则使用Title1样式。否则,样式设置为Heading {level}。
【这个level会在超出0-9范围时ValueError报错】
add_paragraph(text = u'',style = None )
返回新添加到文档末尾的段落,该段落填充文本并具有段落样式style。文本可以包含制表符(\t)字符,这些字符将转换为制表符的相应XML形式。文本还可以包含换行符(\n)或回车符(\r),每个字符都转换为换行符。
##【回车换行都变成软回车(换行)的魔法在这里,源代码传送门在上面】##
=====不常用或者我今天没用到的在这里=====
add_page_break()
返回Paragraph仅包含分页符的新对象。
【分页符,这个在docx介绍首页中有】
【以下为读写权限相关的】
core_properties
CoreProperties对象提供对本文件的核心属性读/写访问。sections
Sections 提供对本文档中每个部分的访问权限的对象。
settings
一个Settings对象提供对文档的访问级别设置为这个文件。
styles
Styles提供对本文档中样式的访问权限的对象。
【以下为表格控制相关的】
add_table(rows,cols,style = None )
添加具有行和列计数的表行和的cols 分别的表格样式风格。样式可以是段落样式对象或段落样式名称。如果style为None,则表继承文档的默认表样式。
tables
Table按文档顺序与文档中的表相对应的实例列表。
【请注意,只有出现在文档顶层的表才会出现在此列表中。嵌套在表格单元格中的表格不会出现。修订标记中的表格,例如 <w:ins>或<w:del>也不会出现在列表中】
paragraphs
Paragraph按文档顺序对应于文档中各段落的实例列表。
【请注意,修订标记中的段落(例如<w:ins>或)<w:del>不会出现在此列表中】
part
DocumentPart本文档的对象。
【图形控制,美工狂喜】
inline_shapes
InlineShapes提供访问此文档中的内嵌形状的对象。内联形状是包含在一段文本中的图形对象(例如图片),其行为类似于字符字形,并像段落中的其他文本一样流动。
【注意是内嵌哦,我还没有找到浮动与文字上下方这种更智能的代码段落】
add_picture(image_path_or_stream,width = None,height = None )
返回文档末尾在其自己的段落中添加的新图片形状。图片包含image_path_or_stream处的图像, 并根据宽度和高度进行缩放。如果未指定宽度和高度,则图片将以其原始尺寸显示。如果仅指定一个,它将用于计算比例因子,然后将其应用于未指定的尺寸,从而保留图像的长宽比。
【图片的原始尺寸是使用图像文件中指定的每英寸点数(dpi)值计算的,如果没有指定值,则默认为72 dpi(通常是这样)】
==以下为不常用或今天没有用到的==
add_section(start_type = 2 )
返回一个Section对象,该对象表示在文档末尾添加的新部分。可选的start_type参数必须是WD_SECTION_START枚举的成员。
【如果未提供start_type参数,则会默认为WD_SECTION.NEW_PAGE 】
翻了paragraph这部分的介绍内容
类docx.text.paragraph.Paragraph
代理对象包装<w:p>元素。
add_run(text = None,style = None )
将运行添加到此段,其中包含文本并具有由样式ID style标识的字符样式。文本可以包含制表符(\t)字符,这些字符将转换为制表符的相应XML形式。文本还可以包含换行符(\n)或回车符(\r),每个字符都转换为换行符。
【回车换行都变成软回车(换行)的魔法在这里】
alignment
WD_PARAGRAPH_ALIGNMENT枚举的成员,指定此段落的对正设置。值为None 表示该段落没有直接应用的对齐方式值,并将从其样式层次结构继承其对齐方式值。分配 None给此属性将删除任何直接应用的对齐值。
【WD_PARAGRAPH_ALIGNMENT是经常从docx.enum.text调用的段落格式控制命令】
paragraph_format
在ParagraphFormat提供对本段的格式属性,诸如行间距和缩进对象。
##【哎嘿,ParagraphFormat是另一个对象了,你对象真多。血皇敖天
大神已经做了全部的整理,传送门就在我写的paragraph当中。可以读一下源代码https://python-docx.readthedocs.io/en/latest/_modules/docx/text/parfmt.html#ParagraphFormat。】##
insert_paragraph_before(text = None,style = None )
返回一个新创建的段落,该段落直接插入到该段落之前。如果提供了文本,则新段落将在一次运行中包含该文本。如果风格提供,这种风格被分配给新的段落。
【我看到有大神使用这段代码,自己还是没动力写,腰疼了,待实验】
=====不常用或者我今天没用到的在这里=====
clear()
删除所有段落后,返回同一段落。保留段落级格式,例如样式。
runs
Run与本段中<w:r>元素相对应的实例序列。
style
读/写。_ParagraphStyle表示分配给此段落的样式的对象。如果没有为该段落指定显式样式,则其值为文档的默认段落样式。可以指定段落样式名称来代替段落样式对象。分配将None删除所有应用的样式,使其有效值成为文档的默认段落样式。
text
通过将段落中每次运行的文本串联起来形成的字符串。XML中的制表符和换行符分别映射到\t和\n 字符。
将文本分配给该属性会导致所有现有段落内容被包含分配的文本的单次运行替换。\t文本中的一个字符映射到一个<w:tab/>元素,每个\n或一个\r字符映射到一个换行符。保留段落级格式,例如样式。删除所有运行级别的格式,例如粗体或斜体。
【text和add_run一样都是回车换行都变成软回车的魔法】
——翻了run这部分的介绍内容
【加粗,之前提到的font.bold与此处run.bold用法类似】
bold
读/写。使运行文本以粗体显示。
【斜体,之前提到的font.italic与此处run.italic用法类似】
italic
读/写三态值。如果为True,则使运行文本以斜体显示。
【下划线,之前提到的font.underline与此处run.underline用法类似】
underline
下划线样式此Run,一None,True,False,或从值WD_UNDERLINE。值None表示运行没有直接应用的下划线值,因此将继承其包含段落的下划线值。分配None给此属性将删除任何直接应用的下划线值。值 False表示没有下划线的直接应用设置,将覆盖任何继承的值。值True表示单个下划线。WD_UNDERLINE中的值用于指定其他轮廓样式,例如double,wavy和点线。
【换行】
add_break(break_type = 6 )
向此运行中添加break_type的break元素。break_type可以使用值WD_BREAK.LINE,WD_BREAK.PAGE和 WD_BREAK.COLUMN,其中WD_BREAK是从docx.enum.text导入的。 break_type默认为WD_BREAK.LINE。
##【这个break我找了好久】##
【添加文字,更友好及明确的超级码农金坷垃】
add_text(文字)
将新添加的_Text对象(对应于新的 <w:t>子元素)返回到运行中,其中包含text。
【返回字体格式,超级码农金坷垃】
font
该Font对象提供对此运行的字符格式设置属性的访问,例如字体名称和大小。
【叫姜文也翻译不来的的超级码农金坷垃】
clear()
删除其所有内容后,返回对该运行的引用。保留所有运行格式。
==以下为不常用或今天没有用到的==
【添加图片,】
add_picture(image_path_or_stream,width = None,height = None )[资源]
返回一个InlineShape实例,该实例包含由image_path_or_stream标识的图像 ,并添加到此运行的末尾。 image_path_or_stream可以是路径(字符串)或包含二进制图像的文件状对象。如果未指定宽度和高度,则图片将以其原始尺寸显示。如果仅指定一个,它将用于计算比例因子,然后将其应用于未指定的尺寸,从而保留图像的长宽比。图片的原始尺寸是使用图像文件中指定的每英寸点数(dpi)值计算的,如果没有指定值,则默认为72 dpi(通常是这样)。
【添加制表符】
add_tab()
<w:tab/>在运行结束时添加一个元素,Word会将其解释为制表符。
docx.text.run.Run
代理对象包装<w:r>元素。几个上的运行性能的需要三态值,True,False,或None。True和False 分别对应于开和关。None指示未在运行时直接指定属性,并且其有效值来自样式层次结构。
style
读/写。一个_CharacterStyle表示字符样式对象适用于本运行。如果运行中没有直接应用的字符样式,则返回文档的默认字符样式(通常为Default Character Font)。将此属性设置为None 会删除任何直接应用的字符样式。
【最后是有待实验的八股文系列】
text
通过将等效于每个运行内容子元素的文本串联到Python字符串中而形成的字符串。每个<w:t>元素都会添加其包含的文本字符。甲<w:tab/>元件增加了一个\t字符。甲<w:cr/>或<w:br>元件每增加一个\n字符。请注意,<w:br>元素可以指示分页符或列分隔符以及换行符。无论其类型如何,所有<w:br> 元素都转换为单个\n字符。所有其他内容子元素(例如<w:drawing>)都将被忽略。分配的文本以该属性具有相反的效果,平移每个\t字符的<w:tab/>元件,并且每个\n或 \r字符到一个<w:cr/>元件。任何现有的运行内容将被替换。运行格式保留。
——提一嘴paragraph_format最实用的几个,这里暂且不翻,毕竟大神链接在上面,随时可以翻了吧。flag–睡足觉缓过神就更新
first_line_indent首行缩进
space_after段前间距
space_before段后间距
注意,我在初次写时创造了name变量,还好我没老板没产品经理,没报错没出事!在font里有.name命令的!我后来全给RUA下来改成sentence了,千万别像我一样犯大忌!
入门时的教程:https://www.runoob.com/python/att-time-time.html 时间模块:https://blog.csdn.net/qq_43077626/article/details/104303984 docx 字体:https://www.osgeo.cn/python-docx/api/enum/index.html 我在这里找到的关于中西文字体转换问题的代码https://blog.csdn.net/weixin_30856965/article/details/95873544 主要docx处理的教程:https://blog.csdn.net/weixin_42763696/article/details/105492135 当docx包遇到函数报错:https://blog.csdn.net/qq_43965708/article/details/109272690