0%

快转文档处理器

编制了一个用于Word文本替换的小工具,可以根据模板文件生成新文件,一次最多可以处理999个模板文件(理论上可以不做限制,但是一般也用不了那么多,确有需要的可以修改代码参数来解决)。

程序名称:快转文档处理器

程序简介

快转文档处理器可根据 [模板文件][配置参数] 自动生成新文档。一次最多支持999个文档转换,自动计算可用目录功能可避免覆盖历史数据,一键操作,具有错误提示功能,可用于任意docx格式文档转换,成为大家归档表单、方案、报告编制小帮手,大幅减少文本替换的工作量,减少出错率,提高工作效率。

使用说明

1.将模板文件中需要替换的字段进行标签化处理

例如要将’姓名’作为替换的对象,则只需要在其两边加上双层花括号即可,即” {{姓名}} “;

注意: 模板文件仅支持docx格式,模板文件必须放置于Templates目录下。

2.修改配置文件

例如要将姓名”张三”替换掉” {{姓名}} “,在配置文件中的写法如下:

姓名 : 张三

注意

a.配置文件中的标签需要与模板中的名称一致,但不需要加” {{”和”}} “;

b.标签与值中间为英文冒号” : “,建议前后加空格,便于辨认;

c.标签字段中不能包含任何标点符号或特殊字符,否则程序无法执行;

d.配置文件中可以书写注释,但注释必须单独成行,且第一个字符必须为” # “;

e.配置文件中”项目名称”标签是必备的,请不要删除他。

3.双击”快转文档处理器.exe”程序即可运行

版 本:V1.0

作 者:秋风木叶

发布日期:2021年6月3日

代码跟打包好的程序都分享出来,大家感兴趣尽管拿去使用,如果有改进建议也可发邮件给我或留言。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
enter code here#coding:utf-8
'''
Created on 2021年5月31日
本程序的功能旨在根据模板文件生成新文档,减少文本替换的工作量,减少出错率
@author: 秋风木叶
'''

import docxtpl
import sys, os
import msvcrt

# Banner
def MyBanner():
MyHelp = '''
---------------------------------程序简介---------------------------------
*程序名称:快转文档处理器
*程序简介:
快转文档处理器可根据[模板文件]及[配置参数]自动生成新文档。一次最多支持999个
文档转换,自动计算可用目录功能可避免覆盖历史数据,一键操作,具有错误提示功能,可
用于任意docx格式文档转换,成为大家归档表单、方案、报告编制小帮手,大幅减少文本替
换的工作量,减少出错率,提高工作效率。
*使用说明:
1.将模板文件中需要替换的字段进行标签化处理
例如要将'姓名'作为替换的对象,则只需要在其两边加上双层花括号即可,即"{{姓名}}";
*注意: 模板文件仅支持docx格式,模板文件必须放置于Templates目录下。
2.修改配置文件
例如要将姓名"张三"替换掉"{{姓名}}",在配置文件中的写法如下:
姓名 : 张三
*注意: a.配置文件中的标签需要与模板中的名称一致,但不需要加"{{}}";
b.标签与值中间为英文冒号":",建议前后加空格,便于辨认;
c.标签字段中不能包含任何标点符号或特殊字符,否则程序无法执行;
d.配置文件中可以书写注释,但注释必须单独成行,且第一个字符必须为"#";
e.配置文件中"项目名称"标签是必备的,请不要删除他。
3.双击"快转文档处理器.exe"程序即可运行
*版 本:V1.0
*作 者:秋风木叶
*发布日期:2021年6月3日
--------------------------------------------------------------------------'''
print("{}".format(MyHelp))


# 自定义退出模式
def MyExit(ErrorCode = "None"):
'''ErrorCode默认为:None'''



print("\n>>>>>>>>>> The end! <<<<<<<<<<")

# 输出错误代码,默认为None
if(ErrorCode == "None"):
print("ByeBye!!!")
else:
print("ByeBye!!!(错误代码:{})".format(ErrorCode))


MyBanner()
print("按任意键退出……")
# 按任意键退出……
ord(msvcrt.getch())
sys.exit()

# 读取模板文件,返回文件名List
def GetTemplate( TemplatePath ):
print(">>>检测模板文件……")
if(os.path.exists(TemplatePath) != True):
os.mkdir(TemplatePath)
print("未检测到模板文件夹,已为您创建模板文件夹'{}',请将模板文件(仅支持.docx格式)置于其根目录后重新执行本程序!".format(TemplatePath))
MyExit("MBWJ1")


TemplateNameList = [] # 模板文档名称列表
BadList = [] # 有问题的模板文件,空的
files = os.listdir(TemplatePath)
for i in files:
#print(i,i[-5:])
if(i[-5:] == '.docx'):
if(os.path.getsize(os.path.join(TemplatePath, i)) == 0 ):
BadList.append(i)
else:
TemplateNameList.append(i)
else:
BadList.append(i)

'''
# 不使用os.walk,因为它会遍历所有子目录
for root,dirs,files in os.walk(TemplatePath,topdown=False):
#print('root_dir:',root) # 当前目录
#print('sub_dirs:',dirs) # 当前目录子目录
print('files:',files) # 当前目录下子目录
if(len(files)!=0):
TemplateNameList = files
'''

if(len(TemplateNameList)==0):
print("未检测到有效模板文件,请将模板文件(仅支持.docx格式)置于其根目录('{}')后重新执行本程序!".format(TemplatePath))
MyExit()
else:
print("---检测到有效的的模板文件如下:---")
number = 0
for i in TemplateNameList:
number += 1
print("模板文件 {} >>> {}".format(number,i))
print("---共检测到{}个有效的模板文件!---".format(number))
print("---以下模板文件无效:---")
number = 0
for i in BadList:
number += 1
print("无效模板文件!{} >>> {}".format(number,i))
print("---共检测到{}个无效的模板文件,将不被本程序处理!---".format(number))
print(">>>模板文件检测完毕!\n")
return(TemplateNameList)

# 读取配置文件并写入字典
# 需要增加检错功能
def GetConfigTxt(ConfigTxtPath):
if(os.path.exists(ConfigTxtPath) != True):
print('未检测到配置文件,已为您新建配置文件"{}",请根据实际情况修改配置文件后重新执行本程序!'.format(ConfigTxtPath))
f = open(ConfigTxtPath, 'w', encoding="utf-8")
text = '''项目名称 : 秋风木叶的测试项目'''
f.write(text)
f.close()
MyExit("PZWJ")
else:
print('>>>读取配置文件...')
ConfigTxtFp = open(ConfigTxtPath,'r',encoding='utf-8') # 打开配置文件
ConfigTxt = ConfigTxtFp.readlines() # 读入配置文件
ConfigTxtFp.close() # 关闭配置文件
Context = {} # 创建字典
for line in ConfigTxt:

if(line.strip()[:1] == '#'):
continue
elif(line.strip() == ""):
continue
else:
K, V = line.split(':') # 分割文本
k, v = K.strip(), V.strip() # 去首尾空
print("打印配置文件:",k+':'+v)
Context.update({k:v}) # 配置文件内容加入字典
print(">>>配置文件读取完毕!\n")
return(Context)

# 执行文本替换操作
def MakeDocx(docx_path, docx_name, OutPutPath, OutPutFileName, Context):
print('>>> 文件处理中...')
print("模板文件:{}".format(docx_name)) # 打印正在处理的模板文件名称
print("输出文件:{}".format(OutPutFileName))
doc = docxtpl.DocxTemplate( os.path.join(docx_path,docx_name) ) # 对方案模板进行初始化
doc.render(Context) # 替换文本
doc.save(os.path.join(OutPutPath,OutPutFileName)) # 保存到文件

# 编号生成函数
def NumberCalculator(Number,length = 3):
NuStr = ""
NumLen = len(str(Number))
#print("Numlen = {}, number = {}, length = {}".format(NumLen,Number,length))
if(length != 1 and length != 2 and length != 3 ):
print("序号长度输入有误!仅支持1、2、3,您输入的length参数为:{}".format(length))
print("ByeBye!")
MyExit("BHSC")
else:
#print("进入正常参数流程")
if(length == 1):
#print("进入长度为1分支")
NuStr = str(Number)
elif(length == 2):
#print("进入长度为2分支")
if(NumLen == 1):
NuStr = "0" + str(Number)
else:
NuStr = str(Number)
elif(length == 3):
#print("进入长度为3分支")
if(NumLen == 1):
#print("00")
NuStr = "00" + str(Number)
elif(NumLen == 2):
#print("0")
NuStr = "0" + str(Number)
else:
#print("没有领")
NuStr = str(Number)
else:
#print("Error!!!")
MyExit("BHSC")
#print("返回值:{}".format(NuStr))
return(NuStr)

# 新建文档的存放路径选择
def CalculationOfTheBuildDirectory(RunPath,NewName):
# 定义新建文档存放目录变量
OutPath = ""
# 新建文档存放目录默认为:NewName
DefaultOutPath = os.path.join(RunPath,NewName)
# 如果默认路径不存在则新建之
if(os.path.exists(DefaultOutPath) != True):
os.mkdir(DefaultOutPath)
OutPath = DefaultOutPath
# 如果存在默认路径,则寻找未占用的路径并新建之
else:
for j in range(0,999):
j += 1
k = NumberCalculator(j,3)
#print(k)
if(os.path.exists(DefaultOutPath + k) != True):
os.mkdir(DefaultOutPath + k)
OutPath = DefaultOutPath + k
#print(OutPath)
break
else:
continue
print("新文档路径:{}\n".format(OutPath))
return(OutPath)


# 中央调度单元(Control Center)
def CC():
RunPath = sys.path[0] # 获取当前运行路径

# ---生成模板文件列表---
# 配置模板文件路径
TemplatePath = os.path.join(RunPath,'Templates')
#print(TemplatePath)
# 调用模板文件路径获取程序
TemplateNameList = GetTemplate(TemplatePath)

# ---生成配置文件字典---
# 配置文件:用于替换的[标签-值]对,适合以字典形式存储
# 配置文件路径
ConfigTxtPath = os.path.join(RunPath,'MyConfig.txt')
# 调用配置文件解析程序,返回配置字典
Context = GetConfigTxt(ConfigTxtPath)

# 生成文件放置于"New"文件中,如果存在"New"文件夹,则在其后追加01、02……等流水号
# 获取输出文件路径
OutPut = CalculationOfTheBuildDirectory(RunPath,'NewFiles')
#print("新创建文档放置路径:{}".format(OutPut))

# ---调用文本替换程序---
number = 0
for i in TemplateNameList:
number += 1
docx_path, docx_name = TemplatePath, i
OutPutFileName = str(number) + r"-" + Context["项目名称"] + "-" + i

MakeDocx(docx_path,docx_name, OutPut, OutPutFileName, Context)


if(__name__ == "__main__"):
MyBanner()
CC()
MyExit()
#for i in range(0,880):
# CC()

程序运行界面

程序目录

程序下载地址:
链接https://pan.baidu.com/s/1qSfAoObK0lWSL-1IYjYmNw
提取码:rijo

主程序使用nuitka打包,包含了运行库所以体积稍大,仅支持Win10系统,Win7无法运行,360杀毒软件可能会报毒,火绒正常,代码已公开,请放心使用。(主程序37.1MB,MD5值:5c76d9ac6e8e8112bf8ca)


文章使用小书匠MarkDown编辑器书写,大家可以通过本站小书匠邀请码一文获取邀请码下载链接


秋风木叶
2021-6-6
y
有您的赞赏,我会更加有动力!