Python中如何使用xlrd按Excel列名称读取特定列及单元格?
版本是 3.6,请教各位高手,我有一个 excel 表格,里面列是有名称的,例如 A 列被命名为’NTCC1’。使用 xlrd 中的 sheet.col_values(0)、sheet.cell(0,0).value 命令能够按列序号及单元格地址返回值,但是我想按列名称来检索到该列及该单元格,请问代码应该怎么写?
如果 xlrd 不能实现,其它 package 能实现吗?如 openpyxl ?非常感谢!
Python中如何使用xlrd按Excel列名称读取特定列及单元格?
看看 pandas 的 read_xlsx 函数
import xlrd
def read_column_by_name(file_path, sheet_name, column_name):
"""
按列名读取Excel特定列的所有数据
参数:
file_path: Excel文件路径
sheet_name: 工作表名称
column_name: 要读取的列名(第一行的值)
返回:
包含该列所有数据的列表(从第二行开始)
"""
# 打开工作簿
workbook = xlrd.open_workbook(file_path)
# 获取指定工作表
sheet = workbook.sheet_by_name(sheet_name)
# 获取列索引
col_index = None
for i in range(sheet.ncols):
if sheet.cell_value(0, i) == column_name:
col_index = i
break
if col_index is None:
raise ValueError(f"列名 '{column_name}' 在工作表 '{sheet_name}' 中未找到")
# 读取该列所有数据(从第二行开始)
column_data = []
for row in range(1, sheet.nrows): # 从第2行开始(索引1)
cell_value = sheet.cell_value(row, col_index)
column_data.append(cell_value)
return column_data
def read_cell_by_column_name(file_path, sheet_name, column_name, row_index):
"""
按列名和行索引读取特定单元格
参数:
file_path: Excel文件路径
sheet_name: 工作表名称
column_name: 列名
row_index: 行索引(0-based,包含标题行)
返回:
单元格的值
"""
workbook = xlrd.open_workbook(file_path)
sheet = workbook.sheet_by_name(sheet_name)
# 查找列索引
col_index = None
for i in range(sheet.ncols):
if sheet.cell_value(0, i) == column_name:
col_index = i
break
if col_index is None:
raise ValueError(f"列名 '{column_name}' 未找到")
# 读取单元格
return sheet.cell_value(row_index, col_index)
# 使用示例
if __name__ == "__main__":
# 示例1:读取整列
try:
data = read_column_by_name('example.xlsx', 'Sheet1', '姓名')
print(f"姓名列数据: {data}")
except Exception as e:
print(f"错误: {e}")
# 示例2:读取特定单元格
try:
cell_value = read_cell_by_column_name('example.xlsx', 'Sheet1', '年龄', 2) # 第3行(索引2)
print(f"第3行的年龄: {cell_value}")
except Exception as e:
print(f"错误: {e}")
核心思路:先用第一行找到列名对应的列索引,再用这个索引读取数据。
建议:用字典缓存列索引能提升多次读取的性能。
额,说错,是 read_excel 函数
读出 header,获取指定列名的 index,然后按下标读?
谢谢哈!弱弱的问一下,怎么读出 header 呀?我网上搜了半天,没看到代码。。。
感谢哈! 我再试试~~~
列名怎么改?
我是原来表格里就有列名。。。所以想直接读取
先读出列名所在行(一般是第一行)到一个 list 中,然后就能根据列名找到其在哪一列,后面就很清楚了。
直接就把所有的列名都读出来,然后循环一下就知道你想要的列是在第几列了。
pandas 库啊,没去试一下么,read_excel 读进去数据后,表格里面的第一行,也就是你的标题,自动变成了下,例如简单的 data = pandas.read_excel(“xxx.xlsx”) 那么可以用 data[‘NTCC1’] 直接访问这一列。
谢谢!其实我说的列明并非第一行的列标题,而是直接将列(如 A 列)改成了另外一个名字如‘ NTCC1 ’(就是你选中了整列以后在左上角有个空格里直接输入‘ NTCC1 ’),A1 单元格是列的中文名称。现在是想读到这个‘ NTCC1 ’列名称,并非在 A1 单元格里的这个列名称。当初用 VBA 写函数的时候这样做比较方便,现在改成 python 了就不知道怎么弄了。现在我改用 openpyxl 了,pandas 等要过会儿再学习了。。。
我和 #9 的想法是一样的,从回复看来是我想错了。。。
嗯,内嵌的 VBA 还是有它的优势的,研究中。。。
原来这个列名本身还能改啊,囧😳
是的,改了列名本身的话,使用 VBA 可以直接读取,而不需要再通过循环查找首行列名称来找了,我感觉应该可以节约程序运算时间。。。
list.index(‘NTCC1’)了解一下,将对应行转换为列表,然后再 sheet.col_values(list.index(‘NTCC1’))


