from docxtpl import DocxTemplate from yaml import load doc = DocxTemplate('syllabus-template.docx') context = load(open('syllabus.yaml')) file_name = '-'.join('{} {}'.format(context['code'], context['title']).split()) doc.render(context) doc.save('{}.docx'.format(file_name))
""" Return absolute path based on the current script. """ if not path: return path return os.path.join(os.path.dirname(sys.argv[0]), path) # ---------------------------------------------------------------------------- # Main code # ---------------------------------------------------------------------------- if __name__ == '__main__': template_path = get_full_path(r'template.docx') generated_path = get_full_path(r'generated.docx') context_path = get_full_path(r'inject.json') # Open document doc = DocxTemplate(template_path) # Read context replacements = read_json(context_path) # Replace variable context = copy.copy(replacements['variables']) # Replace images for image, data in replacements['images'].items(): context[image] = InlineImage(doc, data[0], width=Mm(data[1])) # Replace URLs for url, data in replacements['urls'].items(): rt = RichText() rt.add(data[0], url_id=doc.build_url_id(data[1]))
# from jinja2 import Environment, FileSystemLoader ################### example1 ############################ # file_loader = jinja2.FileSystemLoader('templates') # env = jinja2.Environment(loader=file_loader) # template = env.get_template('hello_world.txt') # content = {'name': 'Yoni', 'lastname': 'gg'} # output = template.render(data=content) # print(output) ################## example 2 ############################# doc = DocxTemplate("Fishman_Daily_Check_FORMAT.docx") # Where the magic happens rt = RichText() # rt.add("\u2713", color='#008000') rt.add("\u2717", color='#FF0000') context = { "current_date": "01/01/20", "DC2008": rt, "MEGA_PDC": rt, "Newdc": rt, "Cluster": rt, "ESXi01": rt, "ESXi02": rt, "ESXi03": rt,
places=2, int_units=((u'рубль', u'рубля', u'рублей'), 'm'), exp_units=((u'копейка', u'копейки', u'копеек'), 'f')): value = decimal.Decimal(value) q = decimal.Decimal(10)**-places integral, exp = str(value.quantize(q)).split('.') return u'{} {}'.format(num2text(int(integral), int_units), num2text(int(exp), exp_units)) f = open('data.txt', 'r') data = f.readlines() f.close() doc = DocxTemplate("draft.docx") context = { 'bank': 'АО "Стоун банк" Г. МОСКВА', 'BIK': '044525700', 'N1': '30101810200000000700', 'N2': '40702810900000002453', 'INN': '7722737766', 'KPP': '772201001', 'dest':
# -*- coding: utf-8 -*- ''' Created : 2015-03-12 @author: Eric Lapouyade ''' from docxtpl import DocxTemplate from docx.shared import Inches tpl = DocxTemplate('templates/subdoc_tpl.docx') sd = tpl.new_subdoc() p = sd.add_paragraph('This is a sub-document inserted into a bigger one') p = sd.add_paragraph('It has been ') p.add_run('dynamically').style = 'dynamic' p.add_run(' generated with python by using ') p.add_run('python-docx').italic = True p.add_run(' library') sd.add_heading('Heading, level 1', level=1) sd.add_paragraph('This is an Intense quote', style='IntenseQuote') sd.add_paragraph('A picture :') sd.add_picture('templates/python_logo.png', width=Inches(1.25)) sd.add_paragraph('A Table :') table = sd.add_table(rows=1, cols=3) hdr_cells = table.rows[0].cells hdr_cells[0].text = 'Qty' hdr_cells[1].text = 'Id'
def post(self, request, *args, **kwargs): try: try: payload = JwtQueryParamAuthentication.authenticate( self, request)[0] except Exception as e: return Response({'status': 403, 'msg': '未登录', 'err': e.args}) form = request.data.get('form') # form = { # 'group_id': '', # 团队ID # 'experiment_id': '', # 实验ID # 'exDate': '', # 实验日期 格式为2021-4-1 # 'exPurpose': '', # 实验目的 # 'exSteps': '', # 实验步骤 # 'exResult': '', # 实验结果 # 'systemScore': '', # 系统评分 # 'exExperience': '', # 实验心得 # } # print(form['time']) groupName = Group.objects.filter(id=form['group_id']).first().name exName = experiment.objects.filter( id=form['experiment_id']).first().name groupNumberMsg = '' i = 1 for item in Student.objects.filter(group_id=form['group_id']): if i != 1: groupNumberMsg += '\n' role = item.role if item.role == None or item.role == '': role = '无' groupNumberMsg += '队员' + str( i ) + ':' + '姓名:' + item.name + ' 学院:' + item.college + ' 班级:' + item.class_name + ' 学号:' + item.stu_num + ' 承担角色:' + role i += 1 # 重复提交的实验报告时,覆盖之前的实验报告 report = Report.objects.filter( Q(experiment_id=form['experiment_id']) & Q(owner_id=form['group_id'])).first() if report: id = report.id base_dir = os.path.dirname( os.path.dirname(os.path.abspath(__file__))) # 项目根目录 length = len(base_dir) for i in range(length - 2, 0, -1): if base_dir[i] == '\\': base_dir = base_dir[0:i] break file_path = os.path.join(base_dir, 'static', 'report', report.url) # 下载文件的绝对路径 if os.path.isfile(file_path): # 判断下载文件是否存在 os.remove(file_path) report.delete() # 创建实验报告 # form['exDate'] # length = len(form['exDate']) year = 0 month = 0 day = 0 ff = 0 for item in form['exDate']: if item == '-': ff += 1 else: if ff == 0: year *= 10 year += int(item) elif ff == 1: month *= 10 month += int(item) elif ff == 2: day *= 10 day += int(item) # print(year,month,day) data_dic = { 'exName': exName, 'groupName': groupName, 'groupNumberMsg': groupNumberMsg, 'exPurpose': form['exPurpose'], 'exSteps': form['exSteps'], 'exResult': form['exResult'], 'systemScore': form['systemScore'], 'teacherScore': '未评分', 'teamEvaluationScore': '未评分', 'exExperience': form['exExperience'], 'year': year, 'month': month, 'day': day, } docxName = 'ex_' + form['experiment_id'] + '_' + form[ 'group_id'] + '.docx' base_dir = os.path.dirname( os.path.dirname(os.path.abspath(__file__))) # 项目根目录 length = len(base_dir) for i in range(length - 2, 0, -1): if base_dir[i] == '\\': base_dir = base_dir[0:i] break file_path = os.path.join(base_dir, 'static', 'report', 'tpl.docx') # 下载文件的绝对路径 file_path2 = os.path.join(base_dir, 'static', 'report', docxName) # 下载文件的绝对路径 doc = DocxTemplate(file_path) #加载模板文件 doc.render(data_dic) #填充数据 doc.save(file_path2) #保存目标文件 # print(type(form['group_id'])) report = Report(id=str(form['group_id']) + '_' + str(form['experiment_id']), system_score=form['systemScore'], teacher_score=-1, url=docxName, owner_id=form['group_id'], experiment_id=form['experiment_id']) report.save() experimentData1 = experimentData( report_id=report.id, exPurpose=form['exPurpose'], systemScore=form['systemScore'], exTime=form['exDate'], experiment_id=form['experiment_id'], group_id=form['group_id'], exExperience=form['exExperience'], exResult=form['exResult'], exSteps=form['exSteps']) experimentData1.save() # exExperience = request.data.get('exExperience') # data_dic = { # 'exName': '无人机集群编队三维模拟实验', # 'groupName': 'group2', # 'groupNumberMsg': '张三/计算机171/2020003/项目统筹\n王五/计算机174/2020012/算法研究', # 'exPurpose': '按照要求完成无人机编队及灯光设计。', # 'exSteps': '1.H型编队设计;\n2.H型变换Z型路线设计;\n3.夜间灯光设计;\n4.N型变换Z型。', # 'exResult': exResult, # 'systemScore': '87', # 'teacherScore': '未评分', # 'teamEvaluationScore': '未评分', # 'exExperience': exExperience, # 'year': '2021', # 'month': '3', # 'day': '10', # } # base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 项目根目录 # length = len(base_dir) # for i in range(length - 2,0,-1): # if base_dir[i] == '\\': # base_dir = base_dir[0:i] # break # file_path = os.path.join(base_dir, 'static','report', 'tpl.docx') # 下载文件的绝对路径 # file_path2 = os.path.join(base_dir, 'static','report', '2_group2_8.docx') # 下载文件的绝对路径 # doc = DocxTemplate(file_path) #加载模板文件 # doc.render(data_dic) #填充数据 # doc.save(file_path2) #保存目标文件 # report = Report(id='8',system_score=87,teacher_score=-1,url='2_group2_8.docx',owner_id=2,experiment_id=2) # report.save() return Response({ "status": 200, "msg": '返回成功', }) except Exception as e: return Response({'status': 204, 'msg': '遇到了异常错误', 'err': e.args})
from docxtpl import DocxTemplate from datetime import datetime from num2t4ru import num2text import math expansion = 'docx' filename = "template" input_file = f"{filename}.{expansion}" doc = DocxTemplate(input_file) nds = 20 sum = 532000.80 round_sum = '{0:,}'.format(int(sum)).replace(',', ' ') sum_kop = (math.floor(sum * 100) % 100) if sum_kop == 0: sum_kop = str(sum_kop) + '0' sum_nds = round(sum * nds / 100 / (1 + nds / 100), 2) sum_nds_kop = (math.floor(sum_nds * 100) % 100) if sum_nds_kop == 0: sum_nds_kop = str(sum_nds_kop) + '0' male_units = ((u'рубль', u'рубля', u'рублей'), 'm') female_units = ((u'копейка', u'копейки', u'копеек'), 'f') context = { 'ikz': "212621500152762150100100480000000244", 'work': "сантехнические и отделочные работы в кабинетах 3-го этажа", 'work_name': "Сантехнические и отделочные работы в кабинетах 3-го этажа", 'company_work': "Общество с ограниченной ответственностью «РПК СТРОЙ»", 'company_work_schief': "Генерального директора Кошелевой Светланы Евгеньевны", 'na_osnovanii': "Приказа №2 от 11.04.2019 г. с правом первой подписи", 'company_work_schief_sm': "С.Е. Кошелева", 'summ': f"{round_sum} ({num2text(sum, male_units).rsplit(' ', 1)[0]}) {num2text(sum, male_units).rsplit(' ', 1)[-1]} {sum_kop} {num2text(int(sum_kop), female_units).rsplit(' ', 1)[-1]}",
budgetary_responsibility = document.tables[0].rows[8].cells[3].text job_type = document.tables[0].rows[2].cells[1].text location = document.tables[0].rows[2].cells[3].text supervises = document.tables[0].rows[5].cells[3].text internally_relates_with = document.tables[0].rows[7].cells[1].text externally_relates_with = document.tables[0].rows[7].cells[3].text education_and_requirements = document.tables[0].rows[12].cells[ 0].text.strip().split('\n') new_doc = DocxTemplate("template.docx") context = { 'Job_title': Job_title, 'reports_to': reports_to, 'duties_and_responsiblities': duties_and_responsiblities, 'education_and_requirements': education_and_requirements, 'job_purpose': job_purpose, 'budgetary_responsibility': budgetary_responsibility, 'externally_relates_with': externally_relates_with, 'internally_relates_with': internally_relates_with, 'supervises': supervises } new_doc.render(context) new_doc.save('new_JDS/new_{}'.format(file))
from docxtpl import DocxTemplate doc = DocxTemplate( "C:/Users/furag/OneDrive/Рабочий стол/Python/Шаблоны/РЦК Деппром для прокуратуры11276-1-3.docx" ) context = { 'T1': "World company", 'T2': "World company", 'T3': "World company", 'T4': "World company", 'T5': "World company", 'T6': "World company", 'T7': "World company", 'T8': "World company", 'T9': "World company", 'T10': "World company", 'T11': "World company", 'T12': "World company", 'T13': "World company", 'T14': "World company", 'T15': "World company", 'T16': "World company", 'T17': "World company", } doc.render(context) doc.save( "C:/Users/furag/OneDrive/Рабочий стол/Python/Документы/generated_doc.docx")
from docxtpl import DocxTemplate tpl = DocxTemplate('test_files/dynamic_table_tpl.docx') context = { 'col_labels': ['fruit', 'vegetable', 'stone', 'thing'], 'tbl_contents': [ { 'label': 'yellow', 'cols': ['banana', 'capsicum', 'pyrite', 'taxi'] }, { 'label': 'red', 'cols': ['apple', 'tomato', 'cinnabar', 'doubledecker'] }, { 'label': 'green', 'cols': ['guava', 'cucumber', 'aventurine', 'card'] }, ] } tpl.render(context) tpl.save('test_files/dynamic_table.docx')
# -*- coding: utf-8 -*- import docx from docxtpl import DocxTemplate from docxtpl import Document from docx.shared import Inches tpl = DocxTemplate('test.docx') import re import json import collections sd = tpl.new_subdoc() sd.add_paragraph('Drug Table :') rows = 3 cols = 4 table = sd.add_table(rows=rows, cols=cols, style=None) # header cells = table.rows[0].cells cells[0].text = "Gene" cells[1].text = "Drug" cells[2].text = "Rank" cells[3].text = "Description" table.cell(1, 0).text = "ALK" table.cell(1, 1).text = "GENE1" table.cell(1, 2).text = "GENE2" table.cell(1, 3).text = "haha" # # #https://python-docx.readthedocs.io/en/latest/api/table.html#docx.table.Table.style # #merge
# -*- coding: utf-8 -*- ''' Created : 2015-03-26 @author: Eric Lapouyade ''' from docxtpl import DocxTemplate, RichText tpl = DocxTemplate('templates/richtext_and_if_tpl.docx') context = {'foobar': RichText('Foobar!', color='ff0000')} tpl.render(context) tpl.save('output/richtext_and_if.docx')
# -*- coding: utf-8 -*- ''' Created : 2015-03-12 @author: Eric Lapouyade ''' from docxtpl import DocxTemplate tpl=DocxTemplate('test_files/header_footer_tpl.docx') sd = tpl.new_subdoc() p = sd.add_paragraph('This is a sub-document to check it does not break header and footer') context = { 'title' : 'Header and footer test', 'company_name' : 'The World Wide company', 'date' : '2016-03-17', 'mysubdoc' : sd, } tpl.render(context) tpl.save('test_files/header_footer.docx')
# -*- coding: utf-8 -*- ''' Created : 2021-12-20 @author: Eric Lapouyade ''' from docxtpl import DocxTemplate tpl = DocxTemplate('templates/multi_rendering_tpl.docx') documents_data = [ { 'dest_file': 'multi_render1.docx', 'context': { 'title': 'Title ONE', 'body': 'This is the body for first document' } }, { 'dest_file': 'multi_render2.docx', 'context': { 'title': 'Title TWO', 'body': 'This is the body for second document' } }, { 'dest_file': 'multi_render3.docx', 'context': { 'title': 'Title THREE', 'body': 'This is the body for third document'
# -*- coding: utf-8 -*- ''' Created : 2017-09-03 @author: Eric Lapouyade ''' from docxtpl import DocxTemplate DEST_FILE = 'output/header_footer_image.docx' tpl = DocxTemplate('templates/header_footer_image_tpl.docx') context = { 'mycompany': 'The World Wide company', } tpl.replace_media('templates/dummy_pic_for_header.png', 'templates/python.png') tpl.render(context) tpl.save(DEST_FILE)
from docxtpl import DocxTemplate import csv from docxcompose.composer import Composer from docx import Document as Document_compose import os # Считываем csv файл, не забывая что екселввский csv разделен на самомо деле не запятыми а точкой с запятой reader = csv.DictReader(open('resources/data.csv'), delimiter=';') # Конвертируем объект reader в список словарей data = list(reader) # Создаем в цикле документы for row in data: doc = DocxTemplate('resources/template.docx') number = '' if len(row['number']) == 2: number = '000' + row['number'] elif len(row['number']) == 3: number = '00' + row['number'] elif len(row['number']) == 4: number = '0' + row['number'] else: number = row['number'] context = { 'lastname': row['lastname'], 'firstname': row['firstname'], 'number': number, 'profession': row['profession'], 'date_expiry': row['date_expiry'], 'date_issue': row['date_issue'], 'qualification': row['qualification'],
def createPDF(self, is_fourniss=False, filedir=None, tpl_path=None): self.hide() base_tpl_path = getFromConfig('path', 'templates_contract') words_path = getFromConfig('path', 'words_contract') for i in range(0, self.ui.layout_langues.count()): widget = self.ui.layout_langues.itemAt(i).widget() if widget != 0 and isinstance(widget, langueRB): if widget.isChecked(): langue_data = widget.data if tpl_path is None: filters = "MS Word Documents (*" + langue_data["code"] + ".docx)" # selected_filter = "MS Word Documents (*"+langue_data["code"]+".docx)" options = QtGui.QFileDialog.DontResolveSymlinks fileDialog = QtGui.QFileDialog( self, "Selectionnez un modèle de contrat") fileDialog.setFilter(filters) fileDialog.setOptions(options) fileDialog.setDirectory(base_tpl_path) tpl_path = fileDialog.getOpenFileName()[0] # tpl_path = QtGui.QFileDialog.getOpenFileName(self, "Selectionnez un template", base_tpl_path, filters, selected_filter, options)[0] # tpl_path = fileDialog.getOpenFileName(self, "Selectionnez un template", dir=base_tpl_path, filter = filters, selected_filter, options)[0] if tpl_path is None or tpl_path == "": return filename = self.ctr.n_contrat ################################################# ## NUMERO de CONTRAT ## ################################################# n_ctr = self.ctr.n_contrat ################################################# ## DATE CONTRAT ## ################################################# date_ctr = self.ctr.date_contrat ################################################# ## VILLE DE LVR/CHARG ## ################################################# ville = self.ctr.getVilleCible() if len(ville) < 1: ville = "<VILLE>" ################################################# ## ADRESSE FACTURATION ## ################################################# if is_fourniss is True: adr_fact = self.ctr.getFactFourniss() else: adr_fact = self.ctr.getFactClient() if isinstance(adr_fact, list): adr_fact = adr_fact[FacturationSelection.getFacturationAdress( self, adr_fact)] tab_adr_fact = '\t\t\t\t\t\t\t\t' adr_fact = adr_fact.replace('\n', '\n' + tab_adr_fact) ################################################# ## ADRESSE CLIENT ## ################################################# adr_client = self.ctr.getAdr_uClient() if langue_data['code'] != 'fr' and len( re.findall("\\n\w+$", adr_client)) > 0: print "ETRANGER, ", adr_client pays = re.findall("\\n\w+$", adr_client)[0] print "PAYS, ", pays adr_client = adr_client.replace(pays, pays.replace("\n", "\t\t\t")) print "NEW adr, ", adr_client tab_adr_client = '\t\t\t' adr_client = adr_client.replace('\n', '\n' + tab_adr_client) ################################################# ## TVA CLIENT ## ################################################# tva_client = self.ctr.getTVA_uClient() ################################################# ## ADRESSE FOURNISSEUR ## ################################################# adr_fourniss = self.ctr.getAdr_uFourniss() if langue_data['code'] != 'fr' and len( re.findall("\\n\w+$", adr_fourniss)) > 0: pays = re.findall("\\n\w+$", adr_fourniss)[0] adr_fourniss = adr_fourniss.replace(pays, pays.replace("\n", "\t\t\t")) tab_adr_fourniss = '\t\t\t' adr_fourniss = adr_fourniss.replace('\n', '\n' + tab_adr_fourniss) ################################################# ## TVA FOURNISSEUR ## ################################################# tva_fourniss = self.ctr.getTVA_U_Fourniss() ################################################# ## MARCHANDISE ## ################################################# # m_nom = self.ctr.marchandise.decode('utf-8') m_nom = self.oil_market.getMarchandiseFullName(self.ctr.marchandise, langue_data['code']) # marchandise_list = self.oil_market.marchandises_list[langue_data['code']] # m_nom = marchandise_list[self.ctr.marchandise]#.decode('utf-8') m_quantite = self.ctr.quantite if self.ctr.unite == 'kg': if langue_data['code'] == 'fr': m_unite = 'le ' elif langue_data['code'] == 'en': m_unite = 'per ' elif langue_data['code'] == 'es': m_unite = 'el ' m_unite += langue_data['kg_unite'] elif self.ctr.unite == 't': if langue_data['code'] == 'fr': m_unite = 'la ' elif langue_data['code'] == 'en': m_unite = 'per ' elif langue_data['code'] == 'es': m_unite = 'la ' m_unite += langue_data['t_unite'] ################################################# ## PAIEMENT ## ################################################# str_prix = self.ctr.prix matches = re.findall(r"[-+]?\d*\.*\d+", str_prix.replace(',', '.')) if len(matches) > 0: prix_num = matches[0] prix_words = num2words(float(prix_num), lang=langue_data['code']) else: prix_num = str_prix prix_words = "" if self.ctr.monnaie == 0: monnaie = u'\u20ac'.encode('utf8') prix_words += ' euros' elif self.ctr.monnaie == 1: monnaie = u'\u00a3'.encode('utf8') prix_words += ' dollars' elif self.ctr.monnaie == 2: monnaie = u'\u0024'.encode('utf8') prix_words += ' livres' else: monnaie = "" if len(self.ctr.paiement) > 0: index = self.oil_market.paiements["fr"].index(self.ctr.paiement) paiement = self.oil_market.paiements[langue_data['code']][index] courtage = self.ctr.courtage else: paiement = "" courtage = "" ################################################# ## LIVRAISON ## ################################################# # dlv_dic = self.ctr.periode_livraison try: periode_livraison = self.ctr.descr_livraison except: periode_livraison = "" # month_names = langue_data['months'] # ordered_years = sorted(dlv_dic.keys()) # for i in range(0, len(ordered_years), 1): # if len(periode_livraison) > 0 : # periode_livraison += '\n' # y = ordered_years[i] # for j in range(0, 12): # m = month_names[j] # total = int(float(dlv_dic[y][str(j+1).zfill(2)]["total"])) # if total == 0: continue # if len(periode_livraison) > 0 : # periode_livraison += ', '+m # else: # periode_livraison += m # periode_livraison += ' - '+str(y) if len(self.ctr.logement) > 0: index = self.oil_market.logements["fr"].index(self.ctr.logement) format_livraison = self.oil_market.logements[ langue_data['code']][index] else: format_livraison = "" if self.ctr.is_franco is True: if langue_data['code'] == "fr": ville = "usine acheteur à ".decode('utf8') + ville.decode( 'utf8') if langue_data['type_deliv'][1] == "": type_deliv = langue_data['type_deliv'][0].lower() else: type_deliv = langue_data['type_deliv'][1].lower() else: if langue_data['code'] == "fr": ville = "usine vendeur à ".decode('utf8') + ville.decode( 'utf8') if langue_data['type_deliv'][3] == "": type_deliv = langue_data['type_deliv'][2].lower() else: type_deliv = langue_data['type_deliv'][3].lower() has_tva_client = False if len(tva_client) > 0: tva_client += '\n' has_tva_client = True has_tva_fourniss = False if len(tva_fourniss) > 0: tva_fourniss += '\n' has_tva_fourniss = True context = { 'is_fourniss': is_fourniss, 'date_ctr': R(date_ctr, size=24), 'n_ctr': R(n_ctr, size=24), 'adr_fact': R(adr_fact, size=24), 'adr_fourniss': R(adr_fourniss, size=24), 'tva_fourniss': R(tva_fourniss, size=24), 'has_tva_fourniss': has_tva_fourniss, 'adr_client': R(adr_client, size=24), 'tva_client': R(tva_client, size=24), 'has_tva_client': has_tva_client, 'm_nom': R(m_nom, size=24), 'm_quantite': R(m_quantite, size=24), 'm_unite': R(m_unite, size=24), 'format_livraison': R(format_livraison, size=24), 'date_livraison': R(periode_livraison, size=24), 'type_delivery': R(type_deliv, size=24), 'ville': R(ville, size=24), 'monnaie': R(monnaie, size=24), 'prix_num': R(prix_num, size=24), 'prix_words': R(prix_words, size=24), 'paiement': R(paiement, size=24), 'courtage': R(courtage, size=24) } if filedir is None: # filedir = QtCore.QDir.absoluteFilePath(words_path) filedir = QtCore.QFileInfo(words_path).absoluteFilePath() # selected_filter = "MS Word Documents (*"+langue_data["code"]+".docx)" # fileDialog2 = QtGui.QFileDialog(self, "Où enregistrer ?") # options2 = QtGui.QFileDialog.DontResolveSymlinks # fileDialog2.setOptions(options2) # fileDialog2.setDirectory(words_path) # filedir = fileDialog2.getExistingDirectory() # filedir = QtGui.QFileDialog.getExistingDirectory(self, "Où enregistrer ?", words_path, QtGui.QFileDialog.ShowDirsOnly)# | QtGui.QFileDialog.DontResolveSymlinks) if filedir is None: return if not filedir.endswith('/'): filedir += '/' ctr = DocxTemplate(tpl_path) ctr.render(context) if is_fourniss is False: ctr_doc = filedir + filename + "_client.docx" ctr.save(ctr_doc) else: ctr_doc = filedir + filename + ".docx" ctr.save(ctr_doc) startfile(ctr_doc) if is_fourniss is False: return self.createPDF(is_fourniss=True, filedir=filedir, tpl_path=tpl_path)
def fill_tpl(context, doc_path): tpl = DocxTemplate(template) tpl.render(context) tpl.save(doc_path)
def generate(data): try: domaine = data['metier']['domaine'].strip() nbp = len(data['parcours']) if nbp == 5: flimit = 288 else: flimit = 403 # Try to make a space between aspet&contrainte if len(data['metier']['aspectPositif']) < 45: data['metier']['aspectPositif'] += '\n' context = { 'nom' : RichText(data['profil']['nom'], font='Arial', bold=True,\ size = 22 if len(data['profil']['nom'])>50 else 24), 'poste' : data['profil']['poste'], 'biographie' : RichText(data['profil']['biographie'], font='Arial', \ size = 22 if len(data['profil']['biographie'])>399 else 24), 'competenceQualite' : RichText(data['metier']['competenceQualite'], font='Arial', color='#000000', \ size = 22 if len(data['metier']['competenceQualite'])>185 else 24), 'accessMetier' : RichText(data['metier']['accessMetier'], font='Arial', color='#000000',\ size = 22 if len(data['metier']['accessMetier'])>160 else 24), 'aspectPositif' : RichText(data['metier']['aspectPositif'], font='Arial', color='#000000',\ size = 22 if len(data['metier']['aspectPositif'])>72 else 24), 'contrainte' : RichText(data['metier']['contrainte'], font='Arial', color='#000000',\ size = 22 if len(data['metier']['contrainte'])>72 else 24), 'domaine' : domaine, 'formation' : RichText(data['etudes']['formation'], font='Arial', color='#000000',\ size = 22 if (len(data['etudes']['formation'])>flimit) else 24), 'etablissement' : RichText(data['etudes']['etablissement'], font='Arial', color='#000000',\ size = 28 if len(data['etudes']['etablissement'])>32 else 32), 'insertionProfessionnel' : RichText(data['etudes']['insertionProfessionnel'], font='Arial', color='#000000',\ size = 22 if len(data['etudes']['insertionProfessionnel'])>111 else 24) } for i in range(nbp): if i == nbp - 1: color = '#ffffff' else: color = '#000000' context[f'p{i}'] = RichText(data['parcours'][i][0], font='Arial', color=color,\ size = 22 if len(data['parcours'][i][0])>11 else 24) context[f'v{i}'] = RichText(data[ 'parcours'][i][1], font='Arial', color=color, \ size = 22 if len(data['parcours'][i][1])>34 else 24) col = None for kdom, vdom in verifJSON().items(): if kdom == domaine: col = vdom break # Si aucune correspondance if not col: return # Get the template doc = DocxTemplate(f"template/Trame-vierge{nbp}-{col}.docx") # Change image on template if image set if data['profil']['profilImage'] != '': data['profil']['profilImage'] = forceJPG( data['profil']['profilImage']) doc.replace_pic('test.jpg', data['profil']['profilImage']) # Generate template doc.render(context) name = "FicheMetier_" + data['profil']['poste'].replace(' ', '_') # Save the doc generated doc.save(f"{gettempdir()}\\{name}.docx") # Convert to pdf convert(f"{gettempdir()}\\{name}.docx") return f"{gettempdir()}\\{name}.pdf" except Exception as err: print(err) return
from docxtpl import DocxTemplate doc = DocxTemplate("templ1.docx") ##context = { 'dick' : "И.И.Иванов"} ##doc.render(context) ##doc.save("шаблон-final.docx") kids = [{ 'first': 'John', 'last': 'Williams', 'addr1': '5555 NW 37th St', 'addr2': 'Apt 2601', 'city': 'Oklahoma City', 'state': 'OK', 'zip': '73112' }, { 'first': 'George', 'last': 'Lucas', 'addr1': '1234 Dobbs St.', 'addr2': 'Suite 62', 'city': 'Moore', 'state': 'OK', 'zip': '73160' }] doc = DocxTemplate("templ1.docx") context = {'dick': "И.И.Иванов", 'kids': kids} doc.render(context) doc.save("шаблон-final.docx") for kid in kids: print(kid['first']) print('___________')
from docxtpl import DocxTemplate, RichText, InlineImage from docx.shared import Inches, Mm from datetime import datetime from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font, Color, colors from copy import copy doc = DocxTemplate('MOP_DenHaag_V1.0.docx') context = { 'site_name' : "TestUE1" ,} context['site_name'] = "Site1" context['Hub_PE'] = "Site1-CR102" context['New_Hub_PE'] = 'Site1-CR102' doc.render(context) doc.save("MOP_Site1_V1.1.docx")
from docxtpl import DocxTemplate, RichText from jinja2.exceptions import TemplateError import six six.print_('=' * 80) six.print_("Generating template error for testing (so it is safe to ignore) :") six.print_('.' * 80) try: tpl = DocxTemplate('templates/template_error_tpl.docx') tpl.render({'test_variable': 'test variable value'}) except TemplateError as the_error: six.print_(six.text_type(the_error)) if hasattr(the_error, 'docx_context'): six.print_("Context:") for line in the_error.docx_context: six.print_(line) tpl.save('output/template_error.docx') six.print_('.' * 80) six.print_(" End of TemplateError Test ") six.print_('=' * 80)
from docxtpl import DocxTemplate from num2words import num2words f = open('out1.txt', 'r') f1 = f.read() tel = int(f1) f.close() f = open('out2.txt', 'r') f1 = f.read() inet = int(f1) f.close() doc = DocxTemplate("Shablon.docx") All = tel + inet NDS = All / 5 if ((All % 10) == 1): Slovo = " рубль" elif ((All % 10) == 2 or (All % 10) == 3 or (All % 10) == 4): Slovo = " рубля" else: Slovo = " рублей" Slova = num2words(All, lang='ru') + Slovo + " 00 копеек" All = str(All) + " руб." NDS = str(NDS) + " руб." context = { 'Slova': (Slova), 'Inet': (str(inet)), 'Tel': (str(tel)), 'All': (All), 'NDS': (NDS) }
def createHeaderDocNew(self, gender=None): docs = self.env['intern.document'].search([('name', '=', "CV_HEAD")], limit=1) logo = self.env['intern.document'].search([('name', '=', "Logo")], limit=1) streamDoc = BytesIO(docs[0].attachment.decode("base64")) target_document = None tempFile1 = None lentmp = len(self.interns_exam_doc) if gender != None: lentmp = 0 for intern in self.interns_exam_doc: if intern.gender == gender: lentmp += 1 if lentmp > 20: target_document = Document(streamDoc) tmp = lentmp / 20 for i in range(1, tmp + 1): document = Document(streamDoc) for table in document.tables: for row in table.rows: for cell in row.cells: if 'tbl_intern' in cell.text: cell.text = cell.text.replace( 'tbl_intern', 'tbl_intern%d' % i) break # target_document.add_page_break() for element in document.element.body: target_document.element.body.append(element) tempFile1 = NamedTemporaryFile(delete=False) target_document.save(tempFile1.name) tempFile1.flush() tempFile1.close() if docs: tpl = None if target_document is None: stream = BytesIO(docs[0].attachment.decode("base64")) tpl = DocxTemplate(stream) else: tpl = DocxTemplate(tempFile1.name) context = {} interns = self.interns_exam_doc.sorted( key=lambda x: x.sequence_exam) counter_index = 0 for k in range(0, lentmp / 20 + 1): table_interns = [] for i in range(20 * k, 20 * k + 20): if i >= lentmp: break if gender == None: intern = interns[i] else: while counter_index < len(interns): if interns[counter_index].gender == gender: intern = interns[counter_index] counter_index += 1 break counter_index += 1 info = {} info['stt'] = str(i + 1) info['htk'] = intern.name_without_signal.upper() info['htn'] = intern.name_in_japan if intern.gender == 'nu': info['gt'] = u'女' else: info['gt'] = u'男' info['ns'] = intern_utils.date_time_in_jp( intern.day, intern.month, intern.year) info['t'] = str( intern_utils.get_age_jp(datetime.now(), intern.day, intern.month, intern.year)) info['nm'] = intern.blood_group left = 1.5 - (10.0 - intern.vision_left) / 10.0 right = 1.5 - (10.0 - intern.vision_right) / 10.0 info['tlt'] = "%.1f" % (left) info['tlp'] = "%.1f" % (right) if intern.preferred_hand == '0': info['tt'] = u'右' elif intern.preferred_hand == '1': info['tt'] = u'左' else: info['tt'] = u'両手' info['cc'] = str(intern.height) info['cn'] = str(intern.weight) info['iq'] = "%s%%" % intern.iq_percentage info['ktk'] = intern.check_kureperin info['hn'] = intern.marital_status.name_in_jp if intern.province: info['pro'] = intern_utils.no_accent_vietnamese( intern.province.name).upper() info['bc'] = intern.certification.name_in_jp table_interns.append(info) if k == 0: context['tbl_intern'] = table_interns else: context['tbl_intern%d' % k] = table_interns context['logo'] = InlineImage( tpl, BytesIO(logo[0].attachment.decode("base64")), width=Mm(35)) if self.enterprise_doc: context['xn'] = self.enterprise_doc.name_jp context['nd'] = self.guild.name_in_jp context['now'] = intern_utils.date_time_in_jp( datetime.now().day, datetime.now().month, datetime.now().year) tpl.render(context) tempFile = NamedTemporaryFile(delete=False) tpl.save(tempFile) tempFile.flush() tempFile.close() if tempFile1 is not None: os.unlink(tempFile1.name) return tempFile if tempFile1 is not None: os.unlink(tempFile1.name) return None
parser = argparse.ArgumentParser() # setup firstname, lastname arguements parser.add_argument('--startdate', help="Enter start date here") parser.add_argument('--enddate', help="Enter end date here") # get the dictionary of command line inputs entered by the user args = parser.parse_args() # access each command line input from the dictionary sDate = args.startdate eDate = args.enddate tmplPath = "assets/docxtpl/template_example.docx" doc = DocxTemplate(tmplPath) try: connection = cx_Oracle.connect("system/torreto@localhost") cursor = connection.cursor() #print(connection.version) sql_fetch = """ SELECT * FROM IEGC_VIOLATION_DATA where date_time BETWEEN TO_DATE(:col1, 'YYYY-MM-DD')\ and TO_DATE(:col2, 'YYYY-MM-DD')""" cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD' ") df = pd.read_sql(sql_fetch, params={ 'col1': sDate, 'col2': eDate }, con=connection) '''cursor.execute(sql_fetch, {'col1':sDate, 'col2':eDate})
def main(): doc = DocxTemplate(f'templates/{settings["template_filename"]}.docx') context = get_context(settings, current_period_data) doc.render(context) doc.save(f'output/{context["output_doc_name"]}.docx') print_output_information(context)
def run_report(cfg, table_data, table_species, table_findgse, table_scope, table_kmer, table_assembly, figure_base_quality, figure_base_content, figure_base_gc, figure_species, figure_findgse, figure_genomescope, figure_kmer, figure_gc_depth, tpl_docx, tpl_html, out_dir): out_dir = mkdir(out_dir) now = datetime.now() config = read_config(cfg) table_data = read_table_data(table_data) table_species = read_tsv(table_species, '\t') if config["general"]["assembly"].lower() == "true": if table_assembly.lower == "no": LOG.debug("Please enter the assembly result statistics file") assembly = True table_assembly = read_table_assembly(table_assembly) else: assembly = False table_assembly = [[0, 0, 0, 0], [0], [0], [0], [0], [0], [0, 0, 0, 0, 0]] if config["general"]["homogeneous"].lower() == "true": if table_findgse.lower == "no" or table_scope.lower == "no": LOG.debug( "Please output the genomic prediction results of FindGSE and GenomeScope" ) homogeneous = True table_findgse = read_table_findgse(table_findgse) table_scope = read_table_scope(table_scope) findgse_genome = table_findgse[0] scope_genome = table_scope[0] max_genome = max(findgse_genome, scope_genome) min_genome = min(findgse_genome, scope_genome) average_genome = (max_genome + min_genome) * 1.0 / 2 software = "FindGSE和GenomeScope" estimate_size = '{0:,}-{1:,}'.format(min_genome, max_genome) heterozygosity = table_scope[1] else: if table_kmer.lower == "no": LOG.debug( "Please output the genomic prediction results of Kmerfreq") homogeneous = False table_kmer = read_table_kmer(table_kmer) software = "Kmerfreq" estimate_size = '{:,}'.format(int(table_kmer[4].replace(",", ""))) heterozygosity = float(table_kmer[5].replace("%", "")) findgse_genome = 0 scope_genome = 0 max_genome = 0 min_genome = 0 average_genome = 0 r = { "project": "", "id": "", "name": "", "species": "", "strain": "", "sequencer": "Illumina", "author": "", "reviewer": "", "year": now.year, "month": now.month, "day": now.day, "kmer": "", "raw_data": table_data[2], "clean_data": table_data[4], "estimate_size": estimate_size, "heterozygosity": '{}%'.format(heterozygosity), "software": software, "homogeneous": homogeneous, "assembly_size": '{:,}'.format(int(table_assembly[6][3])), "findgse_genome": '{:,}'.format(findgse_genome), "scope_genome": '{:,}'.format(scope_genome), "average_genome": '{:,}'.format(average_genome), "max_genome": '{:,}'.format(max_genome), "min_genome": '{:,}'.format(min_genome), "table_data": table_data, "table_species": table_species, "pollution_description": "", "table_findgse": table_findgse, "table_scope": table_scope, "table_kmer": table_kmer, "assembly": assembly, "table_assembly": table_assembly, "scaffold_length": '{:,}'.format(int(table_assembly[6][3])), "scaffold_n50": '{:,}'.format(int(table_assembly[0][3])), "scaffold_number": '{:,}'.format(int(table_assembly[6][4])), "contig_length": '{:,}'.format(int(table_assembly[6][1])), "contig_n50": '{:,}'.format(int(table_assembly[0][1])), "contig_number": '{:,}'.format(int(table_assembly[6][2])), "depth_description": "" } r.update(config["general"]) tpl = DocxTemplate(tpl_docx) tpl.render(r) if homogeneous: if assembly: figure_name = [ "base_quality.png", "base_content.png", "base_gc.png", "top10_species.png", "findgse.png", "genomescope.png", "gc_depth.png" ] figure_variable = [ figure_base_quality, figure_base_content, figure_base_gc, figure_species, figure_findgse, figure_genomescope, figure_gc_depth ] else: figure_name = [ "base_quality.png", "base_content.png", "base_gc.png", "top10_species.png", "findgse.png", "genomescope.png", "gc_depth.png" ] figure_variable = [ figure_base_quality, figure_base_content, figure_base_gc, figure_species, figure_findgse, figure_genomescope ] else: if assembly: figure_name = [ "base_quality.png", "base_content.png", "base_gc.png", "top10_species.png", "heterozygosity.png", "gc_depth.png" ] figure_variable = [ figure_base_quality, figure_base_content, figure_base_gc, figure_species, figure_kmer, figure_gc_depth ] else: figure_name = [ "base_quality.png", "base_content.png", "base_gc.png", "top10_species.png", "heterozygosity.png" ] figure_variable = [ figure_base_quality, figure_base_content, figure_base_gc, figure_species, figure_kmer ] for i, j in zip(figure_name, figure_variable): tpl.replace_pic(i, j) tpl.save(os.path.join(out_dir, "report.docx")) # html_report for i in ["images", "static"]: temp = os.path.join(out_dir, i) if os.path.exists(temp): shutil.rmtree(temp) shutil.copytree(os.path.join(tpl_html, i), temp) for i in figure_variable: shutil.copy(i, os.path.join(out_dir, "images/")) for j in ["index.html", "main.html"]: tpl = Template(open(os.path.join(tpl_html, j)).read().decode("utf-8")) with open(os.path.join(out_dir, j), "w") as fh: fh.write(tpl.render(r).encode("utf-8")) # html_report return r
def make_templated_report(self, options: Options, file_obj: Path, output_filename: str, picfile: Path, template_path: Path): cif = CifContainer(file_obj) tpl_doc = DocxTemplate(Path(__file__).parent.parent.joinpath(template_path)) ba = BondsAndAngles(cif, without_h=options.without_h) t = TorsionAngles(cif, without_h=options.without_h) h = HydrogenBonds(cif) context = {'options' : options, # {'without_h': True, 'atoms_table': True, 'text': True, 'bonds_table': True}, 'cif' : cif, 'space_group' : self.space_group_subdoc(tpl_doc, cif), 'structure_figure' : self.make_picture(options, picfile, tpl_doc), 'crystallization_method': remove_line_endings(retranslate_delimiter( cif['_exptl_crystal_recrystallization_method'])) or '[No crystallization method given!]', 'sum_formula' : self.format_sum_formula(cif['_chemical_formula_sum'].replace(" ", "")), 'itnum' : cif['_space_group_IT_number'], 'crystal_size' : this_or_quest(cif['_exptl_crystal_size_min']) + timessym + this_or_quest(cif['_exptl_crystal_size_mid']) + timessym + this_or_quest(cif['_exptl_crystal_size_max']), 'crystal_colour' : this_or_quest(cif['_exptl_crystal_colour']), 'crystal_shape' : this_or_quest(cif['_exptl_crystal_description']), 'radiation' : self.get_radiation(cif), 'wavelength' : cif['_diffrn_radiation_wavelength'], 'theta_range' : self.get_from_to_theta_range(cif), 'diffr_type' : gstr(cif['_diffrn_measurement_device_type']) or '[No measurement device type given]', 'diffr_device' : gstr(cif['_diffrn_measurement_device']) or '[No measurement device given]', 'diffr_source' : gstr(cif['_diffrn_source']).strip('\n\r') or '[No radiation source given]', 'monochromator' : gstr(cif['_diffrn_radiation_monochromator']) \ or '[No monochromator type given]', 'detector' : gstr(cif['_diffrn_detector_type']) \ or '[No detector type given]', 'lowtemp_dev' : gstr(cif['_olex2_diffrn_ambient_temperature_device']) \ or '', 'index_ranges' : self.hkl_index_limits(cif), 'indepentent_refl' : this_or_quest(cif['_reflns_number_total']), 'r_int' : this_or_quest(cif['_diffrn_reflns_av_R_equivalents']), 'r_sigma' : this_or_quest(cif['_diffrn_reflns_av_unetI/netI']), 'completeness' : self.get_completeness(cif), 'theta_full' : cif['_diffrn_reflns_theta_full'], 'data' : this_or_quest(cif['_refine_ls_number_reflns']), 'restraints' : this_or_quest(cif['_refine_ls_number_restraints']), 'parameters' : this_or_quest(cif['_refine_ls_number_parameters']), 'goof' : this_or_quest(cif['_refine_ls_goodness_of_fit_ref']), 'ls_R_factor_gt' : this_or_quest(cif['_refine_ls_R_factor_gt']), 'ls_wR_factor_gt' : this_or_quest(cif['_refine_ls_wR_factor_gt']), 'ls_R_factor_all' : this_or_quest(cif['_refine_ls_R_factor_all']), 'ls_wR_factor_ref' : this_or_quest(cif['_refine_ls_wR_factor_ref']), 'diff_dens_min' : self.get_diff_density_min(cif).replace('-', minus_sign), 'diff_dens_max' : self.get_diff_density_max(cif).replace('-', minus_sign), 'exti' : self.get_exti(cif), 'flack_x' : self.get_flackx(cif), 'integration_progr' : self.get_integration_program(cif), 'abstype' : gstr(cif['_exptl_absorpt_correction_type']) or '??', 'abs_details' : self.get_absortion_correction_program(cif), 'solution_method' : self.solution_method(cif), 'solution_program' : self.solution_program(cif), 'refinement_prog' : self.refinement_prog(cif), 'atomic_coordinates' : self.get_atomic_coordinates(cif), 'bonds' : ba.bonds, 'angles' : ba.angles, 'ba_symminfo' : ba.symminfo, 'torsions' : t.torsion_angles, 'torsion_symminfo' : t.symminfo, 'hydrogen_bonds' : h.hydrogen_bonds, 'hydrogen_symminfo' : h.symminfo, 'literature' : self.literature } # Filter definition for {{foobar|filter}} things: jinja_env = jinja2.Environment() jinja_env.filters['inv_article'] = get_inf_article tpl_doc.render(context, jinja_env=jinja_env, autoescape=True) tpl_doc.save(output_filename)
def createDocument(patient: patient, observationDictionary) -> Document: doc = DocxTemplate("./templates/patientInformationTemplate.docx") context = { 'patient': patient, "homeNumbers": getPatientHomePhoneNumbers(patient), "mobileNumbers": getPatientMobilePhoneNumbers(patient), "addresses": getPatientAddresses(patient), "knownLanguages": getPatientKnownLanguages(patient), "observations": observationDictionary } doc.render(context) return doc
def generate(self): template = self.template.file._get_file() doc = DocxTemplate(template) invoiceProducts = self.products.all() products__pk = [product.product.pk for product in invoiceProducts] if len(invoiceProducts) == 0: categories = Category.objects.all() else: categories = Category.objects.distinct().filter( products__pk__in=products__pk) for category in categories: if len(products__pk) > 0: category.products_all = category.products.filter( pk__in=products__pk) else: category.products_all = category.products.all() for product in category.products_all: product.img = InlineImage(doc, product.image_full_url, width=Mm(32), height=Mm(32)) delivery = round( float(product.weight_delivery_pc) * float(self.incoterms.price), 2) # SM if category.ignore_multiply: sm_price = product.get_sm_price else: sm_price = self.price.calc(product.get_sm_price) product.sm_price = round(sm_price, 2) product.sm_price_uah = round(sm_price * 26.6, 2) if delivery > 0: sm_delivery = float(sm_price) + delivery product.sm_delivery = round(sm_delivery, 2) product.sm_delivery_uah = round(sm_delivery * 26.6, 2) else: product.sm_delivery = '-' product.sm_delivery_uah = '-' # MD if category.ignore_multiply: md_price = product.get_md_price else: md_price = self.price.calc(product.get_md_price) product.md_price = round(md_price, 2) product.md_price_uah = round(md_price * 26.6, 2) if delivery > 0: md_delivery = float(md_price) + delivery product.md_delivery = round(md_delivery, 2) product.md_delivery_uah = round(md_delivery * 26.6, 2) else: product.md_delivery = '-' product.md_delivery_uah = '-' # BG if category.ignore_multiply: bg_price = product.get_bg_price else: bg_price = self.price.calc(product.get_bg_price) product.bg_price = round(bg_price, 2) product.bg_price_uah = round(bg_price * 26.6, 2) if delivery > 0: bg_delivery = float(bg_price) + delivery product.bg_delivery = round(bg_delivery, 2) product.bg_delivery_uah = round(bg_delivery * 26.6, 2) else: product.bg_delivery = '-' product.bg_delivery_uah = '-' for product in invoiceProducts: product.img = InlineImage(doc, product.image_full_url, width=Mm(24), height=Mm(24)) context = { 'invoice': self, 'products': invoiceProducts, 'exporter': self.exporter, 'importer': self.importer, 'categories': categories, } jinja_env = jinja2.Environment(autoescape=True) doc.render(context, jinja_env) # name = unidecode('-'.join(['invoice',self.code, str(self.date), 'id', str(self.pk)])) formula = ''.join(x for x in self.price.formula if x.isdigit()) if len(formula) == 0: formula = 0 name = f"presentation_en_{str(int(formula))}_{str(int(self.incoterms.price))}" filename = f'Invoices/{name}.docx' doc.save(settings.MEDIA_ROOT + filename) self.file.name = filename self.save() # try: os.remove(settings.MEDIA_ROOT + filename) # except: pass return settings.MEDIA_URL + filename