Python 第三方庫之 docxtpl (處理word文檔)

項目官方文檔

項目官方git

docxtpl 軟件包使用兩個主要軟件包:

  • python docx,用于讀取、寫入和創建子文檔
  • jinja2用于管理插入到模板docx中的標記。jinja官網,?jinja中文網站

簡單示例

from docxtpl import DocxTemplatetpl = DocxTemplate('test.docx')context = {'template': '123'
}tpl.render(context)
tpl.save('test1.docx')

安裝

pip install docxtpl


導言

python-docx-template被開發出來,是因為python-docx的強大在于創建文檔,而不是修改它們。

這個想法是開始于創建一個需要用MicrosoftWord生成的文檔的示例,它可以像我們想要的那樣復雜:如圖片、索引表、頁腳、頁眉、變量,以及我們可以用Word做的任何事情。然后,當我們使用MicrosoftWord編輯文檔時,直接在文檔中插入類似于Jinja 2的標記。將文檔保存為.docx文件(XML格式):它將是.docx模板文件。

現在,我們可以使用python-docx-template從這個.docx模板和將關聯的上下文變量生成您想要的多個Word文檔。

注意:python-docx-template是測試的是MS Word 97格式,它可能不適用于其他版本.

Jinja 2類語法

因Jinja 2包被使用,可以使用Word文檔中的所有Jinja 2標記和過濾器。然而,要使它在Word文檔中工作,進行了些限制和擴展:

限制

通常的Jinja 2標簽,只能在同一個段落的同一個‘’run’中使用,它不能跨幾個段落使用,表行、‘run’。如果您想要管理段落、表行和整個‘run’的樣式,您必須使用特殊的標記語法,如下一章所述。

注意:MicrosoftWord的“Run”是一個具有相同風格的字符序列。例如,如果您創建一個具有相同風格的所有字符的段落:Word將在內部創建一個段落中的“Run”。現在,如果你在這段中間加了一個粗體,單詞會把前面的“Run”轉換成3‘Run’(普通-粗體-正常)。

擴展

為了管理段落、表行、表列、run,必須使用特殊的語法。(區別于jinja2)

{%p jinja2_tag %} for paragraphs
{%tr jinja2_tag %} for table rows
{%tc jinja2_tag %} for table columns
{%r jinja2_tag %} for runs

通過使用這些標記,python-docx-template將真正的Jinja 2標記放入文檔的XML源代碼中的正確位置。此外,這些標記還告訴python-docx-template移除位于開始和結束標記的位置的段落、表行、表列或run,只注意中間的位置。

重要*不要使用2次{%p, {%tr、`{%tc‘、{%r在同一段落、行、列或run中。例子:

不要用這個

{%p if display_paragraph %}Here is my paragraph {%p endif %}

而是使用

{%p if display_paragraph %}
Here is my paragraph
{%p endif %}

這種語法是可能是因為Microsoft word將每一行都看作是一個新的段落,{%p標簽不在同一段中

顯示變量

作為Jinja 2的一部分,可以使用雙括弧:{{ <var> }}。但如果 <var> 是RichText對象,必須指定要更改實際的“Run”。{{r <var> }}注意’r緊跟左括弧。

重要*不要使用?r?變量出現在模板中,因為{{r}} 可以解釋為 {{r 沒有指定變量。不過,您可以使用以‘r’開頭的更大的變量名。例如{{render_color}}將被解釋為{{ render_color }}不像{{r ender_color}}.

重要*不要使用2次 {{r 在同一run上。使用RichText.add()方法在python端連接多個字符串和樣式,并且只有一個字符串和樣式 {{r 在模板邊。

單元格顏色

當您想要更改表格單元格的背景色時,有一種特殊情況,您必須在單元格的開頭放置以下標記

{% cellbg <var> %}

<var>必須包含顏色的十六進制代碼無散列符號

列跨越

如果您想在多個列上動態地跨越一個表單元格(當您有一個具有動態列計數的表時,這是很有用的),您必須在單元格的最開始處放置下面的標記來跨越

{% colspan <var> %}

<var>必須包含要跨越的列數的整數。有關示例,請參見下一篇示例操作

Escaping

為了展示{%, %}, {{或}},你可以用

{%, %}, {{ or }}

RichText

當你使用{{ <var> }}標記,它將被包含在 var 變量的字符串替換。但它將保持目前的格式。如果要添加動態變化的樣式,則必須同時使用以下兩種方式:{{r <var> }}標簽一個 RichText對象在 var 變量。您可以更改顏色、粗體、斜體、大小等,但最好的方法是使用microsoft word來定義自己的字符樣式(主頁選項卡->修改樣式->管理樣式按鈕->新建樣式,在窗體中選擇“字符樣式”),請參見tests/richtext.py,除了使用RichText(),您可以使用它的快捷方式:R()

重要*當你使用{{r }}它從docx模板中移除當前字符樣式,這意味著如果你沒有在RichText()設置字體樣式,樣式將返回到Microsoft Word默認樣式。這只會影響字符樣式,而不會影響段落樣式(MSWord管理的這2種樣式)。

可以通過Richtext將超鏈接添加到文本中。

tpl=DocxTemplate(‘your_template.docx’)
rt = RichText('You can add an hyperlink, here to ')
rt.add(‘google’,url_id=tpl.build_url_id(‘http://google.com’))

將rt放在您的語境中,然后使用{{r rt}}在你的模板中

內嵌圖像

您可以動態地將一個或多個圖像添加到文檔中(使用JPEG和PNG文件進行測試)。只要在你的模板中加上{{ <var> }},標記<var>是doxtpl.inlineImage的實例。

myimage=InlineImage(tpl,‘test_files/python_logo.png’,width=Mm(20))

您只需指定模板對象、圖像文件路徑和可選寬度和/或高度即可。對于高度和寬度,您必須使用毫米(毫米),英寸(英寸)或點(Pt)類。有關示例,請參見test/inlineImage.py。

子文件

模板變量可以包含使用python-docxWord文檔從頭開始構建的復雜變量。為此,首先從模板對象獲取子文檔對象,并將其用作python-docx文檔對象,參見tests/subdoc.py.

轉義,換行符,新段落,列表
當您使用{{ <var> }},您正在修改XMLWord文檔,這意味著您不能使用所有字符,特別是<, >和&。為了使用它們,你必須轉義它們。有四種方式:

context = { ‘var’:R(‘my text’) }和在模板中{{r <var> }}(注意r),
context = { ‘var’:‘my text’}和在模板中{{ <var>|e }}
context = { ‘var’:escape(‘my text’)}和在模板中{{ <var> }}。
在調用呈現方法時啟用自動轉義:tpl.render(context, autoescape=True)(默認值autoescape=false)
RichText()或R()提供換行符和新段落功能:只需使用\n或\a在文本中,它們將作相應的轉換。

有關更多信息,請參見tests/escape.py?。

另一個解決方案,如果要將列表包含到文檔中,即轉義文本并管理n和a,則可以使用’Listing’ class:

在python代碼中

context = { 'mylisting':Listing('the listing\nwith\nsome\nlines \a and some paragraph \a and special chars : <>&') }

在docx模板中只需使用{{ mylisting }}帶著Listing(),您將保持當前字符的樣式(除非在一個\a之后你開始新的一段落)。

替換docx圖片

在頁眉/頁腳中動態添加圖像是不可能的,但您可以更改它們。這樣做的目的是在模板中放置一個虛擬圖片,像往常一樣渲染模板,然后用另一個模板替換虛擬圖片。你可以同時為所有媒體做到這一點。Note1:縱橫比將與替換的圖像相同 Note 2:指定用于在docx模板中插入圖像的文件名(只要其basename,而不是完整路徑)。

替換dummy_header_pic.jpg的語法:

tpl.replace_pic('dummy_header_pic.jpg','header_pic_i_want.jpg')

替換發生在頁眉、頁腳和整個文檔正文中。

替換docx媒體

在頁眉/頁腳中動態添加圖片以外的其他媒體是不可能的,但您可以更改它們。這樣做的目的是在模板中放置一個虛擬媒體,像往常一樣呈現模板,然后用另一個模板替換虛擬媒體。你可以同時為所有媒體做到這一點。注意:對于圖像,高寬比將與替換的圖像注釋2相同:重要的是要有源媒體文件,因為它們需要計算它們的CRC才能在docx中找到它們。(虛擬文件名不重要)

替換dummy_header_pic.jpg的語法:

tpl.replace_media('dummy_header_pic.jpg','header_pic_i_want.jpg')

警告:與replace_pic() 方法不同,dummy_header_pic.jpg 必須存在模板目錄中,當在渲染和保存生成docx時。它必須與手動插入在docx模板的文件相同。替換可以發生在頁眉、頁腳和整個文檔正文中。

替換嵌入對象

它的工作方式類似于媒體替換,只是它適用于嵌入式docx這樣的嵌入式對象。

替換embedded_dummy.docx的語法:

tpl.replace_embedded('embdded_dummy.docx','embdded_docx_i_want.docx')

警告:與REPLE_PIC()方法不同,embdded_dumy.docx必須存在于模板目錄中,在渲染和保存生成的docx時。它必須與手動插入docx模板的文件相同。替換發生在頁眉、頁腳和整個文檔正文中。

Microsoft Word 2016特例

MS Word 2016將忽略表格的 \t。這對這個版本來說是特別的。但是LibreOffice或Wordpad沒有這個問題。對于以jinja2標記產生空格來開頭的行,也會出現同樣的情況:它們將被忽略。要解決這些問題,解決方案是使用Richtext:

tpl.render({'test_space_r' : RichText('          '),'test_tabs_r': RichText(5*'\t'),
})

在模板中,使用 {r 表示法:

{{r test_space_r}} Spaces will be preserved
{{r test_tabs_r}} Tabs will be displayed

表格

可以兩種方式水平地跨表格單元格,一是利用colspan標記(請參閱tests/dynamic_table.py):

{% colspan %}

或者在for循環中(請參閱tests/horizontal_merge.py)):

{% hm %}

還可以在for循環中垂直合并單元格(請參閱 tests/vertical_merge.py):

{% vm %}

Jinja自定義過濾器

render() 接受 jinja_env 選項參數:您可以傳遞一個jinja環境對象。通過這種方式,您可以添加一些定制的jinja過濾器:

from docxtpl import DocxTemplate
import jinja2
def multiply_by(value, by):return value * bydoc = DocxTemplate("my_word_template.docx")
context = { 'price_dollars' : 5.00 }
jinja_env = jinja2.Environment()
jinja_env.filters['multiply_by'] = multiply_by
doc.render(context,jinja_env)
doc.save("generated_doc.docx")

然后在模板中,您將能夠使用

Euros price : {{ price_dollars|multiply_by(0.88) }}

例子

查看其工作原理的最佳方法是閱讀示例,它們位于 tests/ 目錄。Docx測試模板在tests/templates/目錄。要生成最終的docx文件:

cd tests/
python runtests.py

生成的文件位于tests/output 目錄。

想要真正學會對應包,趕緊自己下載,根據測試文件測試吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453929.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

域添加另一臺機器_巨杉Tech | SequoiaDB數據域概念解讀與實踐

近年來&#xff0c;銀行各項業務發展迅猛&#xff0c;客戶數目不斷增加&#xff0c;后臺服務系統壓力也越來越大&#xff0c;系統的各項硬件資源也變得非常緊張。因此&#xff0c;在技術風險可控的基礎上&#xff0c;希望引入大數據技術&#xff0c;利用大數據技術優化現有IT系…

Citrix XenServer 池要求

池要求 資源池是一臺或多臺服務器的同類或異類聚合&#xff0c;每個池最多包含 16 臺服務器。創建池或將服務器加入現有池前&#xff0c;應確保池中的所有服務器滿足下面介紹的要求。 硬件要求 XenServer 資源池中的所有服務器必須具有廣泛兼容的 CPU&#xff0c;也就是說&…

推薦一個接口文檔工具

ShowDoc 轉載于:https://www.cnblogs.com/LW-baiyun/p/8003975.html

自動轉換flv文件

在線轉化.誰有 把其他的視頻文件格式的視頻,經過上傳自動轉化FLV格式的一種插件.提供編程接口.給我一份.類似新浪網播客上傳視頻的一樣. (還有上傳是的哪個效果,進度條如何作的?)或者給我個參考地址什 ... 環境&#xff1a;redhat as41。首先獲取ffmpeg很多人找不到怎么下載,其…

云計算的概念_云計算概念掀起漲停潮 美利云奠定板塊龍頭地位

溫馨提示&#xff1a;股市風險時刻存在&#xff0c;文中所提個股僅為個人觀點&#xff0c;請勿盲目跟隨操作&#xff0c;筆者希望大家都做到不貪婪&#xff0c;不恐懼&#xff0c;不瞎猜&#xff0c;不跟風做一個紀律嚴明輕松淡定的股票交易者。社4月26日訊&#xff0c;滬深兩市…

Python 第三方模塊之 PDFMiner(pdf信息提取)

PDFMiner簡介 pdf提取目前的解決方案大致只有pyPDF和PDFMiner。據說PDFMiner更適合文本的解析&#xff0c;首先說明的是解析PDF是非常蛋疼的事&#xff0c;即使是PDFMiner對于格式不工整的PDF解析效果也不怎么樣&#xff0c;所以連PDFMiner的開發者都吐槽PDF is evil. 不過這些…

TFS2017持續發布中調用PowerShell啟停遠程應用程序

目前團隊項目中有多個Web、服務以及與大數據平臺對接接口等應用&#xff0c;每次的發布和部署采用手工的方式進行。停止應用程序&#xff0c;拷貝發布包&#xff0c;啟動應用程序&#xff0c;不停的循環著&#xff0c;并且時不時地會出現一些人為錯誤性問題。這種模式消耗的很多…

Flask 多線程

參數 app.run()中可以接受兩個參數&#xff0c;分別是threaded和processes&#xff0c;用于開啟線程支持和進程支持。 threaded&#xff1a; 是否開啟多線程&#xff0c;默認不開啟。 if __name__ __main__:app.run(threadedTrue)processes&#xff1a;進程數量&#xff0c…

40天python入門教程_Python入門教程超詳細1小時學會Python

Java和Javascript,不用1小時你就可以用Python快速流暢地寫有用的Python程序.為什么使用Python假設我們有這么一項任務:簡單測試局域網中的電腦是否連通.這些電腦的ip范圍從192.168.0.101到192.168.0.200.思路:用shell編程.(Linux通常是bash而Windows是批處理腳本).例如,在Windo…

基于LVS對LAMP做負載均衡集群

一、簡介 LVS是Linux Virtual Server的簡稱&#xff0c;也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目&#xff0c;它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分&#xff0c;在Linux2.4內核以前&#xff0c;使用LVS時必須要…

Python_Day1

1、猜年齡游戲&#xff1a; &#xff08;1&#xff09;&#xff1a;每循環3次&#xff0c;counter值返回為0&#xff0c;重新開始循環&#xff1b;&#xff08;2&#xff09;&#xff1a;continue 意思是跳出當前循環&#xff1b;&#xff08;3&#xff09;&#xff1…

kafka 入門

初識 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司開發的&#xff0c;它是一個分布式的&#xff0c;支持多分區、多副本&#xff0c;基于 Zookeeper 的分布式消息流平臺&#xff0c;它同時也是一款開源的 基于發布訂閱模式的消息引擎系統。 Kafka 的基本術語 消息&#xf…

實體詞典 情感詞典_tidytextpy包 | 對三體進行情感分析

騰訊課堂 | Python網絡爬蟲與文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析庫 但是tidytext不夠完善&#xff0c;我在tidytext基礎上增加了情感詞典&#xff0c;可以進行情感計算&#xff0c;為了區別前者&#xff0c;將其命名為tidytextpy。大家有時間…

TensorFlow實現LeNet5模型

# -*- coding: utf-8 -*-import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 獲取mnist數據mnist input_data.read_data_sets("MNIST_data/", one_hotTrue)# 注冊默認session 后面操作無需指定session 不同sesson之間的數據是獨立…

Python基礎第一天

一、內容 二、練習 練習1 題目&#xff1a;使用while循環輸出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 圖示&#xff1a; 代碼&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1輸出結果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

python flask 上傳下載 api_Flask 文件下載API

給前端提供一個文件下載接口時, 遇到了文件名亂碼的問題, 幾經折騰總算實現效果, 代碼如下:import requestsfrom flask import Response, jsonify, request, stream_with_contextfrom flask_login import login_requiredfrom . import bpfrom .models import Coursewarebp.rout…

OpenGL實用開源代碼列表

有了網絡的最大好處就是可以資源共享。網絡是最大的知識庫&#xff0c;也是最好的老師&#xff0c;正所謂“沒有你想不到的&#xff0c;只有你找不到的”。以下是我收集的以游戲編程&#xff0c;OpenGL 3D編程相關的免費擴展庫資料。不斷更新中&#xff0c;如果你有好的建義&am…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少個衛星&#xff0c;那么就是有 最多有S-1個通道&#xff01; 然后將最小生成樹中的后邊的 S-1通道去掉就行了&#xff01; 4…

python-kafka 常用 api 匯總

簡介 python連接kafka的標準庫&#xff0c;kafka-python和pykafka。kafka-python使用的人多是比較成熟的庫&#xff0c;kafka-python并沒有zk的支持。pykafka是Samsa的升級版本&#xff0c;使用samsa連接zookeeper&#xff0c;生產者直接連接kafka服務器列表&#xff0c;消費者…

scp選擇二進制_二進制傳輸與文本傳輸區別

Ftp&#xff0c;winscp等工具下載文件時候有選項&#xff0c;可選的有二進制方式和文本方式。文本方式又稱為ASCII方式兩者區別如下。ASCII 方式和BINARY方式的區別是回車換行的處理&#xff0c;binary方式不對數據執行任何處理&#xff0c;ASCII 方式將回車換行轉換為本機的回…