liamxin 2 months ago
parent 48800c0e99
commit 35c461534a

@ -0,0 +1,29 @@
[
{
"key": "title",
"value": "测试标题",
"type": "text"
},
{
"key": "picture",
"value": "rust.jpg",
"type": "picture",
"width": 1.25
},
{
"key": "title",
"value": "测试标题",
"type": "text"
},
{
"key": "picture",
"value": "rust.jpg",
"type": "picture",
"width": 2.5
},
{
"key": "conclusion",
"value": "序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试序号测试",
"type": "text"
}
]

@ -3,13 +3,16 @@ import sys
from docx import Document from docx import Document
from docx.shared import Inches from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def get_command_argv_by_sys(): def get_command_argv_by_sys():
# 默认值-用于测试 # 默认值-用于测试
template_path = "template.docx" template_path = "template.docx"
template_path = "test.docx"
filename_path = "demo.docx" filename_path = "demo.docx"
datafile_path = "data.json" datafile_path = "data.json"
datafile_path = "data_1.json"
cycle = 1
# 读取参数 # 读取参数
number = len(sys.argv) number = len(sys.argv)
if 2 == number: if 2 == number:
@ -21,7 +24,12 @@ def get_command_argv_by_sys():
template_path = sys.argv[1] template_path = sys.argv[1]
filename_path = sys.argv[2] filename_path = sys.argv[2]
datafile_path = sys.argv[3] datafile_path = sys.argv[3]
return template_path, filename_path, datafile_path if 5 == number:
template_path = sys.argv[1]
filename_path = sys.argv[2]
datafile_path = sys.argv[3]
cycle = sys.argv[4]
return template_path, filename_path, datafile_path,cycle
def read_data(filepath): def read_data(filepath):
@ -68,16 +76,96 @@ def replace(template_path, filename_path, data_json):
document_file.save(filename_path) document_file.save(filename_path)
return 0 return 0
def foreach(template_path, filename_path, data_json):
try:
document_file = Document(template_path)
except:
return 2
placeholder = []
loop = False
i = 0
for paragraph in document_file.paragraphs:
text = paragraph.text
if "$[" == text:
loop = True
paragraph.clear()
p = paragraph._element
p.getparent().remove(p)
p._p = p._element = None
continue
elif "]$" == text:
loop = False
paragraph.clear()
p = paragraph._element
p.getparent().remove(p)
p._p = p._element = None
z = 0
for datum in data_json:
for item in placeholder:
key = item["paragraph"].text.replace("{", "").replace("}", "")
style = item["paragraph"].style
if key == datum["key"]:
if "text" == datum["type"]:
paragraph = document_file.add_paragraph(datum["value"], style=style)
paragraph._element.getparent().insert(z, paragraph._element)
elif "picture" == datum["type"]:
paragraph = document_file.add_paragraph(style=style)
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
paragraph.add_run().add_picture(datum["value"], width=Inches(datum["width"]))
paragraph._element.getparent().insert(z, paragraph._element)
elif "number" == datum["type"]:
paragraph = document_file.add_paragraph(str(datum["value"]), style=style)
paragraph._element.getparent().insert(z, paragraph._element)
# else:
# paragraph = document_file.add_paragraph(item["text"], style=style)
# paragraph._element.getparent().insert(z, paragraph._element)
z += 1
placeholder = []
if loop:
placeholder.append({"paragraph": paragraph, "key": text.replace("{", "").replace("}", ""), "style": paragraph.style,"text":text, "index": i})
p = paragraph._element
p.getparent().remove(p)
p._p = p._element = None
else:
if text.startswith("{") and text.endswith("}"):
for datum in data_json:
if datum["key"] in text:
key = "{" + datum["key"] + "}"
if "text" == datum["type"]:
paragraph.text = paragraph.text.replace(key, datum["value"])
elif "picture" == datum["type"]:
paragraph.clear()
paragraph.add_run().add_picture(datum["value"], width=Inches(datum["width"]))
elif "number" == datum["type"]:
paragraph.text = paragraph.text.replace(key, str(datum["value"]))
i += 1
document_file.save(filename_path)
return 0
def main(): def main():
params = get_command_argv_by_sys() params = get_command_argv_by_sys()
[template, filename, datafile] = params [template, filename, datafile, cycle] = params
data = read_data(datafile) data = read_data(datafile)
if len(data) == 0: if len(data) == 0:
return 1 return 1
else: else:
return replace(template, filename, data) if cycle == 0:
return replace(template, filename, data)
else:
return foreach(template, filename, data)
if __name__ == '__main__': if __name__ == '__main__':
print(main()) print(main())

Binary file not shown.
Loading…
Cancel
Save