当前位置:   article > 正文

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

xlwr 删除某一行

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

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

看此表,我在想,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.保存表格并改名

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

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

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

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

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

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

 结果是这样

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

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

结果如下

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

再试试其他的符号,

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

结果

哟,这出的什么问题。

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

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

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

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

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

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

所以我又重新找了个程序

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

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

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

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

过了几天了!

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

  1. import openpyxl
  2. # 参数配置
  3. COL_NUM = 4 # 设置条件列号,直接数第四列是商品条码
  4. KEY_WORD = "6" # 设置判断条件,包含6这个数字的
  5. INPUT_FILE = '7005.xlsx' # 输入文件名
  6. OUTPUT_FILE = '5店.xlsx' # 输出文件名
  7. # 打开待复制表命名为ws1
  8. wb1 = openpyxl.load_workbook(INPUT_FILE)
  9. ws1 = wb1.active
  10. # 创建新的空表ws2(这个表相当于是又6数字存在的所有行组成)
  11. wb2 = openpyxl.Workbook()
  12. ws2 = wb2.active
  13. row_sum = ws1.max_row #行数有多少
  14. k = 0
  15. m = 0
  16. # 找出列中仅含“6”的行并复制A:R列单元格到下一行
  17. for i in range(1, row_sum + 1): #从第一行到最后一行
  18. if ws1.cell(row=i, column=COL_NUM).value == KEY_WORD: #如果表ws1中元素=6
  19. for j in range(1, COL_NUM): #从第一列到最后一列
  20. ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value # 将前多少列复制到i+1
  21. # k = k + 1
  22. # print("Step1:已完成复制-",k,"- 行")
  23. # 找出S列中仅含“手机”的行并跳过
  24. # openpyxl的delete_row函数太慢,每删除一行都会刷新原表
  25. for row_value in ws1.values:
  26. if row_value[3] == KEY_WORD: #如果4列里=6
  27. # m = m + 1
  28. continue
  29. ws2.append(row_value)
  30. # print("Step2:已删除-",m,"- 行")
  31. wb2.save(OUTPUT_FILE)
  32. # print("Step3:新的EXCEL已生成,耗时:")

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

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

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

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

  1. """
  2. import openpyxl
  3. wb=openpyxl.load_workbook('7005.xlsx') #这个7005是表格名字,打开表格然后给它取名叫wb
  4. sheets=wb.sheetnames #这个应该是表格下方的名称
  5. print(sheets) #打印出这个表格它的名字
  6. """
  7. import openpyxl
  8. # 参数配置
  9. COL_NUM = 4 # 设置条件列号,直接数第四列是商品条码
  10. KEY_WORD = "6" # 设置判断条件,包含6这个数字的
  11. INPUT_FILE = '7005.xlsx' # 输入文件名
  12. OUTPUT_FILE = '5店.xlsx' # 输出文件名
  13. # 打开待复制表命名为ws1
  14. wb1 = openpyxl.load_workbook(INPUT_FILE)
  15. ws1 = wb1.active
  16. # 创建新的空表ws2(这个表相当于是又6数字存在的所有行组成)
  17. wb2 = openpyxl.Workbook()
  18. ws2 = wb2.active
  19. row_sum = ws1.max_row #行数有多少
  20. k = 0
  21. m = 0
  22. # 找出列中仅含“6”的行并复制A:R列单元格到下一行
  23. for i in range(1, row_sum + 1): #从第一行到最后一行
  24. if ws1.cell(row=i, column=COL_NUM).value == KEY_WORD: #如果表ws1中元素=6
  25. for j in range(1, COL_NUM): #从第一列到最后一列
  26. ws2.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value # 将前多少列复制到i+1
  27. k+=1
  28. print("Step1:已完成复制-",k,"- 行")
  29. # 找出S列中仅含“手机”的行并跳过
  30. # openpyxl的delete_row函数太慢,每删除一行都会刷新原表
  31. for row_value in ws1.values:
  32. if row_value[3] == KEY_WORD: #如果4列里=6
  33. m = m + 1
  34. continue
  35. ws2.append(row_value) #ws2追加什么 行的值
  36. print("Step2:已删除-",m,"- 行")
  37. wb2.save(OUTPUT_FILE)
  38. print("Step3:新的EXCEL已生成,耗时:")

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

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

出现了

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

然后我让

KEY_WORD = "/"  	

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

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

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

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

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

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

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

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

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

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

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

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

  1. import openpyxl
  2. COL_NUM = 4 # 设置条件列号,直接数第四列是商品条码
  3. KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","合川","******","****","*****","","","","",None] # 设置判断条件,包含/这个符号的会被删除
  4. KEY_WORD2 = 0.2
  5. INPUT_FILE = '7005.xlsx' # 输入文件名
  6. OUTPUT_FILE = '5店.xlsx' # 输出文件名
  7. wb1 = openpyxl.load_workbook(INPUT_FILE) # 打开待复制表命名为ws1
  8. ws1 = wb1.active
  9. wb2 = openpyxl.Workbook() # 创建新的空表ws2
  10. ws2 = wb2.active
  11. row_sum = ws1.max_row #行数有多少
  12. k = 0
  13. m = 0
  14. o = 0
  15. p = 0
  16. for i in range(1, row_sum + 1): #从第一行到最后一行
  17. if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD: #如果表ws1中元素=/
  18. for j in range(1, COL_NUM): #从第一列到最后一列
  19. ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
  20. k+=1
  21. print("Step1:已完成复制-",k,"- 行") #K是需要复制的多少行
  22. for row_value in ws1.values:
  23. if row_value[3] in KEY_WORD: #如果4列里值=/
  24. m = m + 1
  25. continue
  26. ws2.append(row_value) #ws2追加什么 行的值
  27. print("Step2:已删除-",m,"- 行") #M是删除的多少行
  28. for row_value in ws1.values:
  29. if row_value[4] <KEY_WORD2: #如果5列里值<0.2
  30. o = o + 1
  31. continue
  32. ws2.append(row_value) #ws2追加什么 行的值
  33. print("Step2:比较-",o,"- 行")
  34. for row_value in ws1.values:
  35. if row_value[6] <KEY_WORD2: #如果6列里值<0.2
  36. p = p + 1
  37. continue
  38. ws2.append(row_value) #ws2追加什么 行的值
  39. print("Step2:比较-",p,"- 行")
  40. wb2.save(OUTPUT_FILE)
  41. print("Step3:新的EXCEL已生成,耗时:")

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

结果提示

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

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

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

  1. import openpyxl
  2. COL_NUM = 4 # 设置条件列号,直接数第四列是商品条码
  3. KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ",None]
  4. KEY_WORD2 = ["0","0.001"]
  5. INPUT_FILE = '7005.xlsx' # 输入文件名
  6. OUTPUT_FILE = '5店.xlsx' # 输出文件名
  7. wb1 = openpyxl.load_workbook(INPUT_FILE) # 打开待复制表命名为ws1
  8. ws1 = wb1.active
  9. wb2 = openpyxl.Workbook() # 创建新的空表ws2
  10. ws2 = wb2.active
  11. row_sum = ws1.max_row #行数有多少
  12. k = 0
  13. m = 0
  14. o = 0
  15. p = 0
  16. for i in range(1, row_sum + 1): #从第一行到最后一行
  17. if ws1.cell(row=i, column=COL_NUM).value in KEY_WORD: #如果表ws1中元素=/
  18. for j in range(1, COL_NUM): #从第一列到最后一列
  19. ws1.cell(row=i + 1, column=j).value = ws1.cell(row=i, column=j).value
  20. k+=1
  21. print("Step1:已完成复制-",k,"- 行") #K是需要复制的多少行
  22. for row_value in ws1.values:
  23. if row_value[3] in KEY_WORD: #如果4列里值=/
  24. m = m + 1
  25. continue
  26. ws2.append(row_value) #ws2追加什么 行的值
  27. print("Step2:已删除-",m,"- 行") #M是删除的多少行
  28. for row_value in ws1.values: #
  29. if row_value[4] in KEY_WORD2: #如果5列里值里有KEY_WORD2
  30. o = o + 1
  31. continue
  32. ws2.append(row_value) #ws2追加什么 行的值
  33. print("Step2:比较-",o,"- 行")
  34. for row_value in ws1.values:
  35. if row_value[5] in KEY_WORD2: #如果6列里值里有KEY_WORD2
  36. p = p + 1
  37. continue
  38. ws2.append(row_value) #ws2追加什么 行的值
  39. print("Step2:比较-",p,"- 行")
  40. wb2.save(OUTPUT_FILE)
  41. print("Step3:新的EXCEL已生成,耗时:")

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

ws2.append(row_value)	

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

for row_value in ws1.values:	

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

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

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

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

1.首先是导入openpyxl

import openpyxl

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

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

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

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

最后保存

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

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

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

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

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

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

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

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

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

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

又过了一天

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

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

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

continue语句跳过本次循环

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

  1. import openpyxl
  2. KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**","***","--",".","/ ","//","******","****","0.01","*****","0.1","0.001","0","",None,0,0.01,0.001,0.1,0.0]
  3. INPUT_FILE = '7005.xlsx'
  4. OUTPUT_FILE = '已筛选' +INPUT_FILE
  5. wb1 = openpyxl.load_workbook(INPUT_FILE)
  6. ws1 = wb1.active
  7. wb2 = openpyxl.Workbook()
  8. ws2 = wb2.active
  9. k = 0
  10. m = 0
  11. for row_value in ws1.values:
  12. if row_value[3] in KEY_WORD:
  13. m = m + 1
  14. continue
  15. elif row_value[4] in KEY_WORD:
  16. m = m + 1
  17. continue
  18. elif row_value[5] in KEY_WORD:
  19. m = m + 1
  20. continue
  21. ws2.append(row_value)
  22. print("Step2:已删除-",m,"- 行")
  23. wb2.save(OUTPUT_FILE)
  24. print("Step3:新的EXCEL已生成,耗时:")

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

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

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

  1. import openpyxl
  2. KEY_WORD = ["/","禁止挂网","-","00"," ","-","*","**",None,0,0.01,0.001,0.1,0.0,0.000001]
  3. for a in range(1,11):
  4. INPUT_FILE = '700'+str(a)+'.xlsx'
  5. OUTPUT_FILE = '已筛选' +INPUT_FILE
  6. wb1 = openpyxl.load_workbook(INPUT_FILE)
  7. ws1 = wb1.active
  8. wb2 = openpyxl.Workbook()
  9. ws2 = wb2.active
  10. k = 0
  11. m = 0
  12. for row_value in ws1.values:
  13. if row_value[3] in KEY_WORD:
  14. m = m + 1
  15. continue
  16. elif row_value[4] in KEY_WORD:
  17. m = m + 1
  18. continue
  19. elif row_value[5] in KEY_WORD:
  20. m = m + 1
  21. continue
  22. ws2.append(row_value)
  23. print("Step2:已删除-",m,"- 行")
  24. wb2.save(OUTPUT_FILE)
  25. print("Step3:新的EXCEL已生成,这是执行到第:",a,"个表")
  26. a+=1

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/355555
推荐阅读
相关标签
  

闽ICP备14008679号