Python生成word


Python生成word

使用python-docx-template庫, 將html轉為word
python-docx-template可以使用類似jinja2的模板語法。
依賴docx庫, 安裝pip install docxtpl docx

docxtplpython-docx-template的引擎。

GitHub主頁https://github.com/elapouya/python-docx-template,上面有一些docx文件的模板使用示例,
Python文件的示例。

個人fork的主頁https://github.com/zZhaoLei/python-docx-template

使用示例, 和使用jinja2替換的方式差不多。

from docxtpl import DocxTemplate
from docx.shared import Mm

doc = DocxTemplate("my_word_template.docx")
context = { 'company_name' : "World company" }
doc.render(context)
doc.save("generated_doc.docx")

Mm是毫米, 官方規定for height and width you have to use millimeters (Mm), inches or points(Pt) class

圖片的添加

使用InlineImage

from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm

doc = DocxTemplate("my_word_template.docx")

context = {
    'image': InlineImage(doc, path, width=Mm(30))
}
doc.render(context)
doc.save("generated_doc.docx")

path可以是路徑, 也可以是文件對象, width可以設置寬度或用heigth設置高度

使用xml生成word

先使用微軟的office新建空白文檔, 調整模板, 設置樣式等.

最后另存為xml格式的文件, 使用sublime進行格式化, 需要安裝xml格式化插件Indent XML

安裝sublime后, 使用ctrl+~調出命令, Sublime 3粘貼

import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

sublime 2粘貼

import urllib2,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

r然后通過Preferences-->Package Control-->Install Package, 在彈出的框中輸入Indent XML, 點擊就會自動安裝.

使用Esc鍵可以關閉安裝窗口.

Selection-->Format中選擇Indent XML, 保存.

現在可以查找想要進行模板替換的位置了, 使用jinja2的模板語法。

Python代碼示例

# -*- coding:utf-8 -*-
from __future__ import unicode_literals
import jinja2

path = 'C:/Users/lei/Desktop/project/export/doc/'
fsl = jinja2.FileSystemLoader(searchpath=path)

env = jinja2.Environment(loader=fsl)
tpl = env.get_template("test.xml")

data = {
    'name': '這是一個測試',
    'ip': '10.10.10.66',
    'status': '正在進行中......',
    'start_time': '2018-3-28',
    'end_time': '2018-3-29',
    'time': '2018-3-29 123213212321',
    'num': '10000000'
}
with open(path + "test.doc", 'w') as f:
    f.write(tpl.render(data = data).encode('utf-8'))

我這里直接在word中新建的空白文檔, 修改后直接保存為了Word XML, 不能寫入為docx, 只能寫入為doc.

docx是有目錄結構的壓縮包, doc沒有目錄結構.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM