OpenPyXL:遍历一列的所有行

时间:2019-10-12 21:27:26

标签: python openpyxl

我有一个包含2列和数千行的工作表文件。我想遍历所有行,但只获取第一列。

这会打印出每一列,例如如何打印唯一的“ A”:

from openpyxl import load_workbook

workbook = load_workbook('file.xlsx')
sheet = workbook['Table1']

for row in sheet:
    for cell in row:
        print(sheet[cell.coordinate].value)

让它像这样运行,但是没有比较子句,还有没有更有效的方法呢?

for row in sheet:
    for cell in row:
        if cell.coordinate[0] == 'A':
            print(sheet[cell.coordinate].value)

2 个答案:

答案 0 :(得分:1)

您可以遍历所有行,然后直接访问此行和第一列中的单元格:

for rowNumber in range(1, sheet.max_row + 1):
    print(sheet.cell(row=rowNumber, column=1).value)

答案 1 :(得分:0)

使用数据框可能会更简单并且应该运行得更快:

import pandas as pd
df = pd.read_excel('file.xlsx', sheet_name="Table1")
print(df.iloc[:,[0]])

使用openpyxl vs pandas加载某种程度较大的excel文件的性能测试(以提供我上面声明的PoC并提供一些实际的测试结果以回应以下查理·克拉克的评论)。仅仅是出于相互学习和知识共享的目的。

准备大文件

import openpyxl as xl
wb = xl.Workbook()
ws = wb['Sheet']
wb.save("DUMMY1.xlsx")

xfile = xl.load_workbook('DUMMY1.xlsx')

# Load 100000 rows and 10 columns
sheet = xfile['Sheet']
for i in range(100001):
    for j in range(10):
        sheet.cell(row=i+1, column=j+1).value = "Hello "+str(i+1+j+1)
xfile.save('DUMMY2.xlsx')

性能测试:

import timeit
import openpyxl as xl
import pandas as pd
def func1():
    xl1 = xl.load_workbook("DUMMY2.xlsx")
    return xl1

def func2():
    df = pd.read_excel("DUMMY2.xlsx")
    return df

print(timeit.timeit('func1()', globals=globals(), number=1))
print(timeit.timeit('func2()', globals=globals(), number=1))

结果:

40.4193192
19.396849500000002

如您所见,使用openpyxl加载excel文件所需的时间是使用熊猫加载的时间的两倍以上。如果结合使用xlrd和pandas进行加载,它的加载速度甚至比加载至pandas数据帧还要快