添加列表循环填充

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 json
import sys import sys
from copy import deepcopy
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 = 0
# 读取参数 # 读取参数
number = len(sys.argv) number = len(sys.argv)
if 2 == number: if 2 == number:
@ -24,12 +21,8 @@ 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]
if 5 == number:
template_path = sys.argv[1] return template_path, filename_path, datafile_path
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):
@ -58,6 +51,21 @@ def replace(template_path, filename_path, data_json):
paragraph.add_run().add_picture(datum["value"], width=Inches(datum["width"])) paragraph.add_run().add_picture(datum["value"], width=Inches(datum["width"]))
elif "number" == datum["type"]: elif "number" == datum["type"]:
paragraph.text = paragraph.text.replace(datum["key"], str(datum["value"])) 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: for table in document_file.tables:
@ -91,90 +99,17 @@ 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, cycle] = params [template, filename, datafile] = params
data = read_data(datafile) data = read_data(datafile)
if len(data) == 0: if len(data) == 0:
return 1 return 1
else: else:
if cycle == 0: return replace(template, filename, data)
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