From 7ed5de38a230b331f95b32c9418bc77a63f38157 Mon Sep 17 00:00:00 2001 From: seele2 Date: Sun, 28 Sep 2025 23:17:45 +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 --- .gitignore | 3 ++- data.json | 54 ++++++++++++++++++++++++++++++++------------------ main.py | 51 +++++++++++++++++++++++++++-------------------- template.docx | Bin 14532 -> 13969 bytes 4 files changed, 67 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index 9dddaf7..d017762 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /build/ /dist/ -.idea \ No newline at end of file +.idea +*.spec \ No newline at end of file diff --git a/data.json b/data.json index 9f13cf6..7d4de48 100644 --- a/data.json +++ b/data.json @@ -10,7 +10,7 @@ "type": "text" }, { - "key": "{Table}", + "key": "{TableTitle}", "value": 123, "type": "number" }, @@ -21,23 +21,39 @@ "width": 1.25 }, { - "key": "{Table.No}", - "value": "序号测试", - "type": "text" - }, - { - "key": "{Table.Name}", - "value": "名称测试", - "type": "text" - }, - { - "key": "{Table.Col2}", - "value": "列2", - "type": "text" - }, - { - "key": "{Table.Col3}", - "value": "列3", - "type": "text" + "key": "{Table}", + "type": "table", + "value": [ + { + "No": "1", + "Name": "名称测试1", + "Col2": "列2", + "Col3": "列3" + }, + { + "No": "2", + "Name": "名称测试2", + "Col2": "列2", + "Col3": "列3" + }, + { + "No": "3", + "Name": "名称测试3", + "Col2": "列2", + "Col3": "列3" + }, + { + "No": "4", + "Name": "名称测试4", + "Col2": "列2", + "Col3": "列3" + }, + { + "No": "5", + "Name": "名称测试5", + "Col2": "列2", + "Col3": "列3" + } + ] } ] \ No newline at end of file diff --git a/main.py b/main.py index 0650689..b685bd7 100644 --- a/main.py +++ b/main.py @@ -8,11 +8,11 @@ from docx.enum.text import WD_PARAGRAPH_ALIGNMENT def get_command_argv_by_sys(): # 默认值-用于测试 template_path = "template.docx" - template_path = "test.docx" + #template_path = "test.docx" filename_path = "demo.docx" datafile_path = "data.json" - datafile_path = "data_1.json" - cycle = 1 + #datafile_path = "data_1.json" + cycle = 0 # 读取参数 number = len(sys.argv) if 2 == number: @@ -61,18 +61,33 @@ def replace(template_path, filename_path, data_json): # 表格替换 for table in document_file.tables: - for row in table.rows: - for cell in row.cells: - for datum in data_json: - if datum["key"] in cell.text: - if "text" == datum["type"]: - cell.text = cell.text.replace(datum["key"], datum["value"]) - elif "picture" == datum["type"]: - paragraph = cell.paragraphs[0] - paragraph.clear() - paragraph.add_run().add_picture(datum["value"], width=Inches(datum["width"])) - elif "number" == datum["type"]: - cell.text = cell.text.replace(datum["key"], str(datum["value"])) + # 字段 + row = table.rows[0] + group = None + fields = [] + for cell in row.cells: + split = cell.text.replace("}","").split(".") + group = split[0] + "}" + field = split[1] + fields.append(field.strip()) + + # 替换 + for datum in data_json: + if datum["key"] in group: + rows = len(table.rows) + values = datum["value"] + for z in range(0, len(values)): + if z < rows: + row = table.rows[z] + else: + row = table.add_row() + + item = values[z] + for i in range(0, len(fields)): + field = fields[i] + if item.get(field) is not None: + row.cells[i].text = str(item.get(field)) + document_file.save(filename_path) return 0 @@ -149,12 +164,6 @@ def foreach(template_path, filename_path, data_json): return 0 - - - - - - def main(): params = get_command_argv_by_sys() [template, filename, datafile, cycle] = params diff --git a/template.docx b/template.docx index 44214392608018ed470d678a03f6a0fd6ed8d767..9febc0b2a4bf62b70f08df005318f9f5716c5548 100644 GIT binary patch literal 13969 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

BCFCX@WCDSDY?ORavBtc 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 literal 14532 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