zoukankan      html  css  js  c++  java
  • 一个可以选择目录生成doc目录内容的小工具(三) -python-docx

    回到一
    说到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里,或者调用都可以。

  • 相关阅读:
    好的学习资源
    对paper有用的idea
    斜杠青年
    简书随笔
    点云专业英文单词
    通过 UDP 发送数据的简单范例
    简单的聊天时范例(客户端)
    键盘输入
    简单的传输文件范例
    编写serversocket简单示例1
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13290875.html
Copyright © 2011-2022 走看看