From 35c461534ad1bd2c11b2f3ebbf6de02283c650c4 Mon Sep 17 00:00:00 2001 From: liamxin Date: Sat, 5 Jul 2025 08:22:57 +0800 Subject: [PATCH] init --- data_1.json | 29 ++++++++++++++++ main.py | 98 +++++++++++++++++++++++++++++++++++++++++++++++++--- schema.json | 0 test.docx | Bin 0 -> 10532 bytes 4 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 data_1.json create mode 100644 schema.json create mode 100644 test.docx diff --git a/data_1.json b/data_1.json new file mode 100644 index 0000000..7e6ce9f --- /dev/null +++ b/data_1.json @@ -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" + } +] \ No newline at end of file diff --git a/main.py b/main.py index eb5131c..0650689 100644 --- a/main.py +++ b/main.py @@ -3,13 +3,16 @@ import sys 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 = 1 # 读取参数 number = len(sys.argv) if 2 == number: @@ -21,7 +24,12 @@ def get_command_argv_by_sys(): template_path = sys.argv[1] filename_path = sys.argv[2] 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): @@ -68,16 +76,96 @@ 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] = params + [template, filename, datafile, cycle] = params data = read_data(datafile) if len(data) == 0: return 1 else: - return replace(template, filename, data) - + if cycle == 0: + return replace(template, filename, data) + else: + return foreach(template, filename, data) if __name__ == '__main__': print(main()) diff --git a/schema.json b/schema.json new file mode 100644 index 0000000..e69de29 diff --git a/test.docx b/test.docx new file mode 100644 index 0000000000000000000000000000000000000000..043c3a7ae175e95cf7cf0cf777fd24cf3d26fdad GIT binary patch literal 10532 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 Iluw}l2b~O!kpKVy literal 0 HcmV?d00001