赞
踩
着急的可以直接去最后面复制代码即可!
喜欢收藏,这都是我几天的心血,需要请免费直接拿走。
看此表,我在想,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

可以批量操作多个表格哈哈哈哈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。