Openpyxl - 如何在Python中仅读取Excel文件中的一列?

29

我想从我的电子表格中仅提取A列。我有以下代码,但它会从所有列中提取。

from openpyxl import Workbook, load_workbook

wb=load_workbook("/home/ilissa/Documents/AnacondaFiles/AZ_Palmetto_MUSC_searchterms.xlsx", use_iterators=True)
sheet_ranges=wb['PrivAlert Terms']

for row in sheet_ranges.iter_rows(row_offset=1): 
    for cell in row:
        print(cell.value)
10个回答

26

以下是使用openpyxl读取一个或多个列的替代方案,与之前的回答不同。

import openpyxl

wb = openpyxl.load_workbook('origin.xlsx')
first_sheet = wb.get_sheet_names()[0]
worksheet = wb.get_sheet_by_name(first_sheet)

#here you iterate over the rows in the specific column
for row in range(2,worksheet.max_row+1):  
    for column in "ADEF":  #Here you can add or reduce the columns
        cell_name = "{}{}".format(column, row)
        worksheet[cell_name].value # the value of the specific cell
        ... your tasks... 

我希望这个对你有用。


1
你是不是想说:for row in range(2,worksheet.max_row+1): 而不是 for row in range(2,worksheet.max_row): - Vikas Prasad
你好,不需要加1。因为worksheet.max_row返回的是最后一个有元素的行的索引,如果加上+1,那么最后一行就会是空行。可以在这里查看更多示例:openpyxl - ZLNK
1
是的,但对于函数range而言,第二个参数是不包含的。这样我们将会错过最后一行的数据。 - Vikas Prasad
没错,你说得对。在我的情况下,最后一行该列的值不同,因此我没有注意到错误。我现在会进行更正,谢谢! - ZLNK

15

使用openpyxl

from openpyxl import load_workbook
# The source xlsx file is named as source.xlsx
wb=load_workbook("source.xlsx")

ws = wb.active
first_column = ws['A']

# Print the contents
for x in xrange(len(first_column)): 
    print(first_column[x].value) 

使用ws['A']来提取工作表的列是不起作用的。它会抛出一个属性错误,要求迭代。请参考下面这个线程中我的答案https://dev59.com/x1sW5IYBdhLWcg3woYcj#70006361 - Priya

13

在我看来,这要简单得多。

from openpyxl import Workbook, load_workbook
wb = load_workbook("your excel file")
source = wb["name of the sheet"]
for cell in source['A']:
    print(cell.value)

使用source['A']来提取工作表的列是不起作用的。它会抛出一个属性错误,要求进行迭代。请参考下面这个线程中我给出的答案 https://dev59.com/x1sW5IYBdhLWcg3woYcj#70006361 - Priya

2
我建议使用pandas库。
import pandas as pd
dataFrame = pd.read_excel("/home/ilissa/Documents/AnacondaFiles/AZ_Palmetto_MUSC_searchterms.xlsx", sheetname = "PrivAlert Terms", parse_cols = 0)

如果您不熟悉pandas,或者出于任何原因需要使用openpyxl进行工作,则代码中的错误在于您没有仅选择第一列。您明确调用每行中的每个单元格。如果您只想要第一列,则只获取每行中的第一列即可。

for row in sheet_ranges.iter_rows(row_offset=1): 
    print(row[0].value)

这将仍然逐行返回一行。 - Charlie Clark

2

这里是一个简单的函数:

import openpyxl

def return_column_from_excel(file_name, sheet_name, column_num, first_data_row=1):
    wb = openpyxl.load_workbook(filename=file_name)
    ws = wb.get_sheet_by_name(sheet_name)
    min_col, min_row, max_col, max_row = (column_num, first_data_row, column_num, ws.max_row)
    return ws.get_squared_range(min_col, min_row, max_col, max_row)

2
使用ws.get_squared_range()可以精确控制要返回的单元格范围,例如一个单独的列。

get_squared_range()已经过时...请参阅此帖子:https://stackoverflow.com/questions/42532026/get-squared-range-to-list-of-lists-from-excel - Edward Gaere

1
使用openpyxl库和Python的列表推导概念:
import openpyxl

book = openpyxl.load_workbook('testfile.xlsx')
user_data = book.get_sheet_by_name(str(sheet_name))
print([str(user_data[x][0].value) for x in range(1,user_data.max_row)])

这是一个非常棒的方法,值得一试。

0

我知道我可能晚了加入回答这个帖子。但至少我的答案可能会对其他正在寻求解决方案的人有所帮助。

您必须遍历工作表的列值。根据我的意见,可以这样实现:

from openpyxl import load_workbook

wb = load_workbook("/home/ilissa/Documents/AnacondaFiles/AZ_Palmetto_MUSC_searchterms.xlsx", read_only=True)
sheet = wb['PrivAlert Terms']
for val in sheet.iter_rows(max_col=1):
        print(val[0].value)

iter_rows 循环遍历指定列的行。您可以从 min_row 到 max_row 以及 max_col 指定 iter_rows 的参数。在此处设置 max_col=1 可使其循环遍历电子表格中第一列的所有行(直到指定的最大列)。这将提取电子表格中仅第一列的所有值。

同样,如果您想要沿着水平方向迭代遍历一行中的所有列,则可以使用 iter_cols,并指定 from row 和 till column 属性。


0

根据ZLNK的回答更新:

import openpyxl
wb=openpyxl.load_workbook('file_name.xlsm')
first_sheet = wb.sheetnames
worksheet = wb[first_sheet[2]] # index '2' is user input

for row in range(2,worksheet.max_row+1):  
   for column in "E":  #Here you can add or reduce the columns
      cell_name = "{}{}".format(column, row)
      vv=worksheet[cell_name].value
       

0
使用ZLNK的优秀回答,我创建了这个函数,它使用列表推导式在一行中实现相同的结果:
def read_column(ws, begin, columns):
  return [ws["{}{}".format(column, row)].value for row in range(begin, len(ws.rows) + 1) for column in columns]

然后,您可以通过传递一个工作表、要开始的行和要返回的任何列的第一个字母来调用它:

column_a_values = read_column(worksheet, 2, 'A')

要返回列A和列B,调用应更改为:

column_ab_values = read_column(worksheet, 2, 'AB')

ws.rows是生成器,我得到了“object of type 'generator' has no len()”错误,也许应该使用max_row? - Michal Gonda
当您的表格实际上具有足够的列,以至于实际存在一个名为“AB”的列时会发生什么? - virtualxtc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接