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 0000000..043c3a7 Binary files /dev/null and b/test.docx differ