一个可以选择目录生成doc目录内容的小工具(三) -python-docx

摘要:
不过有一点,docx和python-docx是两个库,看帖的时候要小心。然后我想会不会在docx的标题样式里有相关的设置,然后就找到了这个编号样式还没有实现,果然大神研发鄙视python还是有道理的。那现在只能从样式模板上入手了,找了半天也没有发现指定模板的的方法,docx库的默认模板和本地的模板不是指一个东东。

回到一
说到docx的用法,度娘一大堆参考文档,眼花缭乱的。这里就不啰嗦了,基本上就是新建个Document对象,然后往上边加标题、段落、表格。附带设置这些对象的字型字号啥的。不过有一点,docx和python-docx是两个库,看帖的时候要小心。建议看官方文档

接着看看我们的目标:
一个可以选择目录生成doc目录内容的小工具(三) -python-docx第1张

为了实现这种编号,我先是想修改本地docx的样式来解决,生成文档的时候只设置成几级标题,不设置任何样式,在本机修改默认样式模板。结果,没啥用。
然后我想会不会在docx的标题样式里有相关的设置,然后就找到了这个

一个可以选择目录生成doc目录内容的小工具(三) -python-docx第2张

编号样式还没有实现,果然大神研发鄙视python还是有道理的。那现在只能从样式模板上入手了,找了半天也没有发现指定模板的的方法,docx库的默认模板和本地的模板不是指一个东东。
无奈了,最后选择笨办法,手工赋值:比较难受的是因为要操作全局变量取编号,但目录和广度和深度都是不确定因素,所以只能定死。
思路就是使用全局变量n来判断目录的广度,使用num确定目录的深度,读取各个全局变量listxx里的编号将编号加到item名前。
ps:补的文档,以下的代码是按照这个思路来的,后来再思考一下,既然创建了广度n控制参数,然后深度我们也有,那创建一个arraylist来表示这些编号,然后在输出item.name的时候就+上编号不就好了。按照这个思路来,我改了一版,这个旧思路也留着,毕竟当时也想了很长时间。新版参看(六)小节。

一个可以选择目录生成doc目录内容的小工具(三) -python-docx第3张
代码如下:

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

免责声明:文章转载自《一个可以选择目录生成doc目录内容的小工具(三) -python-docx》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇兼容ie7以上的 placeholder属性Python操作数据库出现的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql批量更新

一般的update user set num = new_num where id = ('需更新的记录') ,这种一条条更新多条数据时会很慢,而采用下面的sql语句可以快速实现一条语句多条更新; UPDATE user SET name = CASE id WHEN 1 THEN new_num WHEN 2 THEN old_num + 10 WHEN...

本福特定律

本福特定律 测试结果 比例 1 : 30.0766922307 2 : 17.639213071 3 : 12.504168056 4 : 9.66988996332 5 : 7.9693231077 6 : 6.60220073358 7 : 5.80193397799 8 : 5.1683...

在javaweb的项目当中实现随机数字的生成

首先,需要在javaweb的项目当中新建一个Servlet文件,然后再web.xml中配置一下: 这样运行的时候就可以通过“http://localhost:8080/Response/Response02”的地址访问到我们的Servlet。 开始代码的编写吧: 首先,我们需要写一个生成随即数字的方法,我们这次实现随即生成七位数的数字: priv...

Java对byte数组压缩 解压缩 (zip,gzip,bzip2,jzlib)

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import j...

处理精度丢之-如何解决

通过上篇我们了解到计算机是如何存储浮点数,那精度丢失是在哪产生的? 拿0.1 + 0.2举例: 0.1 转二进制后:0.0 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 01(转化后是以0011无限循环,二进制为满一进一,所以末尾为01) 0.2: 转二进制后:0.0 01...

1034 Head of a Gang (30 分)(图的遍历or并查集)

dfs #include<bits/stdc++.h> using namespace std; const int N=3000; int mp[N][N]; int weight[N]; int vis[N]; map<string,int>si; map<int,string>is; map<string...