我想知道如何使用 python 的 win32com 客户端读取整个列,而不需要从 excel 工作表进行迭代。
您可以使用
Range
集合读取整列,而无需从工作表中进行迭代。如果担心性能问题,您应该永远不要使用Cells
。 Python 使用 win32com 模块与 Excel COM 库进行交互。每当您使用 Python 和 COM(Excel、PowerPoint、Acess、ADODB 等)时,最大的性能限制之一就是 COM 和 Python 之间的 IO。使用 Range
方法您只需调用一次 COM 方法,而使用
Cells
则可以为每一行调用一个 COM 方法。如果您在 VBA 或 .NET 中执行相同操作,这也会更快在以下测试中,我创建了一个工作表,在单元格 A1 到 A2000 中包含 10 个随机字符。然后,我使用范围和单元格将这些值提取到列表中。
import win32com.client
app = win32com.client.Dispatch("Excel.Application")
s = app.ActiveWorkbook.Sheets(1)
def GetValuesByCells():
startTime = time.time()
vals = [s.Cells(r,1).Value for r in range(1,2001)]
return time.time() - startTime
def GetValuesByRange():
startTime = time.time()
vals = [v[0] for v in s.Range('A1:A2000').Value]
return time.time() - startTime
>>> GetValuesByRange()
0.03600001335144043
>>> GetValuesByCells()
5.27400016784668
在这种情况下,Range 比 Cells 快 2 个数量级 (146 倍)。请注意,Range 方法返回一个 2D 列表,其中每个内部列表都是一行。列表迭代将 vals
转置为 2D 列表,其中内部列表是一列。
openpyxl 库吗?来自文档:
from openpyxl import load_workbook
wb = load_workbook(filename='file.xlsx')
ws = wb.get_sheet_by_name(name='Sheet1')
columns = ws.columns()
还支持迭代器和其他好东西。
Range
API 使用内置的
win32com.client
功能。不过,我不太喜欢它。我认为这个 API 很混乱,而且记录也很糟糕,而且使用它也不是很 Pythonic(但这只是我个人的想法)。如果效率对您来说不是问题,您可以使用优秀的 xlrd 库。像这样:
import xlrd
book = xlrd.open_workbooks('Book1')
sheet = book.sheet_by_name('Sheet1')
sheel.col(1)
sheet.col(2)
# and so on...
这将为您提供单元格对象。要获得纯值,请使用
sheet.col_values
(还有一些其他非常好用的方法)。请记住 xlrd 代表“excel read”,因此如果您想写入 Excel 文件,您需要一个名为“xlwt”的不同库(这也相当不错,但在我看来不如 xlrd)。