From c71a8dc4135d74bdee20b79f2afd99d79cf6dd8e Mon Sep 17 00:00:00 2001 From: seele2 Date: Mon, 29 Sep 2025 20:52:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=97=E8=A1=A8=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E5=A1=AB=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data.json | 11 +++++ main.py | 111 +++++++++++--------------------------------------- template.docx | Bin 13969 -> 14947 bytes 3 files changed, 34 insertions(+), 88 deletions(-) diff --git a/data.json b/data.json index 7d4de48..2e1b226 100644 --- a/data.json +++ b/data.json @@ -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;" + ] + } ] \ No newline at end of file diff --git a/main.py b/main.py index b685bd7..7425088 100644 --- a/main.py +++ b/main.py @@ -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) + return replace(template, filename, data) + if __name__ == '__main__': print(main()) + diff --git a/template.docx b/template.docx index 9febc0b2a4bf62b70f08df005318f9f5716c5548..ce5747a8b6811255b6bd5d7f9b8cfac0dde6ab8e 100644 GIT binary patch delta 9196 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