python_excel_openpyxl模糊查询excel中某个单元格的位置

该代码示例展示了如何利用Python的openpyxl库读取Excel文件,并查找特定关键词。首先加载xlsx文件,获取所有工作表名称,然后遍历第一个工作表的每一行和每个单元格,检查单元格值是否为非空,如果找到包含关键词的单元格,打印其值、行号和列号。
from openpyxl import load_workbook


def search_value(filename,keyword):
    wb = load_workbook(filename)
    all_sheets = wb.get_sheet_names()
    print(all_sheets)
    sheet = wb.get_sheet_by_name(all_sheets[0])
    for row in sheet.iter_rows():
        for cell in row:
            if cell.value is not None:
                info = cell.value.find(keyword)
                if info == 0:
                    print(cell.value)
                    print(cell.row)
                    print(cell.column)




if __name__ == '__main__':

    try:
        filename='test.xlsx'
        keyword='存货'
        search_value(filename,keyword)
        print('   Finish')
    except Exception as e:
        print(e)




<think>我们使用openpyxl库来读取Excel文件(xlsx格式),因为它是当前处理xlsx文件的主流库,且功能强大。 步骤: 1. 安装openpyxl(如果尚未安装):在命令中运 pip install openpyxl 2. 使用openpyxl加载工作簿 3. 遍历每个工作表(sheet)中的每一每一查找目标数据 4. 一旦找到,记录该数据所在的工作表名称、 注意:Excel中的索引从1开始,而openpyxl中也是从1开始计数。 但是,如果数据在合并单元格中,我们需要特殊处理。合并单元格的数据只存在于左上角的单元格,其他单元格为空。 因此,我们可能需要处理合并单元格的情况。如果目标数据位于合并单元格内,我们返回合并单元格的左上角位置。 根据引用[1]中的提示,对于xlsx格式,我们不需要设置formatting_info(这是xlrd库中的参数),而openpyxl可以直接处理合并单元格。 在openpyxl中,我们可以通过sheet.merged_cells属性获取所有合并单元格的区域。然后,我们可以检查目标单元格是否在某个合并区域内,如果是,则返回合并区域的左上角单元格。 但是,我们查找数据时,如果数据在合并单元格内,我们遍历到的位置可能是合并区域内的非左上角单元格(此时该单元格值为None),因此我们需要在遍历时跳过值为None的单元格吗?或者,我们可以先检查单元格是否在合并区域内,如果是,则检查其左上角单元格的值。 然而,为了简单起见,我们可以先遍历所有非空单元格。如果遇到一个非空单元格,我们检查它是否在某个合并区域内(但注意,合并区域的非左上角单元格openpyxl中读取出来是None,所以实际上我们不会在非左上角单元格读到值)。因此,我们只需要遍历单元格,当单元格的值等于目标值时,记录位置。 但是,如果目标值恰好是None,我们就无法区分是空单元格还是我们不需要找的。所以,我们假设我们要找的数据是非空值。 另一种情况:目标值可能出现在多个位置,因此我们返回所有位置。 设计函数:find_value_in_excel(file_path, target_value) 返回一个表,每个元素是一个元组(sheet_name, row, column) 步骤: 1. 加载工作簿 2. 遍历每个工作表 3. 遍历工作表的每一每一 4. 如果单元格的值等于目标值,记录该单元格位置(注意:如果是合并单元格的一部分且不是左上角,则值为None,所以不会匹配) 5. 但是,如果目标值出现在合并单元格的左上角,那么我们会找到它。如果目标值出现在多个合并单元格的左上角,我们也会找到多个。 但是,如果同一个值出现在多个位置,我们都会返回。 另外,我们也可以考虑目标值的数据类型,比如字符串、数字等。注意Excel中读取的数字可能是浮点数,而用户输入可能是整数,所以需要适当转换吗?这个由用户自己保证,因为精确匹配。 代码实现:</think>### Python 查找 Excel 数据位置的方法 要查找特定数据在 Excel 表格中的位置,可以使用 `openpyxl` 库处理 `.xlsx` 文件,或 `xlrd` 库处理 `.xls` 文件。以下是具体实现方法: #### 方法 1:使用 openpyxl(推荐用于 .xlsx 文件) ```python from openpyxl import load_workbook def find_data_position(file_path, target_value): wb = load_workbook(file_path) positions = [] for sheet_name in wb.sheetnames: sheet = wb[sheet_name] for row in sheet.iter_rows(): for cell in row: if cell.value == target_value: positions.append(( sheet_name, cell.row, # 号(从1开始) cell.column # 号(从1开始) )) return positions # 使用示例 positions = find_data_position("data.xlsx", "目标数据") for pos in positions: print(f"位置: 工作表【{pos[0]}】, ={pos[1]}, ={pos[2]}") ``` #### 方法 2:使用 xlrd(用于 .xls 文件) ```python import xlrd def find_data_position_xls(file_path, target_value): workbook = xlrd.open_workbook(file_path, formatting_info=True) positions = [] for sheet in workbook.sheets(): for row_index in range(sheet.nrows): for col_index in range(sheet.ncols): cell_value = sheet.cell_value(row_index, col_index) if cell_value == target_value: positions.append(( sheet.name, row_index + 1, # 转换为从1开始的号 col_index + 1 # 转换为从1开始的号 )) return positions ``` ### 关键说明: 1. **编号规则**: - Excel 号从 1 开始计数 - 号支持两种格式: - 数字格式(如 3) - 字母格式(如 C)可用 `openpyxl.utils.get_column_letter(cell.column)` 转换 2. **合并单元格处理**: - 合并单元格中只有**左上角单元格**存储实际值 - 其他合并区域单元格值为 `None` - 需额外代码判断合并区域(示例见相关问题 2) 3. **数据类型匹配**: - Excel 中的数字可能以浮点数形式存储(如 `5.0` 而不是 `5`) - 建议使用 `str(cell.value)` 进模糊匹配或处理类型转换 4. **性能优化**: - 大型文件可添加 `break` 语句在找到第一个匹配后退出 - 使用 `sheet.iter_rows(values_only=True)` 加速读取 [^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值