Python辅助Word+Excel:让办公更高效
上QQ阅读APP看书,第一时间看更新

029 使用列表关键字筛选两个工作表

此案例主要通过使用Python语言的列表脚本操作符(关键字not in)筛选数据,从而实现在两个工作表中筛选不同的行,即获取全集与子集之间的差集。当运行此案例的Python代码(A342.py文件)之后,将根据“订单表.xlsx”文件的全部订单表和已出库订单表创建未出库订单表,全部订单表如图029-1所示,已出库订单表如图029-2所示,据此创建的未出库订单表如图029-3所示。

A342.py文件的Python代码如下:

import openpyxl
myBook=openpyxl.load_workbook('订单表.xlsx',data_only=True)
mySheet1=myBook['全部订单表']
mySheet2=myBook['已出库订单表']
#将全部订单表(mySheet1)复制成未出库订单表(mySheet3)
mySheet3=myBook.copy_worksheet(mySheet1)
mySheet3.title='未出库订单表'
#删除未出库订单表(mySheet3)的行(第1行除外)
while mySheet3.max_row >1:
      mySheet3.delete_rows(2)
myList1=list(mySheet1.values)[1:]
myList2=list(mySheet2.values)[1:]
#循环全部订单表(myList1列表)的行(myRow)
for myRow in myList1:
    #如果行(myRow)不在已出库订单表(myList2列表)中
    if myRow not in myList2:
       #则将行(myRow)添加到未出库订单表(mySheet3)中
       mySheet3.append(myRow)
myBook.save('结果表-订单表.xlsx')

图029-1

图029-2

图029-3

在上面这段代码中,if myRow not in myList2表示判断在列表(myList2)中是否存在某行(myRow),如果不存在,则该表达式为True,否则为False。注意:如果行(myRow)包含多列,则该行的所有列的数据必须与列表(myList2)的某行的所有列的数据完全匹配,该表达式才为False;如果只匹配部分列的数据,该表达式仍为True。例如,['迪马实业股份有限公司','A2020120001',25097]与['迪马实业股份有限公司','A2020120001A',25097]将被视为两个不同的行。

此案例的源文件是MyCode\A342\A342.py。