如何使用python docx自定义Word中的编号样式?

如何使用python docx自定义Word中的编号样式?,python,ms-word,docx,python-docx,Python,Ms Word,Docx,Python Docx,我试图使用PythonDocx在Word文件中添加段落时自定义编号样式 例如,不只是添加'1'在一段的开头,我想做'class#1' 可能吗?是否有可以直接使用的函数?此示例将参数传递给示例docx: #生成_roombill_docx.py 进口稀土 从pathlib导入路径 从models.com导入RoomBill,c_room_bills_序列化程序 从models.nezha导入获取社区名称 from.create_docx_by_示例导入docx_替换 从.helper导入创建序列号

我试图使用PythonDocx在Word文件中添加段落时自定义编号样式

例如,不只是添加
'1'在一段的开头,我想做
'class#1'


可能吗?是否有可以直接使用的函数?

此示例将参数传递给示例docx:

#生成_roombill_docx.py
进口稀土
从pathlib导入路径
从models.com导入RoomBill,c_room_bills_序列化程序
从models.nezha导入获取社区名称
from.create_docx_by_示例导入docx_替换
从.helper导入创建序列号,详细价格
异步定义gen_docx(roombill:roombill,主机:str,r2=None,target=None):
# 创建docx文件,返回文件路径目标,指定让r2/c2采取二合一打印
社区名称=等待获取社区名称(roombill.community)
房间名称=房间账单。房间名称
host=host.replace(“www.esoaru.net”、“esoaru.net”)
img=qrcode\u path(主机、社区名称、roombill.room\u slug)
其中=路径(文件)。父
样本=其中/“样本_模板2.docx“
账单,总计=等待c\U房间账单\U序列化程序([roombill])
参数=构建参数(
账单,
房间名称,
社区名称,
全部的
roombill.name,
比尔,注意,
这段时间,
)
img_数据={“img_支付代码”:img}
如果社区名称==“xxx”:
参数[“谁”]=(
"深圳艺坤家园物业管理有限公司"
“\n”
"服务中心电话: 0755-28281233 (8:30-21:00)"
“\n”
"监控中心电话: 0755-28283118 (7*24小时)"
)
其他:
参数[“谁”]=“”
如果r2:
#TODO 2.2:两个单打印在同一张纸
其中=路径(文件)。父
sample=where/“double_sample.docx”
如果目标为无:
媒体=路径(“媒体”)
name=f“{room\u name}{r2}.docx”如果r2不是f“{room\u name}.docx”
目标=媒体/社区名称/“通知单“/姓名
target.parent.exists()或target.parent.mkdir(parents=True)
docx_替换(样本、目标、参数、img_数据)
返回str(目标)
def文件格式(详细信息):
如果没有详细说明:
返回“”
d=re.sub(r“”,详图)
d=re.sub(r“,”和d)
d=re.sub(r“\s{2,}”,“”,d)
返回d
def build_参数(
法案:dict,
单位:str,
社区名称:str,
总数:str,
账单名称:str,
备注:str=“”,
期间:str=“”,#计费周期备注
)->dict:
"""构造出模板需要的参数"""
sn=创建_sn()
d={“房间”:单位,“社区”:社区名称,“sn”:sn}
d[“总计”]=str(总计)
d[“详细”]=总价和详细价格(总价)或“”
d[“账单名称”]=账单名称
d[“周期提示”]=“计费周期备注:“如果不是”
d[“期间”]=期间或
d[“提示”]=“备注:“如果不是”
d[“备注”]=备注或“
行数=1
对于bill\u id,bills.items()中的bill\u数据:
对于账单数据[“费用”]中的费用项目:
对于我负责的项目[“项目”]:
a、 b,c=f“n{line_num}1”,f“n{line_num}2”,f“n{line_num}3”
d[a]、d[b]、d[c]=i[“标题”]、i[“金额”]、i[“细节”]
行数+=1
对于范围(1,10)内的i:
对于范围(1,4)内的j:
k=f“n{i}{j}”
d、 设置默认值(k,“”)
返回d
def qrcode_路径(主机:str,社区名称:str,房间号:str)->str:
"""返回二维码图片地址,如果图片不存在就调用QR码生成它"""
媒体=“媒体”
p=Path(media)/“qrcodes”/community_name/f“{room_slug}.jpg”
如果没有,则p.存在()
如果不是p.parent.exists():
p、 parent.mkdir(parents=True)
导入QR码
如果“王海”不在主机中:
qr_主机=”https://www.esoaru.com"
其他:
qr_host=host.replace(“旺海”、“www”)
link=f“{qr\u host}/dist/bill/{room\u slug}/paper”
qrcode.make(link).save(p)
返回str(p)
创建_docx_by_sample.py

#!/usr/bin/env python
from pathlib import Path
from typing import Optional, Union

from docx import Document
from docx.shared import Cm


def docx_replace(
    sample_path: Union[str, Path],
    savepath: Union[str, Path],
    params: dict,
    images: Optional[dict] = None,
) -> None:
    """根据给定模板和参数, 构造新的Word文档, 并保存在本地"""

    document = Document(sample_path)
    if images is None:
        images = {}

    for paragraph in document.paragraphs:

        for run in paragraph.runs:
            rtext = run.text
            for k, v in params.items():
                vname = "${%s}" % k
                if vname in rtext:
                    run.text = rtext.replace(vname, v)

            for k, v in images.items():
                vname = "${%s}" % k

                if vname in rtext:
                    run.clear()
                    run.add_picture(v, height=Cm(4.75))

    for paragraph in document.paragraphs:
        ptext = paragraph.text
        # print(ptext)
        for k, v in params.items():
            vname = "${%s}" % k
            if vname in ptext:
                paragraph.text = ptext.replace(vname, v)

    for table in document.tables:
        for row in table.rows:
            for cell in row.cells:
                for paragraph in cell.paragraphs:
                    ptext = paragraph.text
                    for k, v in params.items():
                        vname = "${%s}" % k
                        if vname in ptext:
                            paragraph.text = ptext.replace(vname, v)

                    for k, v in images.items():
                        vname = "${%s}" % k

                        if vname in ptext:
                            # print(ptext)
                            paragraph.clear()
                            run = paragraph.add_run()
                            run.add_picture(v, height=Cm(4.0))
    document.save(savepath)


def main() -> None:
    params = {
        "room": "10-005",
        "sn": "5213",
        "n11": "历史账单:",
        "n12": "物业费",
        "n13": "100.00",
        "n21": "",
        "n22": "停车费",
        "n23": "200",
        "n31": "7月账单:",
        "n32": "物业费",
        "n33": "100.00",
        "n41": "",
        "n42": "停车费",
        "n43": "200",
        "n51": "8月账单:",
        "n52": "物业费",
        "n53": "100.00",
        "n61": "",
        "n62": "停车费",
        "n63": "200",
        "n71": "",
        "n72": "总计:",
        "n73": "5320.00",
    }
    where = Path(__file__).parent
    docx_replace(
        where / "sample.docx",
        where / "cuishoudan_demo.docx",
        params,
        {"img_paycode": str(where / "gyy.jpg")},
    )

if __name__ == '__main__':
    import sys
    if 'test' in sys.argv:
        main()

sample.docx:

这似乎是可能的。@WaketZheng有什么函数我可以使用吗?@WaketZheng没有一个可以工作,我现在不知道怎么做,但我会在答案中发布一个关于更改docx内容的示例。