使用 win32com 和 python 的 Excel

问题描述 投票:0回答:3

我想知道如何使用 python 的 win32com 客户端读取整个列,而不需要从 excel 工作表进行迭代。

python win32com
3个回答
14
投票

您可以使用

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 列表,其中内部列表是一列。


2
投票
您查看过

openpyxl 库吗?来自文档:

from openpyxl import load_workbook wb = load_workbook(filename='file.xlsx') ws = wb.get_sheet_by_name(name='Sheet1') columns = ws.columns()

还支持迭代器和其他好东西。


1
投票
最快的方法是通过

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)。

© www.soinside.com 2019 - 2024. All rights reserved.