假设你有如下的一个Excel表(可以直接复制粘贴到Excel表中使用),你只关心如何获取到张三与李四之间的交易往来,该如何做呢?

python筛选表格输出新的列 python筛选excel行数据_python


脚本提供了2种模式,行扫描模式与列扫描模式:

列扫描模式:

假如你只关心第4列中,张三与李四的交易,你可以使用此模式。
此模式将从上到下依次读取第4列中有无匹配的内容,一旦匹配,就将这一行数据标记起来,并单独保存

  1. 已知第4列有13个“李四”

python筛选表格输出新的列 python筛选excel行数据_扫描模式_02

  1. 开始跑脚本

python筛选表格输出新的列 python筛选excel行数据_数据_03

行扫描模式:

脚本会逐行检测数据,一旦匹配,就将这一行数据标记起来,并单独保存

  1. 搜索发现Excel表中,李四出现了17次

python筛选表格输出新的列 python筛选excel行数据_python筛选表格输出新的列_04

  1. 开始跑脚本

python筛选表格输出新的列 python筛选excel行数据_python筛选表格输出新的列_05


最终结果如下

python筛选表格输出新的列 python筛选excel行数据_数据_06


python筛选表格输出新的列 python筛选excel行数据_数据_07

脚本如下:

import os
import openpyxl
from openpyxl.styles import PatternFill


# 列扫描模式
def choice1(excel_path1):
    print("请输入关键字(输入quit结束输入):")
    word = []  # 存储用户输入的内容
    while True:
        char = input()
        char = char.strip()
        # 下面的两个if主要是判断输入的内容中是否:某行是空白,某行用逗号分割了字符串(主要适用于多个tid)
        if char == '':
            continue
        if 'quit' in char:
            break
        word.append(char)
    workbook = openpyxl.load_workbook(excel_path1)  # 返回一个workbook数据类型的值
    sheet = workbook.active  # 获取活动表
    print('> 当前活动表是:' + str(sheet))
    workbook.create_sheet('提取结果')  # 创建一个新的sheet表,存储匹配上的信息
    sheet2 = workbook['提取结果']
    rows = sheet.max_row  # 获取行数,值是int型

    you_have_column = int(input("> 你想检测第几列的数据:"))  # 已有数据的列
    count = 0
    for i in range(1, rows + 1):
        if str(sheet.cell(i, you_have_column).value) in word:  # 如果单元格中的值在指定列中找到了(二者内容必须完全一致)
            # print(str(sheet.cell(i, you_have_column).value))
            count += 1
            choice_cell = sheet[i]  # 选中当前行
            for j in choice_cell:  # 为此行中的每一个单元格填充颜色
                pattern_fill = PatternFill(fill_type="solid", fgColor="FFFF00")  # 填充黄底高亮
                j.fill = pattern_fill

            # 把这些检测的数据整行复制到另一个sheet表“提取结果”
            # 获取sheet表“提取结果”中第1行的单元格值
            cell_value = sheet2.cell(row=1, column=1).value
            # 如果第1行有值,就往下找空行
            if cell_value:
                row = 2
                while sheet2.cell(row=row, column=1).value:
                    row += 1
            else:  # 如果第1行没有值,就覆盖
                row = 1

            # 复制sheet1中敏感行的数据到sheet表“提取结果”中对应的行
            for column in range(1, sheet.max_column + 1):
                sheet2.cell(row=row, column=column).value = sheet.cell(row=i, column=column).value
    if count == 0:
        print("> 未在第{}列中发现你要检测的内容,".format(you_have_column))
    else:
        print("> 在第{}列中发现你要检测的内容共计{}条,导出结果在桌面".format(you_have_column, count))
        desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop')
        path_result = os.path.join(desktop_path, 'result.xlsx')
        workbook.save(path_result)  # 保存excel表
    workbook.close()  # 关闭Excel表格
    print('> 操作结束')


# 行扫描模式
def choice2(excel_path2):
    print("请输入关键字(输入quit结束输入):")
    word = []  # 存储用户输入的内容
    while True:
        char = input()
        char = char.strip()
        # 下面的两个if主要是判断输入的内容中是否:某行是空白,某行用逗号分割了字符串(主要适用于多个tid)
        if char == '':
            continue
        if 'quit' in char:
            break
        word.append(char)
    workbook = openpyxl.load_workbook(excel_path2)  # 返回一个workbook数据类型的值
    sheet = workbook.active  # 获取活动表
    print('> 当前活动表是:' + str(sheet))
    workbook.create_sheet('提取结果')  # 创建一个新的sheet表,存储匹配上的信息
    sheet2 = workbook['提取结果']
    rows = sheet.max_row  # 获取行数,值是int型
    count = 0

    for i in range(1, rows + 1):
        cell = sheet[i]  # 获取每一行的数据
        for ii in cell:  # 遍历这一行的数据
            if str(ii.value) in word:  # 如果某个单元格中的值匹配关键字了(二者内容必须完全一致)
                count += 1
                # print(str(sheet.cell(i, you_have_column).value))
                choice_cell = sheet[i]  # 选中当前行
                for j in choice_cell:  # 为此行中的每一个单元格填充颜色
                    pattern_fill = PatternFill(fill_type="solid", fgColor="FFFF00")  # 填充黄底高亮
                    j.fill = pattern_fill

                # 把这些检测的数据整行复制到另一个sheet表“提取结果”
                # 获取sheet表“提取结果”中第1行的单元格值
                cell_value = sheet2.cell(row=1, column=1).value
                # 如果第1行有值,就往下找空行
                if cell_value:
                    row = 2
                    while sheet2.cell(row=row, column=1).value:
                        row += 1
                else:  # 如果第1行没有值,就覆盖
                    row = 1

                # 复制sheet1中敏感行的数据到sheet表“提取结果”中对应的行
                for column in range(1, sheet.max_column + 1):
                    sheet2.cell(row=row, column=column).value = sheet.cell(row=i, column=column).value

                break
    if count == 0:
        print("> 未在Excel表中发现你要检测的内容,")
    else:
        print("> 发现你要检测的内容共计{}条,导出结果在桌面".format(count))
        desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop')
        path_result = os.path.join(desktop_path, 'result.xlsx')
        workbook.save(path_result)  # 保存excel表
    workbook.close()  # 关闭Excel表格
    print('> 操作结束')


print('''
假设你手里有个Excel表,你只关心部分数据,并希望获取这些数据整行的信息,可以使用此脚本。
脚本有2中扫描模式:
1. 列扫描模式:
脚本会检测指定列中的数据,一旦匹配,就将这一行数据标记起来,并单独保存

2. 行扫描模式:
脚本会逐行检测数据,一旦匹配,就将这一行数据标记起来,并单独保存
''')
excel_path = input("请输入Excel表的绝对路径:")
# excel_path = r'C:\Users\asuka\Desktop\33.xlsx'
while True:
    user_input = input('我选择:列扫描模式【1】推荐,行扫描模式【2】:')
    if user_input in ["1", "2"]:
        break
    else:
        print("输入无效,请重新输入。")

# 用户输入的是1或2,可以进行下一步操作
if user_input == "1":
    choice1(excel_path)
else:
    choice2(excel_path)