用Python实现Excel表格的多对多批量替换

需求:对Excel表格中的字符串进行多对多的批量替换,如:

被替换  :替换为:
钢琴;小提琴;手风琴;二胡;琵琶;古筝;
跑步跳远

 将目标表格中想替换掉的字符串(如上表左列),替换为上表右列中的字符串。其中右边有多个值时,采用随机替换(如不需随机替换,则使用多对一或一对一的表格即可,如第三行)

实现的大致思路如下:

用到的库如下:

from openpyxl import load_workbook as lw
import re
import random

openpyxl用于进行Excel表的读写操作;

re用于替换时使用正则表达式(使用str.replace()也可以)

random用于随机出字符串 

一、分割字符串

def SplitString(sth):#按";"分割字符串,并去除末尾空白,返回为列表,用于处理要替换上去的字符串
    if not ";" in str(sth):
        return [str(sth)]
    lis=sth.split(";")
    if "" in lis:
        lis.remove("")
    return lis

测试结果:

>>>SplitString(1234)
['1234']
>>>SplitString("1234;5678;9101112;1314;")
['1234', '5678', '9101112', '1314']

通过分割字符串,可将从表格中读取到的元素分割为一个列表,便于后续进行替换

二、替换字符串

def ReplaceString(lisa,lisb,c):#字符串替换(只针对一行进行替换),参数1为要被替换的字符串列表,参数2为要替换上去的字符串列表,参数3为结果字符串
    for each in lisa:
        while each in c:
            c=re.sub(each,random.choice(lisb),c,1)#每次只进行一次替换,确保每次均为随机,不会出现重复
    return c

对一个单元格的字符串进行检索替换(替换内容为替换表的某一行)

测试结果:

>>>c="我喜欢踢足球,喜欢跑步,也喜欢钢琴、吉他和小提琴"
>>>lisa=["钢琴","吉他","小提琴"]
>>>lisb=["电子琴","贝斯","架子鼓"]
>>>ReplaceString(lisa,lisb,c)
'我喜欢踢足球,喜欢跑步,也喜欢贝斯、电子琴和贝斯'

以下为对一个单元格的字符串进行检索替换(替换内容为整张替换表) 

def ReplaceSth(a,b,c):#字符串替换(针对整张替换表),替换一个单元格的字符串
    c=str(c)
    for i in range(len(a)):
        c=ReplaceString(a[i],b[i],c)
    return c

三、读取替换表,进行分割操作,存储为两个列表

def GetReplaceSth(reFileName,reSheetNum):#读取替换表,并对字符串进行分割处理操作,保存为列表
    a=[]
    b=[]
    replaceWork=lw(filename=reFileName)
    replaceSheet=replaceWork[replaceWork.sheetnames[reSheetNum-1]]#选择表格
    replaceSheet=replaceWork.active#激活表格
    reCell=replaceSheet["A"]#读取A列(要被替换的字符串)
    reedCell=replaceSheet["B"]#读取B列(要替换上去的字符串)
    for i in reCell:
        lisa=SplitString(i.value)
        a.append(lisa)
    for j in reedCell:
        lisb=SplitString(j.value)
        b.append(lisb)
    return a,b

传入文件名和要读取的第n个sheet

四、Main函数

#输入替换表名及第几张表
reFileName=input("请输入替换表名称(如果不是xlsx格式,请加上格式名):")
if not reFileName.endswith(".xls"):
    reFileName+=".xlsx"
reSheetNum=int(input("第几张表(第一张表就填1):"))
a,b=GetReplaceSth(reFileName,reSheetNum)#对替换表元素进行字符串分割处理,保存为列表


#输入待替换表格名
reedFileName=input("请输入待替换的表格名称(如果不是xlsx格式,请加上格式名):")
if not reedFileName.endswith(".xls"):
    reedFileName+=".xlsx"
reedSheetNum=int(input("第几张表(第一张表就填1):"))

#输入起始单元格与结束单元格(左上与右下)
start=input("请输入起始单元格序号(左上角):")
ends=input("请输入结束单元格序号(右下角):")

#读取待替换表
replacedWork=lw(filename=reedFileName)
replacedSheet=replacedWork[replacedWork.sheetnames[reedSheetNum-1]]
replacedSheet=replacedWork.active

#读取范围单元格
cells=replacedSheet[start+":"+ends]

#对范围单元格进行替换操作
for i in cells:
    for j in i:
        ans=ReplaceSth(a,b,j.value)
        if str(j.value)!=ans:#只修改需要改动的单元格,对于不需要改动的单元格和空格不进行写入操作
            j.value=ans
replacedWork.save(filename="替换完成表.xlsx")#保存

'''
#全局替换,不进行范围选择
for row in replacedSheet.rows:
    for cell in row:#遍历操作
        ans=ReplaceSth(a,b,cell.value)
        if str(cell.value)!=ans:#只修改需要改动的单元格,对于不需要改动的单元格和空格不进行写入操作
            cell.value=ans
replacedWork.save(filename="替换完成表.xlsx")#保存
'''

需输入表格名称(.xlsx格式可直接输入表格名,.xls需加后缀)和第几张表(正常读数,不需要从程序员的0开始2333)

完成替换后,另存为“替换完成表.xlsx”,可按需修改

测试结果:

替换表:

 待替换表:

 运行程序&输入:

 结果:

 五、结语

因为工作需要所以做了这个简单的功能,尽可能做得泛用了些。没有用可视化的GUI,自由度还不是很高。按需修改吧

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值