最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python快速生成定制化的Word(docx)文檔

 更新時(shí)間:2023年05月18日 11:27:40   作者:初始安全  
這篇文章主要為大家介紹了如何使用Python快速生成定制化的Word文檔實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1.1. 前言

眾所周知,安服工程師又叫做Word工程師,在打工或者批量SRC的時(shí)候,如果產(chǎn)出很多,又需要一個(gè)一個(gè)的寫報(bào)告的情況下會(huì)非常的折磨人,因此查了一些相關(guān)的資料,發(fā)現(xiàn)使用python的docxtpl庫(kù)批量寫報(bào)告效果很不錯(cuò),記錄一下。

1.2. 介紹

docxtpl 是一個(gè)用于生成 Microsoft Word 文檔的模板引擎庫(kù),它結(jié)合了 docx 模塊和 Jinja2 模板引擎,使用戶能夠使用 Microsoft Word 模板文件并在其中填充動(dòng)態(tài)數(shù)據(jù)。它提供了一種方便的方式來生成個(gè)性化的 Word 文檔,并支持條件語(yǔ)句、循環(huán)語(yǔ)句和變量等控制結(jié)構(gòu),以滿足不同的文檔生成需求。

官方GitHub地址:https://github.com/elapouya/python-docx-template

官方文檔地址:https://docxtpl.readthedocs.io/en/latest/

簡(jiǎn)單來說:就是創(chuàng)建一個(gè)類似Jinja2語(yǔ)法的模板文檔,然后往里面動(dòng)態(tài)填充內(nèi)容就可以了

安裝:

pip3 install docxtpl

1.3. 基礎(chǔ)使用

from docxtpl import DocxTemplate
doc = DocxTemplate("test.docx")
context = {'whoami': "d4m1ts"}
doc.render(context)
doc.save("generated_doc.docx")

其中,test.docx內(nèi)容如下:

生成后的結(jié)果如下:

1.4. 案例介紹

1.4.1. 需求假設(shè)

寫一份不考慮美觀的漏掃報(bào)告,需要有統(tǒng)計(jì)結(jié)果圖和漏洞詳情,每個(gè)漏洞包括漏洞名、漏洞地址、漏洞等級(jí)、漏洞危害、復(fù)現(xiàn)過程、修復(fù)建議六個(gè)部分。

1.4.2. 模板文檔準(zhǔn)備

編寫的模板文檔如下,使用到了常見的iffor、賦值等,保存為template.docx,后續(xù)只需要向里面填充數(shù)據(jù)即可。

1.4.3. 數(shù)據(jù)結(jié)構(gòu)分析

傳入數(shù)據(jù)需要一串json字符串,因此我們根據(jù)模板文檔梳理好json結(jié)構(gòu),然后傳入即可。

梳理好的數(shù)據(jù)結(jié)構(gòu)如下:

{
  "餅圖": "111",
  "柱狀圖": "222",
  "漏洞簡(jiǎn)報(bào)": [
    {
      "漏洞名": "測(cè)試漏洞名1",
      "漏洞等級(jí)": "高危"
    }
  ],
  "漏洞詳情": [
    {
      "漏洞名": "測(cè)試漏洞名1",
      "漏洞地址": "http://blog.gm7.org/",
      "漏洞等級(jí)": "高危",
      "漏洞危害": "危害XXX",
      "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
      "修復(fù)建議": "更新到最新版本即可"
    }
  ]
}

編寫代碼測(cè)試一下可行性:

from docxtpl import DocxTemplate
doc = DocxTemplate("template.docx")
context = {
      "餅圖": "111",
      "柱狀圖": "222",
      "漏洞簡(jiǎn)報(bào)": [
        {
          "漏洞名": "測(cè)試漏洞名1",
          "漏洞等級(jí)": "高危"
        },
        {
          "漏洞名": "測(cè)試漏洞名2",
          "漏洞等級(jí)": "嚴(yán)重"
        },
        {
          "漏洞名": "測(cè)試漏洞名2",
          "漏洞等級(jí)": "中危"
        }
      ],
      "漏洞詳情": [
        {
          "漏洞名": "測(cè)試漏洞名1",
          "漏洞地址": "http://blog.gm7.org/",
          "漏洞等級(jí)": "高危",
          "漏洞危害": "危害XXX",
          "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
          "修復(fù)建議": "更新到最新版本即可"
        },
        {
          "漏洞名": "測(cè)試漏洞名2",
          "漏洞地址": "http://bblog.gm7.org/",
          "漏洞等級(jí)": "嚴(yán)重",
          "漏洞危害": "危害XXX",
          "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
          "修復(fù)建議": "更新到最新版本即可"
        },
        {
          "漏洞名": "測(cè)試漏洞名3",
          "漏洞地址": "http://cblog.gm7.org/",
          "漏洞等級(jí)": "中危",
          "漏洞危害": "危害XXX",
          "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
          "修復(fù)建議": "更新到最新版本即可"
        }
      ]
    }
doc.render(context)
doc.save("generated_doc.docx")

很好,達(dá)到了預(yù)期的效果。

1.4.4. 加入圖表

在上面的過程中,內(nèi)容幾乎是沒問題了,但是圖表還是沒有展示出來。生成圖表我們使用plotly這個(gè)庫(kù),并將生成內(nèi)容寫入ByteIO。

相關(guān)代碼如下:

import plotly.graph_objects as go
from io import BytesIO
def generatePieChart(title: str, labels: list, values: list, colors: list):
    """
    生成餅圖
    https://juejin.cn/post/6911701157647745031#heading-3
    https://juejin.cn/post/6950460207860449317#heading-5
    :param title: 餅圖標(biāo)題
    :param labels: 餅圖標(biāo)簽
    :param values:  餅圖數(shù)據(jù)
    :param colors:  餅圖每塊的顏色
    :return:
    """
    # 基礎(chǔ)餅圖
    fig = go.Figure(data=[go.Pie(
        labels=labels,
        values=values,
        hole=.4,  # 中心環(huán)大小
        insidetextorientation="horizontal"
    )])
    # 更新顏色
    fig.update_traces(
        textposition='inside',  # 文本顯示位置
        hoverinfo='label+percent',  # 懸停信息
        textinfo='label+percent', # 餅圖中顯示的信息
        textfont_size=15,
        marker=dict(colors=colors)
    )
    # 更新標(biāo)題
    fig.update_layout(
        title={   # 設(shè)置整個(gè)標(biāo)題的名稱和位置
            "text": title,
            "y": 0.96,  # y軸數(shù)值
            "x": 0.5,  # x軸數(shù)值
            "xanchor": "center",  # x、y軸相對(duì)位置
            "yanchor": "top"
        }
    )
    image_io = BytesIO()
    fig.write_image(image_io, format="png")
    return image_io
def generateBarChart(title: str, x: list, y: list):
    """
    生成柱狀圖
    https://cloud.tencent.com/developer/article/1817208
    https://blog.csdn.net/qq_25443541/article/details/115999537
    https://blog.csdn.net/weixin_45826022/article/details/122912484
    :param title: 標(biāo)題
    :param x: 柱狀圖標(biāo)簽
    :param y:  柱狀圖數(shù)據(jù)
    :return:
    """
    # x軸長(zhǎng)度最為18
    b = x
    x = []
    for i in b:
        if len(i) >= 18:
            x.append(f"{i[:15]}...")
        else:
            x.append(i)
    # 基礎(chǔ)柱狀圖
    fig = go.Figure(data=[go.Bar(
        x=x,
        y=y,
        text=y,
        textposition="outside",
        marker=dict(color=["#3498DB"] * len(y)),
        width=0.3
    )])
    # 更新標(biāo)題
    fig.update_layout(
        title={  # 設(shè)置整個(gè)標(biāo)題的名稱和位置
            "text": title,
            "y": 0.96,  # y軸數(shù)值
            "x": 0.5,  # x軸數(shù)值
            "xanchor": "center",  # x、y軸相對(duì)位置
            "yanchor": "top"
        },
        xaxis_tickangle=-45,  # 傾斜45度
        plot_bgcolor='rgba(0,0,0,0)'  # 背景透明
    )
    fig.update_xaxes(
        showgrid=False
    )
    fig.update_yaxes(
        zeroline=True,
        zerolinecolor="#17202A",
        zerolinewidth=1,
        showgrid=True,
        gridcolor="#17202A",
        showline=True
    )
    image_io = BytesIO()
    fig.write_image(image_io, format="png")
    return image_io

1.4.5. 最終結(jié)果

要插入圖片內(nèi)容,代碼語(yǔ)法如下:

myimage = InlineImage(tpl, image_descriptor='test_files/python_logo.png', width=Mm(20), height=Mm(10))

完整代碼如下:

from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm
import plotly.graph_objects as go
from io import BytesIO
def generatePieChart(title: str, labels: list, values: list, colors: list):
    """
    生成餅圖
    https://juejin.cn/post/6911701157647745031#heading-3
    https://juejin.cn/post/6950460207860449317#heading-5
    :param title: 餅圖標(biāo)題
    :param labels: 餅圖標(biāo)簽
    :param values:  餅圖數(shù)據(jù)
    :param colors:  餅圖每塊的顏色
    :return:
    """
    # 基礎(chǔ)餅圖
    fig = go.Figure(data=[go.Pie(
        labels=labels,
        values=values,
        hole=.4,  # 中心環(huán)大小
        insidetextorientation="horizontal"
    )])
    # 更新顏色
    fig.update_traces(
        textposition='inside',  # 文本顯示位置
        hoverinfo='label+percent',  # 懸停信息
        textinfo='label+percent',  # 餅圖中顯示的信息
        textfont_size=15,
        marker=dict(colors=colors)
    )
    # 更新標(biāo)題
    fig.update_layout(
        title={  # 設(shè)置整個(gè)標(biāo)題的名稱和位置
            "text": title,
            "y": 0.96,  # y軸數(shù)值
            "x": 0.5,  # x軸數(shù)值
            "xanchor": "center",  # x、y軸相對(duì)位置
            "yanchor": "top"
        }
    )
    image_io = BytesIO()
    fig.write_image(image_io, format="png")
    return image_io
def generateBarChart(title: str, x: list, y: list):
    """
    生成柱狀圖
    https://cloud.tencent.com/developer/article/1817208
    https://blog.csdn.net/qq_25443541/article/details/115999537
    https://blog.csdn.net/weixin_45826022/article/details/122912484
    :param title: 標(biāo)題
    :param x: 柱狀圖標(biāo)簽
    :param y:  柱狀圖數(shù)據(jù)
    :return:
    """
    # x軸長(zhǎng)度最為18
    b = x
    x = []
    for i in b:
        if len(i) >= 18:
            x.append(f"{i[:15]}...")
        else:
            x.append(i)
    # 基礎(chǔ)柱狀圖
    fig = go.Figure(data=[go.Bar(
        x=x,
        y=y,
        text=y,
        textposition="outside",
        marker=dict(color=["#3498DB"] * len(y)),
        width=0.3
    )])
    # 更新標(biāo)題
    fig.update_layout(
        title={  # 設(shè)置整個(gè)標(biāo)題的名稱和位置
            "text": title,
            "y": 0.96,  # y軸數(shù)值
            "x": 0.5,  # x軸數(shù)值
            "xanchor": "center",  # x、y軸相對(duì)位置
            "yanchor": "top"
        },
        xaxis_tickangle=-45,  # 傾斜45度
        plot_bgcolor='rgba(0,0,0,0)'  # 背景透明
    )
    fig.update_xaxes(
        showgrid=False
    )
    fig.update_yaxes(
        zeroline=True,
        zerolinecolor="#17202A",
        zerolinewidth=1,
        showgrid=True,
        gridcolor="#17202A",
        showline=True
    )
    image_io = BytesIO()
    fig.write_image(image_io, format="png")
    return image_io
doc = DocxTemplate("template.docx")
context = {
    "餅圖": InlineImage(doc, image_descriptor=generatePieChart(
        title="漏洞數(shù)量",
        labels=["嚴(yán)重", "高危", "中危", "低危"],
        values=[1, 1, 1, 0],
        colors=["#8B0000", "red", "orange", "aqua"]
    ), width=Mm(130)),
    "柱狀圖": InlineImage(doc, image_descriptor=generateBarChart(
        title="漏洞類型",
        x=["測(cè)試漏洞名1", "測(cè)試漏洞名2", "測(cè)試漏洞名3"],
        y=[1, 1, 1]
    ), width=Mm(130)),
    "漏洞簡(jiǎn)報(bào)": [
        {
            "漏洞名": "測(cè)試漏洞名1",
            "漏洞等級(jí)": "高危"
        },
        {
            "漏洞名": "測(cè)試漏洞名2",
            "漏洞等級(jí)": "嚴(yán)重"
        },
        {
            "漏洞名": "測(cè)試漏洞名2",
            "漏洞等級(jí)": "中危"
        }
    ],
    "漏洞詳情": [
        {
            "漏洞名": "測(cè)試漏洞名1",
            "漏洞地址": "http://blog.gm7.org/",
            "漏洞等級(jí)": "高危",
            "漏洞危害": "危害XXX",
            "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
            "修復(fù)建議": "更新到最新版本即可"
        },
        {
            "漏洞名": "測(cè)試漏洞名2",
            "漏洞地址": "http://bblog.gm7.org/",
            "漏洞等級(jí)": "嚴(yán)重",
            "漏洞危害": "危害XXX",
            "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
            "修復(fù)建議": "更新到最新版本即可"
        },
        {
            "漏洞名": "測(cè)試漏洞名3",
            "漏洞地址": "http://cblog.gm7.org/",
            "漏洞等級(jí)": "中危",
            "漏洞危害": "危害XXX",
            "復(fù)現(xiàn)過程": "先xxx,再xxx,最后xxx",
            "修復(fù)建議": "更新到最新版本即可"
        }
    ]
}
doc.render(context)
doc.save("generated_doc.docx")

結(jié)果如下:

以上就是Python快速生成定制化的Word文檔的詳細(xì)內(nèi)容,更多關(guān)于Python生成定制化Word的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PYQT5 vscode聯(lián)合操作qtdesigner的方法

    PYQT5 vscode聯(lián)合操作qtdesigner的方法

    這篇文章主要介紹了PYQT5 vscode聯(lián)合操作qtdesigner的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程

    以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程

    這篇文章主要介紹了以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程,主要基于NMF主題模型,需要的朋友可以參考下
    2015-04-04
  • 弄懂這56個(gè)Python使用技巧(輕松掌握Python高效開發(fā))

    弄懂這56個(gè)Python使用技巧(輕松掌握Python高效開發(fā))

    這篇文章主要介紹了弄懂這56個(gè)Python使用技巧(輕松掌握Python高效開發(fā)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-09-09
  • 用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例

    用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例

    大家好,本篇文章主要講的是用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • python雙向鏈表實(shí)現(xiàn)實(shí)例代碼

    python雙向鏈表實(shí)現(xiàn)實(shí)例代碼

    python雙向鏈表和單鏈表類似,只不過是增加了一個(gè)指向前面一個(gè)元素的指針,下面的代碼實(shí)例了python雙向鏈表的方法
    2013-11-11
  • Python Pandas實(shí)現(xiàn)DataFrame合并的圖文教程

    Python Pandas實(shí)現(xiàn)DataFrame合并的圖文教程

    我們?cè)谑褂胮andas處理數(shù)據(jù)的時(shí)候,往往會(huì)需要合并兩個(gè)或者多個(gè)DataFrame的操作,下面這篇文章主要給大家介紹了關(guān)于Pandas實(shí)現(xiàn)DataFrame合并的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • python打印exception信息的方法

    python打印exception信息的方法

    這篇文章主要介紹了python打印exception信息的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Python報(bào)錯(cuò)TypeError: ‘dict‘ object is not iterable的解決方法

    Python報(bào)錯(cuò)TypeError: ‘dict‘ object is not&

    在Python開發(fā)的旅程中,報(bào)錯(cuò)信息就像是一個(gè)個(gè)路障,阻礙著我們前進(jìn)的步伐,而“TypeError: ‘dict’ object is not iterable”這個(gè)報(bào)錯(cuò),常常讓開發(fā)者們陷入困惑,那么,這個(gè)報(bào)錯(cuò)究竟是怎么產(chǎn)生的呢?又該如何有效地解決它呢?讓我們一起深入探討,找到解決問題的方法
    2024-10-10
  • 利用Python函數(shù)實(shí)現(xiàn)一個(gè)萬(wàn)歷表完整示例

    利用Python函數(shù)實(shí)現(xiàn)一個(gè)萬(wàn)歷表完整示例

    這篇文章主要給大家介紹了關(guān)于如何利用Python函數(shù)實(shí)現(xiàn)一個(gè)萬(wàn)歷表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 基于Python和TFIDF實(shí)現(xiàn)提取文本中的關(guān)鍵詞

    基于Python和TFIDF實(shí)現(xiàn)提取文本中的關(guān)鍵詞

    TFIDF 的工作原理是按比例增加一個(gè)詞語(yǔ)在文檔中出現(xiàn)的次數(shù),但會(huì)被它所在的文檔數(shù)量抵消。本文將利用TFIDF實(shí)現(xiàn)提取文本中的關(guān)鍵詞,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2022-04-04

最新評(píng)論

宿州市| 慈利县| 山阴县| 福泉市| 平陆县| 新昌县| 乡宁县| 通榆县| 西藏| 嵩明县| 开江县| 察哈| 辽中县| 略阳县| 佛坪县| 桃源县| 张家口市| 温宿县| 甘洛县| 忻城县| 石首市| 西盟| 吴忠市| 乐昌市| 七台河市| 茂名市| 涿鹿县| 石楼县| 张家港市| 常德市| 通化县| 海原县| 库伦旗| 弥渡县| 环江| 禄丰县| 嘉荫县| 通辽市| 沙河市| 五大连池市| 乐都县|