Python操作Excle表格办公这么多库选openpyxl还是xlrd,xlwt。怎么筛选按特定条件行删除包含某一个值

着急的可以直接去最后面复制代码即可!

喜欢收藏,这都是我几天的心血,需要请免费直接拿走。

看此表,我在想,xls、xlsx都是表格,那我肯定选择都支持的库学习,这样才能效率最高。如果使用xlrd来读,又用xlwt来写这不是很麻烦吗。以下是我统计了CSDN上前20页提到的对应库的数量。只看代码上引入的次数,同一页面仅统计一次。

xlrd 8次

xlwt 9次

xlutils 2次

xlwings 1次

openpyxl 5次

wlswriter 3次

win32com 1次

dataNitro 1次

pandas 4次

此次的操作我主要使用xlsx表格,所以我的目标是学习win32com、xlwings、openpyxl其中一个。

根据统计次数,决定学习openpyxl。

我将使用7天学会使用openpyxl,然后用它实现对表格的筛选去重、按特定条件删除整行等操作,具体要求如下:

1.无条码产品,整行删除

2.低于某进价,低于某售价,整行删除

3.重复条码,整行删除

4.特定字符条码,整行删除

5.在G列右侧插入一列,毛利,等于E列减去F列

6.在毛利右侧插入一行,毛利率,算出毛利率

7.将毛利率低于20%产品,调价至20%毛利,替换掉对应售价

8.将整个表格对应名称(商品条码、最新售价、库存),替换到另一个表格里面(最新售价、库存、商品条码),以符合另一个软件的上传格式。

这只是新建产品所要操作的要求,还有删除产品和修改产品又是另外的表,如果这次我能成功,下次再试试挑战吧。

每个月我都要手动操作接近30张表,操作得手都酸了。所以我在想是不是学会编程会更快一些。希望难度不大,希望我能耐得住寂寞。

每一项新的挑战都需要成就感的累积。

我希望我的成就感从第一条代码开始。

打开CMD输入

pip install openpyxl

我安装了pycharm,我是在pycharm里-文件-设置-项目-python解释器+openpyxl,然后点安装就成功了。下面是我的第一行代码:import  openpyxl

import openpyxl  #导入openpyxl这个库

这import是导入的意思,这个openpyxl就相当于是一个功能,导入了这个功能才能使用它这个库里面的功能。然后我要查到这个库经常使用的哪些命令,能够对EXCEL进行操作。

我想实现的仅仅是功能,所以很多语句和语法并不需要完全懂。就像是堆积木,把一堆别人的代码拼到一起,希望它能按我的想法运行。

1.步骤应该如下

1.打开表格

2.修改表格内容

3.保存表格并改名

打开表格应该用什么语句:

wb=openpyxl.load_workbook('001.xlsx')             #这个001是表格名字,打开表格然后给它取名叫wb
sheets=wb.sheetnames                            #这个应该是表格下方的名称
print(sheets)                                   #打印出这个表格它的名字                         

wb就代表现在在操作的表格名称,表格要放到这个程序在一个文件夹里。免得去查找表格位置,省事一些。

现在就是先查找条码这一列,如果为空,就删除整行

import openpyxl
wb=openpyxl.load_workbook(filename='7005.xlsx')
ws=wb.active
row_number=0                             							#行号=0
for row in ws.iter_rows():               							#迭代遍历每行
	if row[4].value=='/':                							#如果第5列里某行的值=/
		row_number=row[4].row            							#获得那行的行号!
		ws.delete_rows(row_number)       							#删除当前行!
wb.save(filename='7005.xlsx')
wb.close

很幸运我找到这个代码了,只要把对应的值改一下就可以实现按条件删除某行了。结果这个列好像是错了,我得找个简单得表格试验一下。这个是表格。

 结果是这样

发现这个/这个符号都没有删除,看起来像是没反应啊。又修改一下测试

import openpyxl
wb=openpyxl.load_workbook(filename='7005.xlsx')
ws=wb.active
row_number=0                             							#行号=0
for row in ws.iter_rows():               							#迭代遍历每行
	if row[3].value=='国药准字J2017':                				#如果第5列里某行的值=
		row_number=row[3].row            							#获得那行的行号!
		ws.delete_rows(row_number)       							#删除当前行!
wb.save(filename='7005.xlsx')
wb.close

结果如下

删掉了,是列数没对吗?实际表格里面是第四列,代码里面写的3列,它是从0开始0,1,2,3。所以代码写的3,实际是第四列。

再试试其他的符号,

import openpyxl
wb=openpyxl.load_workbook(filename='7005.xlsx')
ws=wb.active
row_number=0                             							#行号=0
for row in ws.iter_rows():               							#迭代遍历每行
	if row[3].value=='/'or'/ 'or'//':                							#如果第5列里某行的值=/
		row_number=row[3].row            							#获得那行的行号!
		ws.delete_rows(row_number)       							#删除当前行!
wb.save(filename='7005.xlsx')
wb.close

结果

哟,这出的什么问题。

或者它是看不懂or 吗,删除了几行了。

由于没有保存和复制和备份,所以重新弄下再测试。

import openpyxl
wb=openpyxl.load_workbook(filename='7005.xlsx')
ws=wb.active
row_number=0                             							#行号=0
for row in ws.iter_rows():               							#迭代遍历每行
	if row[3].value=='*':                							#如果第4列里某行的值=*
		row_number=row[3].row            							#获得那行的行号!
		ws.delete_rows(row_number)       							#删除当前行!
wb.save(filename='7005.xlsx')
wb.close

不能用or看样子,这下就是正常删除了*

但是这些符号太多,我只想要留下数字类的条码,那么应该要选择不等于数字的全删除

太搞了,我试了下2000行的表格,过了几分钟都还没删除完,网上查说用for有点慢,要复制一个表再重新建立一个新表比较快。

所以我又重新找了个程序

一眼看去很容易让人“信心爆棚”,容易产生“这个世界上没有做不成的事情”的想法。慢慢看,一行一行的来,重新写过备注。


import openpyxl
 
#参数配置
COL_NUM = 19   #设置条件列号,S列是19,读者可根据自身需求自定义
KEY_WORD = "手机"   #设置判断条件,读者可根据自身需求自定义
INPUT_FILE = 'test_file.xlsx'  # 输入文件名
OUTPUT_FILE = 'test_final.xlsx' # 输出文件名
 
#打开待复制表
wb1 = openpyxl.load_workbook(INPUT_FILE)
ws1 = wb1.active
 
# 创建新的空表
wb2 = openpyxl.Workbook()
ws2 = wb2.active
 
row_sum = ws1.max_row
k = 0
m = 0
 
#找出S列中仅含“手机”的行并复制A:R列单元格到下一行
for i in range(1,row_sum+1):
    if ws1.cell(row=i,column=COL_NUM).value == KEY_WORD:
        for j in range(1,COL_NUM):
            ws1.cell(row=i+1,column=j).value = ws1.cell(row=i,column=j).value #将前18列复制到i+1行
#         k = k + 1
# print("Step1:已完成复制-",k,"- 行")
 
#找出S列中仅含“手机”的行并跳过
#openpyxl的delete_row函数太慢,每删除一行都会刷新原表
for row_value in ws1.values:
    if row_value[18] == KEY_WORD:
#             m = m + 1
            continue
    ws2.append(row_value)
# print("Step2:已删除-",m,"- 行")
 
wb2.save(OUTPUT_FILE)
#print("Step3:新的EXCEL已生成,耗时:")

突然想为什么这个不能把备注单独弄到后面统一排行比较直观呢,备注和这个代码夹杂在一起看起来就吓人。

有点费时间了,1小时一会儿就过去了,还没搞清楚,我准备休息一会儿。荒野求生就是这么困难。

过了几天了!

不追忆失去的时光,因为无法改变只会平添烦恼,也不要担心未来的到来,因为它还未到来,只需要做好手上的事情,相信它不是高不可攀的大山,接着来吧。

import openpyxl
# 参数配置
COL_NUM = 4  										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = "6"  									# 设置判断条件,包含6这个数字的
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = '5店.xlsx'  							# 输出文件名

													# 打开待复制表命名为ws1
wb1 = openpyxl.load_workbook(INPUT_FILE)
ws1 = wb1.active

													# 创建新的空表ws2(这个表相当于是又6数字存在的所有行组成)
wb2 = openpyxl.Workbook()
ws2 = wb2.active

row_sum = ws1.max_row								#行数有多少
k = 0
m = 0

													# 找出列中仅含“6”的行并复制A:R列单元格到下一行
for i in range(1, row_sum + 1):						#从第一行到最后一行
	if ws1.cell(row=i, column=COL_NUM).value == KEY_WORD:		#如果表ws1中元素=6
		for j in range(1, COL_NUM):								#从第一列到最后一列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value  # 将前多少列复制到i+1行
#         k = k + 1
# print("Step1:已完成复制-",k,"- 行")

# 找出S列中仅含“手机”的行并跳过
# openpyxl的delete_row函数太慢,每删除一行都会刷新原表
for row_value in ws1.values:
	if row_value[3] == KEY_WORD:                            #如果4列里=6
		#             m = m + 1
		continue
	ws2.append(row_value)
# print("Step2:已删除-",m,"- 行")

wb2.save(OUTPUT_FILE)
# print("Step3:新的EXCEL已生成,耗时:")

大致查了一下翻译,大致推测出意思。运行后,很快完成了,但是表格无任何变化仅仅是复制出来一份表格。

每一个技能的练就,都是无数挫折的百炼成钢。继续玩。

ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value  # 将前多少列复制到i+1列

仔细查看这行,好像是为了复制ws1的值到另一个表里。但是依然写的ws1.试试是不是这里错了。改成

"""
import openpyxl
wb=openpyxl.load_workbook('7005.xlsx')             #这个7005是表格名字,打开表格然后给它取名叫wb
sheets=wb.sheetnames                            #这个应该是表格下方的名称
print(sheets)                                   #打印出这个表格它的名字
"""
import openpyxl
# 参数配置
COL_NUM = 4  										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = "6"  									# 设置判断条件,包含6这个数字的
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = '5店.xlsx'  							# 输出文件名

													# 打开待复制表命名为ws1
wb1 = openpyxl.load_workbook(INPUT_FILE)
ws1 = wb1.active

													# 创建新的空表ws2(这个表相当于是又6数字存在的所有行组成)
wb2 = openpyxl.Workbook()
ws2 = wb2.active

row_sum = ws1.max_row								#行数有多少
k = 0
m = 0

													# 找出列中仅含“6”的行并复制A:R列单元格到下一行
for i in range(1, row_sum + 1):						#从第一行到最后一行
	if ws1.cell(row=i, column=COL_NUM).value == KEY_WORD:		#如果表ws1中元素=6
		for j in range(1, COL_NUM):								#从第一列到最后一列
			ws2.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value  # 将前多少列复制到i+1列
k+=1
print("Step1:已完成复制-",k,"- 行")

# 找出S列中仅含“手机”的行并跳过
# openpyxl的delete_row函数太慢,每删除一行都会刷新原表
for row_value in ws1.values:
	if row_value[3] == KEY_WORD:                            #如果4列里=6
		m = m + 1
		continue
	ws2.append(row_value)									#ws2追加什么 行的值
print("Step2:已删除-",m,"- 行")

wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

调整了一下,我看看是不是备注哪些没写对。生成的表还是和之前一样。

 从复制了多少行和删除了多少行的备注可以看出K是复制的行数,M是删除的行数,这里可能是复制的行数出了问题,那么可能是我改动那改错了。

出现了

原表2394条,生成的表是2393条,所以答案是,keeyword是需要删除的词

然后我让

KEY_WORD = "/"  	

删除了78行,哈哈删除成功。

下面是我整理好的代码,每一行都有备注,应该很方便了,

import openpyxl
COL_NUM = 4  										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = "/"  									# 设置判断条件,包含/这个符号的会被删除
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = '5店.xlsx'  							# 输出文件名													
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行
	if ws1.cell(row=i, column=COL_NUM).value == KEY_WORD:				#如果表ws1中元素=/
		for j in range(1, COL_NUM):										#从第一列到最后一列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value  		
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:
	if row_value[3] == KEY_WORD:                     #如果4列里值=/
		m = m + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:已删除-",m,"- 行")						#M是删除的多少行

wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

但是删除一个一个改条件未免太麻烦,还得想办法让他这个KEY_WORD成为一个表类型的,然后只要是在这个表里的词,全部都能被删除。这样才能一劳永逸。

中间耽误一天,今天继续了。把判断里的==换为了in,把key_word换成了[]列表。这下子一下删除了很多,但是还剩下空格删不掉。

import openpyxl
COL_NUM = 4  										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//"]  									            
                                                    # 设置判断条件,包含/这个符号的会被删除
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = '5店.xlsx'  							# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				#如果表ws1中元素=/
		for j in range(1, COL_NUM):										#从第一列到最后一列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:
	if row_value[3] in KEY_WORD:                     #如果4列里值=/
		m = m + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:已删除-",m,"- 行")						#M是删除的多少行

wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

必须把空格再删除,加了一个None这个元素在列表里

KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//",None]  									

哈哈,又一个问题被解决,就像是解锁了一个新的技能。

删除成功了,我太高兴了。

还没完,我要条码里面包含,包含/的都删除,再去除重复的。这个问题希望有人能知道在评论区告诉我,我这边不影响就不弄了。

下一项,删除低于某个价格的值

import openpyxl
COL_NUM = 4  										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","合川","******","****","*****","","","","",None]  									# 设置判断条件,包含/这个符号的会被删除
KEY_WORD2 = 0.2
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = '5店.xlsx'  							# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
o = 0
p = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				#如果表ws1中元素=/
		for j in range(1, COL_NUM):										#从第一列到最后一列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:
	if row_value[3] in KEY_WORD:                     #如果4列里值=/
		m = m + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:已删除-",m,"- 行")						#M是删除的多少行
for row_value in ws1.values:
	if row_value[4] <KEY_WORD2:                     #如果5列里值<0.2
		o = o + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:比较-",o,"- 行")
for row_value in ws1.values:
	if row_value[6] <KEY_WORD2:                     #如果6列里值<0.2
		p = p + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:比较-",p,"- 行")

wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

备注懒得改很多仔细看下哦,就说这列的数要低于某个值。我把这个删除这个直接复制的。

结果提示

说是str和float不能比较,意思是它识别的应该是字符串,但是比较的是一个浮点数的值。

那么怎么把它整成浮点数才能对比吧。str()可以变成字符串,float()可以变成浮点数。

研究了半天,我准备继续用列表

import openpyxl
COL_NUM = 4  										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ",None]  					
KEY_WORD2 = ["0","0.001"]
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = '5店.xlsx'  							# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
o = 0
p = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				#如果表ws1中元素=/
		for j in range(1, COL_NUM):										#从第一列到最后一列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:
	if row_value[3] in KEY_WORD:                     #如果4列里值=/
		m = m + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:已删除-",m,"- 行")						#M是删除的多少行
for row_value in ws1.values:						#
	if row_value[4] in KEY_WORD2:                     #如果5列里值里有KEY_WORD2
		o = o + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:比较-",o,"- 行")
for row_value in ws1.values:
	if row_value[5] in KEY_WORD2:                     #如果6列里值里有KEY_WORD2
		p = p + 1
		continue
	ws2.append(row_value)							#ws2追加什么 行的值
print("Step2:比较-",p,"- 行")
wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

结果生成的表格有6000多行,我本身的表格才2000行,仔细查看了,应该是

ws2.append(row_value)	

这个就代表存储吧,存储了三遍,所以有6000多条了

for row_value in ws1.values:	

这行也重复了三遍,是不是有点问题,再研究一下。

又搞了几个小时,难搞啊,一个小程序搞这么久。要劳逸结合,不然我的头发就没了。

又过了两天了,今天继续玩

我得仔细理一下思路,不然这样搞起来很没有效率

1.首先是导入openpyxl

import openpyxl

2.然后是定义好各个变量

COL_NUM = 4                                # 设置条件列号,直接数第四列是商品条码
COL_NUM2 = 6
KEY_WORD = ["/","禁止挂网","-","00",None]   # 设置判断条件,包含/这些符号的会被删除
KEY_WORD2 = ["0","0.001"]
INPUT_FILE = '7005.xlsx'                             # 输入文件名
OUTPUT_FILE = '5店.xlsx'                             # 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)             # 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()                            # 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row                                #行数有多少
k = 0
m = 0
o = 0
p = 0

然后是遍历和筛选出来哪行需要删除

for i in range(1, row_sum + 1):											
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				
		for j in range(1, COL_NUM):										
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										
for row_value in ws1.values:
	if row_value[3] in KEY_WORD:                    
		m = m + 1
		continue
	ws2.append(row_value)							
print("Step2:已删除-",m,"- 行")						

最后保存

wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

想想这么简单的程序,搞了这么久,我不得不感叹,对于老手来说理所应当的操作,对于新手都如登山一般。我又仔细梳理了一遍备注和测试,然后查询各种单词的意思并理解。

import openpyxl
COL_NUM = 10 										# 设置条件列号,直接数第四列是商品条码
COL_NUM2 = 6										# 设置条件列号,直接数第6列是商品价格
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","合川","******","****","*****","","","","",None]  									# 设置判断条件,包含/这个符号的会被删除
KEY_WORD2 = ["0","0.001"]
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = INPUT_FILE+'已筛选.xlsx'  				# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
o = 0
p = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行  row:行  COL:列,这个时候i就是行数
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				#如果表ws1中的元素在KEY_WORD里  行=i 列column
		for j in range(1, COL_NUM):										#从第一列到4列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:						#行值在ws1的值,意思是复制ws1的每一行,这一串代表删除了哪些
	if row_value[3] in KEY_WORD:                    #如果行值里的第四个值在key_word里面
		m = m + 1
		continue									#这个continve很重要,可以跳出最外层的for循环,意思是如果行值在key_word里,就跳出
	ws2.append(row_value)							#没有这一行,生成的表格就是空的,这一行也必须在这个位置
print("Step2:已删除-",m,"- 行")						#M是删除的多少行
wb2.save(OUTPUT_FILE)                               #保存为表格2输出文件名为
print("Step3:新的EXCEL已生成,耗时:")					#打印Step3:新的EXCEL已生成,耗时:

那么这个continue就关键,第二个for的意思是  复制第一个表里的每一行,到第二个表格里,如果4列值里有key_word值,那么就跳过复制这一行。

那么我还需要跳过另外的行,就需要在continue上下功夫了。

import openpyxl
COL_NUM = 10 										# 设置条件列号,直接数第四列是商品条码
COL_NUM2 = 6										# 设置条件列号,直接数第6列是商品价格
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","合川","******","****","*****","","","","",None]  									# 设置判断条件,包含/这个符号的会被删除
KEY_WORD2 = ["0","0.001","0.0","0.01","0.1",None]
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = INPUT_FILE+'已筛选.xlsx'  				# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
o = 0
p = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行  row:行  COL:列,这个时候i就是行数
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				#如果表ws1中的元素在KEY_WORD里  行=i 列column
		for j in range(1, COL_NUM):										#从第一列到4列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:						#行值在ws1的值,意思是复制ws1的每一行,这一串代表删除了哪些
	if row_value[3] in KEY_WORD:                    #如果行值里的第四个值在key_word里面
		m = m + 1
		continue									#这个continve很重要,可以跳出最外层的for循环,意思是如果行值在key_word里,就跳出
	elif row_value[4] in KEY_WORD2:                    #如果行值里的第5个值在key_word里面
		m = m + 1
		continue
	elif row_value[3] in KEY_WORD2:                    #如果行值里的第6个值在key_word里面
		m = m + 1
		continue
	ws2.append(row_value)							#没有这一行,生成的表格就是空的,这一行也必须在这个位置
print("Step2:已删除-",m,"- 行")						#M是删除的多少行
wb2.save(OUTPUT_FILE)                               #保存为表格2输出文件名为
print("Step3:新的EXCEL已生成,耗时:")					#打印Step3:新的EXCEL已生成,耗时:

加了两个elif,复制出来的表格没有反应

我在想是不是ws2.append(row_value)也应该加在里面

import openpyxl
COL_NUM = 10 										# 设置条件列号,直接数第四列是商品条码
COL_NUM2 = 6										# 设置条件列号,直接数第6列是商品价格
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","合川","******","****","*****","","","","",None]  									# 设置判断条件,包含/这个符号的会被删除
KEY_WORD2 = ["0","0.001","0.0","0.01","0.1",None]
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = INPUT_FILE+'已筛选.xlsx'  				# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
k = 0
m = 0
o = 0
p = 0
for i in range(1, row_sum + 1):											#从第一行到最后一行  row:行  COL:列,这个时候i就是行数
	if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD:				#如果表ws1中的元素在KEY_WORD里  行=i 列column
		for j in range(1, COL_NUM):										#从第一列到4列
			ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
	k+=1
print("Step1:已完成复制-",k,"- 行")										#K是需要复制的多少行
for row_value in ws1.values:						#行值在ws1的值,意思是复制ws1的每一行,这一串代表删除了哪些
	if row_value[3] in KEY_WORD:                    #如果行值里的第四个值在key_word里面
		m = m + 1
		continue
	ws2.append(row_value)	#这个continve很重要,可以跳出最外层的for循环,意思是如果行值在key_word里,就跳出
	if row_value[4] in KEY_WORD2:                    #如果行值里的第5个值在key_word里面
		m = m + 1
		continue
	ws2.append(row_value)
	if row_value[3] in KEY_WORD2:                    #如果行值里的第6个值在key_word里面
		m = m + 1
		continue
		ws2.append(row_value)
	ws2.append(row_value)							#没有这一行,生成的表格就是空的,这一行也必须在这个位置
print("Step2:已删除-",m,"- 行")						#M是删除的多少行
wb2.save(OUTPUT_FILE)                               #保存为表格2输出文件名为
print("Step3:新的EXCEL已生成,耗时:")					#打印Step3:新的EXCEL已生成,耗时:

结果是出来的表有6000行了,本身2000多行的表格

又过了一天

import openpyxl
COL_NUM = 10 										# 设置条件列号,直接数第四列是商品条码
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".",None]  									
INPUT_FILE = '7005.xlsx'  							# 输入文件名
OUTPUT_FILE = INPUT_FILE+'已筛选.xlsx'  				# 输出文件名
wb1 = openpyxl.load_workbook(INPUT_FILE)			# 打开待复制表命名为ws1
ws1 = wb1.active
wb2 = openpyxl.Workbook()							# 创建新的空表ws2
ws2 = wb2.active
row_sum = ws1.max_row								#行数有多少
m = 0
for row_value in ws1.values:						
	if row_value[3] in KEY_WORD:                    #如果行值里的第四个值在key_word里面
		m = m + 1
		continue									
	ws2.append(row_value)							 #没有这一行,生成的表格就是空的
print("Step2:已删除-",m,"- 行")						 #M是删除的多少行
wb2.save(OUTPUT_FILE)                                #保存为表格2输出文件名为
print("Step3:新的EXCEL已生成,耗时:")					 #打印Step3:新的EXCEL已生成,耗时:

我发现只需要这么短的代码也能运行,就是说筛选主要靠最后这段for

for in 说明:是循环结构的一种,经常用于遍历字符串、列表,元组,字典等 格式

continue语句跳过本次循环

经过一上午的操作,最终表格如下

import openpyxl																
KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","******","****","0.01","*****","0.1","0.001","0","",None,0,0.01,0.001,0.1,0.0]
INPUT_FILE = '7005.xlsx'
OUTPUT_FILE = '已筛选' +INPUT_FILE
wb1 = openpyxl.load_workbook(INPUT_FILE)
ws1 = wb1.active
wb2 = openpyxl.Workbook()
ws2 = wb2.active
k = 0
m = 0
for row_value in ws1.values:
	if row_value[3] in KEY_WORD:
		m = m + 1
		continue
	elif row_value[4] in KEY_WORD:
		m = m + 1
		continue
	elif row_value[5] in KEY_WORD:
		m = m + 1
		continue
	ws2.append(row_value)
print("Step2:已删除-",m,"- 行")
wb2.save(OUTPUT_FILE)
print("Step3:新的EXCEL已生成,耗时:")

哈哈哈哈哈哈哈哈哈哈哈哈哈哈,成就感太有了,终于,终于,完成了,giaogiaogiao!

KEY_WORD代表需要删除的字符和数值,表格文件要和python文件放一个位置。

收师傅,我需要一个python的师傅,救救孩子,bug滞销了。

import openpyxl

KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**",None,0,0.01,0.001,0.1,0.0,0.000001]
for a in range(1,11):
	INPUT_FILE = '700'+str(a)+'.xlsx'
	OUTPUT_FILE = '已筛选' +INPUT_FILE
	wb1 = openpyxl.load_workbook(INPUT_FILE)
	ws1 = wb1.active
	wb2 = openpyxl.Workbook()
	ws2 = wb2.active
	k = 0
	m = 0
	for row_value in ws1.values:
		if row_value[3] in KEY_WORD:
			m = m + 1
			continue
		elif row_value[4] in KEY_WORD:
			m = m + 1
			continue
		elif row_value[5] in KEY_WORD:
			m = m + 1
			continue
		ws2.append(row_value)
	print("Step2:已删除-",m,"- 行")
	wb2.save(OUTPUT_FILE)
	print("Step3:新的EXCEL已生成,这是执行到第:",a,"个表")
	a+=1

可以批量操作多个表格哈哈哈哈。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值