python读取Excel指定单元格的值

使用openpyxl与xlrd读取Excel

使用openpyxl实现

只支持xlsx文件,不支持xls

import openpyxl


def read_cell(io, sheet, cell='A2'):
    """
    读取单元格
    :param io: Excel文件路径
    :param sheet: 读取哪一张表,str, int   eg: 'Sheet1' or 0
    :param cell: 读取哪一个单元格
    :return: value --> str
    """
    excel = openpyxl.load_workbook(io)
    if isinstance(sheet, str):
        ws = excel[sheet]
    elif isinstance(sheet, int):
        name = excel.sheetnames[sheet]
        ws = excel[name]
    else:
        raise TypeError('sheet must be int or str, not %s' % type(sheet))
    val = ws[cell].value
    if val:
        return val
    return ''

使用xlrd实现

只支持xls(version > 2.x),既支持xls又支持xlsx(version < 2.x)

import xlrd


def get_index(capital):
    """
    大写字母(Excel列头)转数字
    :param capital: 'A' --> 0, 'AA' --> 26
    :return: int
    """
    number = 0
    capital = capital.upper()
    for char in capital:
        number = number * 26 + ord(char) - ord('A') + 1
    return number - 1


def read_cell(io, sheet, cell='A1'):
    """
    读取单元格
    :param io: Excel文件路径
    :param sheet: 读取哪一张表,str, int   eg: 'Sheet1' or 0
    :param cell: 读取哪一个单元格
    :return: value --> str
    """
    wb = xlrd.open_workbook(io)
    if isinstance(sheet, str):
        ws = wb.sheet_by_name(sheet)
    elif isinstance(sheet, int):
        ws = wb.sheet_by_index(sheet)
    else:
        raise TypeError('sheet must be int or str, not %s' % type(sheet))
    pos_col, pos_row = re.findall('[A-Z]+|[0-9]+', cell)
    col_index = get_index(pos_col)
    value = ws.col_values(col_index, start_rowx=int(pos_row) - 1, end_rowx=int(pos_row))
    if value:
        return value[0]
    return ''
<think> 我们需要读取Excel文件中定单的数。常用的库有`openpyxl`(用于.xlsx式)和`xlrd`(用于.xls式)。但注意,由于xlrd不再支持.xlsx式,对于较新的Excel文件,推荐使用openpyxl。 以下示例将展示两种方法: 1. 使用openpyxl读取.xlsx文件 2. 使用xlrd读取.xls文件(并提供一个读取.xlsx的替代方案) 另外,我们也可以使用`pandas`库,它底层可以调用openpyxl或xlrd,但这里我们直接使用底层库,因为只需读取单个单。 步骤: 1. 安装必要的库(如果未安装): - openpyxl: `pip install openpyxl` - xlrd: `pip install xlrd` (注意:xlrd>=2.0只支持.xls文件,不支持.xlsx) 2. 代码示例: 方法一:使用openpyxl读取.xlsx文件 </think> # Python读取Excel定单的详解 在Python读取Excel文件定单的数是常见的数据处理任务,可以使用多种库实现。下面详细介绍几种常用方法: ## 解决方案一:使用openpyxl库(推荐) ```python from openpyxl import load_workbook def read_excel_cell(file_path, sheet_name, cell_address): """ 使用openpyxl读取Excel定单 参数: file_path: Excel文件路径 sheet_name: 工作表名称 cell_address: 单地址(如'A1', 'B3') 返回: 单 """ # 加载工作簿 wb = load_workbook(filename=file_path, data_only=True) # 选择工作表 try: sheet = wb[sheet_name] except KeyError: print(f"错误:工作表 '{sheet_name}' 不存在") return None # 获取单 try: value = sheet[cell_address].value return value except: print(f"错误:单 '{cell_address}' 不存在") return None # 示例用法 if __name__ == "__main__": # 读取示例Excel文件 value = read_excel_cell( file_path="example.xlsx", sheet_name="Sheet1", cell_address="B5" ) print(f"单: {value}") ``` ### 代码说明: 1. **load_workbook函数**: - `data_only=True` 参数确保读取计算后的,而不是公式本身 - 支持.xlsx和.xlsm式文件 2. **异常处理**: - KeyError:处理不存在的工作表 - 通用异常:处理无效的单地址 3. **返回**: - 返回单的实际(字符串、数字、日期等) - 对于空白单返回None ## 解决方案二:使用pandas库(适合大数据集) ```python import pandas as pd def read_excel_cell_pandas(file_path, sheet_name, cell_address): """ 使用pandas读取Excel定单 参数: file_path: Excel文件路径 sheet_name: 工作表名称 cell_address: 单地址(如'A1', 'B3') 返回: 单 """ # 将单地址转换为行列索引 col_letter = ''.join(filter(str.isalpha, cell_address)) row_num = int(''.join(filter(str.isdigit, cell_address))) # 读取整个工作表(仅需的行数) df = pd.read_excel( file_path, sheet_name=sheet_name, header=None, nrows=row_num ) # 获取单 try: # 列字母转换为数字索引(A=0, B=1, ...) col_index = sum( (ord(char) - 64) * (26 ** i) for i, char in enumerate(reversed(col_letter.upper())) ) - 1 return df.iat[row_num - 1, col_index] except IndexError: print(f"错误:单 '{cell_address}' 超出范围") return None except Exception as e: print(f"读取错误: {e}") return None # 示例用法 if __name__ == "__main__": value = read_excel_cell_pandas( file_path="example.xlsx", sheet_name="Sheet1", cell_address="C3" ) print(f"单: {value}") ``` ### 代码说明: 1. **地址转换**: - 将"A1"式转换为行索引和列索引 - 支持多字母列名(如"AA1") 2. **优化读取**: - `nrows=row_num` 仅读取所需行数,提高效率 - `header=None` 确保不跳过首行 3. **性能特点**: - 适合大型Excel文件 - 底层使用xlrd或openpyxl库 ## 解决方案三:使用xlrd库(兼容旧.xls式) ```python import xlrd def read_excel_cell_xlrd(file_path, sheet_name, cell_address): """ 使用xlrd读取Excel定单(支持.xls式) 参数: file_path: Excel文件路径 sheet_name: 工作表名称 cell_address: 单地址(如'A1', 'B3') 返回: 单 """ # 打开工作簿 try: wb = xlrd.open_workbook(file_path) except xlrd.XLRDError: print("错误:文件式不受支持或文件损坏") return None # 选择工作表 try: sheet = wb.sheet_by_name(sheet_name) except xlrd.XLRDError: print(f"错误:工作表 '{sheet_name}' 不存在") return None # 将单地址转换为行列索引 col_letter = ''.join(filter(str.isalpha, cell_address)) row_num = int(''.join(filter(str.isdigit, cell_address))) - 1 # xlrd的行索引从0开始 # 列字母转换为数字索引 col_index = 0 for char in col_letter.upper(): col_index = col_index * 26 + (ord(char) - ord('A')) # 获取单 try: cell = sheet.cell(row_num, col_index) return cell.value except IndexError: print(f"错误:单 '{cell_address}' 超出范围") return None # 示例用法 if __name__ == "__main__": value = read_excel_cell_xlrd( file_path="old_file.xls", # 旧版.xls式 sheet_name="Data", cell_address="D7" ) print(f"单: {value}") ``` ### 代码说明: 1. **式支持**: - 主要支持旧版.xls式 - 不支持.xlsx式(需要使用openpyxl) 2. **索引处理**: - 行索引从0开始(Excel行号-1) - 列索引从0开始(A=0, B=1, ...) 3. **特性**: - 读取公式结果 - 支持日期式转换 ## 性能比较 | 方法 | 优点 | 缺点 | 适用场景 | |------------|-------------------------------|----------------------------|--------------------| | openpyxl | 支持.xlsx式,功能全面 | 安装较大,稍慢于xlrd | 现代Excel文件处理 | | pandas | 适合大数据集,简洁API | 依赖其他库,功能面向DataFrame | 数据分析任务 | | xlrd | 轻量级,速度快 | 不支持.xlsx式 | 旧版.xls文件处理 | ## 最佳实践建议 1. **式兼容性**: ```python import os def read_cell_smart(file_path, sheet_name, cell_address): _, ext = os.path.splitext(file_path) if ext.lower() == '.xlsx': return read_excel_cell(file_path, sheet_name, cell_address) # openpyxl elif ext.lower() == '.xls': return read_excel_cell_xlrd(file_path, sheet_name, cell_address) # xlrd else: print("错误:不支持的文件式") return None ``` 2. **数据类型处理**: ```python # 在openpyxl解决方案中添加类型转换 if isinstance(value, datetime): return value.strftime("%Y-%m-%d") # 日期式化 elif isinstance(value, float) and value.is_integer(): return int(value) # 浮点转整数 ``` 3. **批量读取优化**: ```python def read_multiple_cells(file_path, sheet_name, cell_addresses): """批量读取多个单""" wb = load_workbook(filename=file_path) sheet = wb[sheet_name] return [sheet[addr].value for addr in cell_addresses] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值