回到一
说到docx的用法,度娘一大堆参考文档,眼花缭乱的。这里就不啰嗦了,基本上就是新建个Document对象,然后往上边加标题、段落、表格。附带设置这些对象的字型字号啥的。不过有一点,docx和python-docx是两个库,看帖的时候要小心。建议看官方文档
接着看看我们的目标:
为了实现这种编号,我先是想修改本地docx的样式来解决,生成文档的时候只设置成几级标题,不设置任何样式,在本机修改默认样式模板。结果,没啥用。
然后我想会不会在docx的标题样式里有相关的设置,然后就找到了这个
编号样式还没有实现,果然大神研发鄙视python还是有道理的。那现在只能从样式模板上入手了,找了半天也没有发现指定模板的的方法,docx库的默认模板和本地的模板不是指一个东东。
无奈了,最后选择笨办法,手工赋值:比较难受的是因为要操作全局变量取编号,但目录和广度和深度都是不确定因素,所以只能定死。
思路就是使用全局变量n来判断目录的广度,使用num确定目录的深度,读取各个全局变量listxx里的编号将编号加到item名前。
ps:补的文档,以下的代码是按照这个思路来的,后来再思考一下,既然创建了广度n控制参数,然后深度我们也有,那创建一个arraylist来表示这些编号,然后在输出item.name的时候就+上编号不就好了。按照这个思路来,我改了一版,这个旧思路也留着,毕竟当时也想了很长时间。新版参看(六)小节。
代码如下:
import os
import os.path
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor
#初始化doc对象、
def Init():
global doc
doc = Document()
doc.styles["Normal"].font.name = u'宋体'
doc.styles["Normal"].font.size = Pt(12)
doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
doc.styles["heading 1"].font.size=Pt(20)
name = doc.add_paragraph()
run = name.add_run(r'本周主要内容')
run.font.size = Pt(25)
run.font.name = u"宋体"
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
name.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# head = doc.add_heading("", level=1)
# run = head.add_run(u"主要内容")
# run.font.size = Pt(12)
# run.font.color.rgb = RGBColor(0, 0, 0)
# run.font.name = u"宋体"
# run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# head.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
def Save(dst):
global doc
try:
doc.save(dst)
return True
except IOError as e:
last_err = e.strerror
return False
#设置段落
def AddListText(text):
global doc
p = doc.add_paragraph(style='List Number')
run = p.add_run(text)
run.font.size = Pt(15)
run.font.name = u"宋体"
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
def AddLineText(text):
global doc
name = doc.add_paragraph(style='List Number')
run = name.add_run(text)
run.font.size = Pt(15)
run.font.name = u"宋体"
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
global numlist1,numlist2,numlist22,numlist3,numlist33,n
n = 0
numlist1 = ['一、','二、','三、','四、','五、','六、','七、','八、','九、','十、']
numlist2 = ['(一)、', '(二)、', '(三)、', '(四)、', '(五)、', '(六)、', '(七)、', '(八)、', '(九)、', '(十)、']
numlist22 = ['(一)、', '(二)、', '(三)、', '(四)、', '(五)、', '(六)、', '(七)、', '(八)、', '(九)、', '(十)、']
numlist3 = ['1、','2、','3、','4、','5、','6、','7、','8、','9、','10、']
numlist33 = ['1、','2、','3、','4、','5、','6、','7、','8、','9、','10、']
def Addhead(text,num):
global doc
if num == 1 :
listnum = num - 1
head = doc.add_heading("", level=num)
run = head.add_run(numlist1.pop(listnum)+text)
run.font.name = u"宋体"
elif num == 2:
listnum = num - 2
head = doc.add_heading("", level=num)
print(n)
if n == 1:
try:
run = head.add_run(numlist2.pop(listnum) + text)
except Exception as e:
print(e)
run.font.name = u"宋体"
else:
try:
run = head.add_run(numlist22.pop(listnum) + text)
except Exception as e:
print(e)
run.font.name = u"宋体"
elif num == 3:
listnum = num - 3
if n == 1:
head = doc.add_heading("", level=num)
run = head.add_run(numlist3.pop(listnum) + text)
run.font.name = u"宋体"
else:
head = doc.add_heading("", level=num)
run = head.add_run(numlist33.pop(listnum) + text)
run.font.name = u"宋体"
Init()
def _showdir(path, depth):
for item in os.scandir(path):
# AddListText(item.name)
print("| " * depth + "+--" + item.name)
# AddLineText(" " * depth + " " + item.name)
Addhead(item.name, depth + 1)
#递归出口
if item.is_dir():
_showdir(item.path, depth + 1)
def showdir(path, depth):
for item in os.scandir(path):
global n
n += 1
print("| " * depth + "+--" + item.name)
Addhead(item.name, depth + 1)
#递归出口
if item.is_dir():
_showdir(item.path, depth + 1)
file = r'C:UserszhaobwDesktopdemo.docx'
Save(file)
if __name__ == '__main__':
path = r'C:UserszhaobwDesktop测试'
showdir(path, 0)
# showlistdir(path, 0)
总结:
这一节完后了docx的测试,需求基本上都已经完成了。下一步将逻辑代码贴到gui里,或者调用都可以。