使用win32com和python的Excel

使用win32com和python的Excel,python,win32com,Python,Win32com,我想知道如何使用Win32 COM client for python读取整个列,而不必从excel工作表中进行迭代。最快的方法是通过win32com.clientAPI使用内置的范围功能。然而,我不是它的超级粉丝。我认为API很混乱,文档也很糟糕,而且使用它也不是很符合Python(但这只是我自己) 如果效率不是您的问题,您可以使用优秀的xlrd库。像这样: import xlrd book = xlrd.open_workbooks('Book1') sheet = book.sheet_b

我想知道如何使用Win32 COM client for python读取整个列,而不必从excel工作表中进行迭代。

最快的方法是通过
win32com.client
API使用内置的
范围
功能。然而,我不是它的超级粉丝。我认为API很混乱,文档也很糟糕,而且使用它也不是很符合Python(但这只是我自己)

如果效率不是您的问题,您可以使用优秀的xlrd库。像这样:

import xlrd
book = xlrd.open_workbooks('Book1')
sheet = book.sheet_by_name('Sheet1')
sheel.col(1)
sheet.col(2)
# and so on...
这将为您提供单元格对象。要获得纯值,请使用
sheet.colu values
(还有一些其他方法非常适合使用)

请记住,xlrd代表“excel读取”,因此,如果您想写入excel文件,则需要另一个名为“xlwt”的库(这也很好,但在我看来比xlrd差)。

您查看过该库吗?从文件中:

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

它还支持迭代器和其他功能。

您可以使用
范围
集合读取整个列,而无需从工作表中进行迭代。如果性能有任何问题,您应该不要使用
单元格
。Python使用Win32 COM模块与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

在这种情况下,范围比单元快2个数量级(146x)。注意,Range方法返回一个二维列表,其中每个内部列表都是一行。列表迭代将
vals
转换为一个二维列表,其中内部列表是一列。

是的,我试过写这段代码,并且在想,python可以用来编写尽可能少的代码,所以我想知道是否有什么东西可以直接返回一个包含所需列值的列表,而无需我编写迭代部分。您可以使用xlrd库,等等,我将在那里添加一个示例。希望有帮助!从概念上讲,我认为OP正在寻找一种“一次性”检索整个范围的方法,比如使用
SELECT
从数据库检索结果集。也就是说,在检索过程中必须完成的任何“迭代”都是在进入Python之前处理的。在数据库的情况下,SQL引擎可能在幕后进行迭代,但您看到的只是一个“返回值”,其中恰好包含多个值。所以对于Excel,OP希望指定一个范围,然后“一次”将所有值抓取到一个元组中。这可能也可能不可能;我对COM了解不够,尽管如此,我不明白为什么首先要避免迭代。也许是因为通过COM一个单元一个单元访问Excel的速度非常慢。在Excel范围内操作要比一次在一个单元格上操作快得多。但是,直接通过<代码> XLRD (而不涉及COM)读取文件通常都很快。好吧,尽管如此,但在目前的形式下,我并不认为这是一个答案。对我来说,这是一个很长的评论。我认为它仍然值得投票的原因是,它最终比目前提出的任何一个答案都更有用、更有用(尽管yuvi已经被接受)。这里显示的代码片段显然最接近于说明如何“使用
win32com
,在不重复的情况下读取整个列”。我只是回顾了这个答案,并对其进行了修改,以回答原始问题。我想知道它与
xlrd
相比有多好。如果差异很小,那么xlrd将是一个明确的解决方案winner@yuvi当前位置我自己没有进行过广泛的测试,但我认为这在很大程度上取决于数据的性质和您试图做的事情的性质。工作簿越大、越复杂,Excel仅在加载时间上的优势就越大。你越能依靠Excel本身完成繁重的工作(通过它的范围和计算引擎),Excel的优势就越大。只需确保您进行的COM调用尽可能少且高效即可。