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 ''' Created on 2021年5月31日 本程序的功能旨在根据模板文件生成新文档,减少文本替换的工作量,减少出错率 @author: 秋风木叶 '''
import docxtpl import sys, os import msvcrt
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! <<<<<<<<<<")
if(ErrorCode == "None"): print("ByeBye!!!") else: print("ByeBye!!!(错误代码:{})".format(ErrorCode))
MyBanner() print("按任意键退出……") ord(msvcrt.getch()) sys.exit()
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: 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)) if(length != 1 and length != 2 and length != 3 ): print("序号长度输入有误!仅支持1、2、3,您输入的length参数为:{}".format(length)) print("ByeBye!") MyExit("BHSC") else: if(length == 1): NuStr = str(Number) elif(length == 2): if(NumLen == 1): NuStr = "0" + str(Number) else: NuStr = str(Number) elif(length == 3): if(NumLen == 1): NuStr = "00" + str(Number) elif(NumLen == 2): NuStr = "0" + str(Number) else: NuStr = str(Number) else: MyExit("BHSC") return(NuStr)
def CalculationOfTheBuildDirectory(RunPath,NewName): OutPath = "" 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) if(os.path.exists(DefaultOutPath + k) != True): os.mkdir(DefaultOutPath + k) OutPath = DefaultOutPath + k break else: continue print("新文档路径:{}\n".format(OutPath)) return(OutPath)
def CC(): RunPath = sys.path[0]
TemplatePath = os.path.join(RunPath,'Templates') TemplateNameList = GetTemplate(TemplatePath) ConfigTxtPath = os.path.join(RunPath,'MyConfig.txt') Context = GetConfigTxt(ConfigTxtPath)
OutPut = CalculationOfTheBuildDirectory(RunPath,'NewFiles') 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()
|