上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。