添加列表循环填充

main
seele2 1 month ago
parent 7ed5de38a2
commit c71a8dc413

@ -56,4 +56,15 @@
}
]
}
,
{
"key": "{List}",
"type": "list",
"value": [
"A1队列3的生存性最高,机动时间0s,机动距离0m,综合生存能力为0,隐蔽等级为1,道路性质为0;",
"A2队列3的生存性最高,机动时间0s,机动距离0m,综合生存能力为0,隐蔽等级为1,道路性质为0;",
"A3队列3的生存性最高,机动时间0s,机动距离0m,综合生存能力为0,隐蔽等级为1,道路性质为0;",
"A4队列3的生存性最高,机动时间0s,机动距离0m,综合生存能力为0,隐蔽等级为1,道路性质为0;"
]
}
]

@ -1,18 +1,15 @@
import json
import sys
from copy import deepcopy
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def get_command_argv_by_sys():
# 默认值-用于测试
template_path = "template.docx"
#template_path = "test.docx"
filename_path = "demo.docx"
datafile_path = "data.json"
#datafile_path = "data_1.json"
cycle = 0
# 读取参数
number = len(sys.argv)
if 2 == number:
@ -24,12 +21,8 @@ def get_command_argv_by_sys():
template_path = sys.argv[1]
filename_path = sys.argv[2]
datafile_path = sys.argv[3]
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
return template_path, filename_path, datafile_path
def read_data(filepath):
@ -58,6 +51,21 @@ def replace(template_path, filename_path, data_json):
paragraph.add_run().add_picture(datum["value"], width=Inches(datum["width"]))
elif "number" == datum["type"]:
paragraph.text = paragraph.text.replace(datum["key"], str(datum["value"]))
elif "list" == datum["type"]:
p = paragraph._p
index = list(document_file.element.body.iterchildren()).index(p)
key = datum["key"]
values = datum["value"]
for i in range(0,len(values)):
paragraph = deepcopy(p)
document_file.element.body.insert(index + i + 1, paragraph)
paragraph.clear()
for i in range(0, len(values)):
val = values[i]
paragraph = document_file.paragraphs[index - 1 + i]
paragraph.text = paragraph.text.replace(key, str(val))
# 表格替换
for table in document_file.tables:
@ -91,90 +99,17 @@ def replace(template_path, filename_path, data_json):
document_file.save(filename_path)
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():
params = get_command_argv_by_sys()
[template, filename, datafile, cycle] = params
[template, filename, datafile] = params
data = read_data(datafile)
if len(data) == 0:
return 1
else:
if cycle == 0:
return replace(template, filename, data)
else:
return foreach(template, filename, data)
if __name__ == '__main__':
print(main())

Binary file not shown.
Loading…
Cancel
Save