一、开始之前的准备工作:
环境:操作系统win10,python2.7.15,开发软件为pycharm社区版
问题1:如何在pycharm中切换python版本。
原因:现在有些模块支持的Python版本不一样,所以在开发时经常需要切换版本来开发。
1、点击file->setting
2、切换需要的环境
注意:选择环境前必须安装了对应的python版本,并且添加到环境变量中。
问题2:如何给不同版本的python导入对应的模块。
导入模块一般两种方式:
1、使用pycharm来导入(推荐)
2、使用cmd的pip install xxx 命令方式。
二、开始doc或者docx的替换操作
需求:我需要把文件夹下的所有docx文件即一整套模板,中的某些字符进行替换,然后生成填完后的文件。
参考之前写的:https://www.jianshu.com/p/95bbb29ce3a9
1、创建py文件的时候注意,2.7.15版本默认编码格式不是utf-8,而我们一般操作字符都是以utf-8的方式,故需要添加一些代码把编码格式转为utf-8。python3之后默认格式都是utf-8了。
在文件开头添加如下代码:
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
2、操作docx文件需要导入的模块
2.1、python-docx (操作docx文件)
看模块名就知道该模块只能处理docx不能处理doc
2.2、pywin32 (方便Python调用windows的API)
from docx import Document
from docx.shared import Pt #磅数
from docx.oxml.ns import qn #chinese
import os
from win32com import client as wc #导入doc转docx
3、开始编写脚本
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from docx import Document
from docx.shared import Pt #磅数
from docx.oxml.ns import qn #chinese
import os
from win32com import client as wc #导入doc转docx
#找到文件夹下的所有doxc文件并获得文件名
def file_name(file_dir):
for root,dirs,files in os.walk(file_dir):
return files
#遍历刚才找到的所有文件夹然后替换关键字
def change_text(old_text, new_text,document):
all_paragraphs = document.paragraphs
for paragraph in all_paragraphs:
for run in paragraph.runs:
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
all_tables = document.tables
for table in all_tables:
for row in table.rows:
for cell in row.cells:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
#把doc文件转为docx文件
def doc_to_docx(file1,file2):
word = wc.Dispatch("Word.Application") # 打开word应用程序
doc = word.Documents.Open(file1) #打开word文件
doc.SaveAs("{}x".format(file2), 12) #另存为后缀为".docx"的文件,其中参数12指docx文件
doc.Close() #关闭原来word文件
word.Quit()
return "{}x".format(file) #返回的是一个file对象或者文件名称
#把docx文件转为doc文件
def docx_to_doc(file1,file2):
word = wc.Dispatch("Word.Application") # 打开word应用程序
doc = word.Documents.Open(file1) #打开word文件
doc.SaveAs("{}".format(file2[:-1]), 0) #另存为后缀为".docx"的文件,其中参数12指docx文件
doc.Close() #关闭原来word文件
word.Quit()
return "{}x".format(file) #返回的是一个file对象或者文件名称
#进行批量替换并生成新文件
#第一个参数传入模板文件夹路径,第二个参数导出结果到某个文件夹路径(请写绝对路径)
def deal_task(importPath,exportPath):
words = file_name(importPath) #获取所有文件的文件名
for words_name in words:
print words_name #打印获取的文件名查看是否有错误
#只有后缀为docx的文件可以继续执行
if words_name.find('.docx') != -1:
#PackageNotFoundError,捕获一下该异常
try:
document = Document(importPath+'/'+words_name) #读取当前遍历的文件
document.styles['Normal'].font.name = u"仿宋_GB2312"
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u"仿宋_GB2312")
document.styles['Normal'].font.size = Pt(12)
#进行替换操作
#old_text和new_text都是动态传入
#遍历entry_list和entry_str来执行动态操作,偶是old奇数是new
for num in range(0,len(entry_list)-1,2):
#输入框任一一栏没有输入内容不会执行替换操作
if entry_list[num] != '' and entry_list[num+1] != '':
change_text(entry_list[num].strip(),entry_list[num+1].strip(),document)
print 'old_text: ' + entry_list[num]
print 'new_next: ' + entry_list[num+1]
document.save(exportPath+"/"+"auto"+words_name) #默认存储为auto+原文件名的方式
except Exception as e:
print '打开docx文件失败'
print e
print "完成!"
#进行批量转换并生成转换后的文件到文件夹内
#第一个参数导入的路径,第二个是导出的路径
def docTodocx(importPath,exportPath):
fileNames = file_name(importPath) # 获得所有文件名
# filePath = importPath
for fileName in fileNames: # 遍历文件夹下的所有文件
# 先判断是否有doc然后再判断docx,只要不是doc直接跳过
# fileName = fileName.decode('gb2312').encode('utf-8')
if fileName.find('doc') != -1:
print '进入doc处理循环'
file1 = importPath + "/" + fileName
print 'file1:' + file1
file1 = file1.decode('utf-8').encode('gb2312')
# print 'gb2312编码的file1: ' + file1
file2 = exportPath + "/" + fileName
print 'file2:' + file2
file2 = file2.decode('utf-8').encode('gb2312')
doc_to_docx(file1, file2)
#设定自己要替换的数组第一个是old_text,第二个是new_text依次次类推
entry_list = ["X1","2021","X2","2022"]
if __name__ == "__main__":
#如果模板全是docx只需要调用deal_task()函数就行了,不是的话先调用docTodocx转为docx
#第一步把doc转为docx
docTodocx("I:/pythonProject1/docx_operation/importPath","I:/pythonProject1/docx_operation/temporary")
deal_task("I:/pythonProject1/docx_operation/temporary","I:/pythonProject1/docx_operation/exportPath")
注意:这里docTodocx()和docxTodoc()就是对应doc文件转docx和docx转doc。程序这里只使用docTodocx()函数。
4、使用方式
新建三个文件夹
1exportPath(存放结果)
2importPath(存放模板)
3temporary(存放临时模板如经过转换得到的docx)
然后开始执行脚本,即可实现批量替换模板中的文字。如我这里只用两个文件作为演示
展示操作步骤:
1、准备将1.docx和2.docx文件内的X1和X2分别替换成2021和2022
2、打开脚本进行操作
#设定自己要替换的数组第一个是old_text,第二个是new_text依次次类推
entry_list = ["X1","2021","X2","2022"]
if __name__ == "__main__":
#如果模板全是docx只需要调用deal_task()函数就行了,不是的话先调用docTodocx转为docx
#第一步把doc转为docx
docTodocx("I:/pythonProject1/docx_operation/importPath","I:/pythonProject1/docx_operation/temporary")
deal_task("I:/pythonProject1/docx_operation/temporary","I:/pythonProject1/docx_operation/exportPath")
注意:把绝对路径中的反斜杠改成斜杆/
3、控制台会显示要替换的内容和替换的内容
4、查看文件是否生成且替换成功
使用的注意事项:
1、复制代码然后安按照规则填入路径在win10,python2.7.15下可正常运行,写之前自己测试过没问题。
2、要替换的字符串必须只能是数字加字母之前文章中也提过。
3、替换的时候必须关闭WPS或者word软件,因为程序运行时候需要打开对应的软件进行操作。
4、文件名或者路径有中文的时候控台会乱码,程序是可以正常执行的。原因是windows中的中文一般编码都是gbk或者gb2312,控制台只能显示utf-8。
注:转载请注明出处
本文如果对你有帮助的话希望能给我点个赞哦~