Excel使用win32com和python

时间:2013-09-02 14:01:25

标签: python win32com

我想知道如何使用win32com客户端为python从excel表中重复读取整个列。

3 个答案:

答案 0 :(得分:10)

您可以使用Range集合读取整个列,而无需从工作表中进行迭代。如果performacne有任何疑虑,永远不会使用Cells 。 Python使用win32com模块与Excel COM库进行交互。每当您使用Python和COM(Excel,PowerPoint,Acess,ADODB等)时,您最大的性能限制之一将是COM和Python之间的IO。使用Range方法只能进行一次COM方法调用,而使用Cells时,每行都会调用一次。如果你在VBA或.NET中做同样的事情,这也会更快。

在下面的测试中,我在单元格A1到A2000中创建了一个包含10个随机字符的工作表。然后,我使用Range和Cells将这些值提取到列表中。

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比Cell快2个数量级(146x)。请注意,Range方法返回一个2D列表,其中每个内部列表都是一行。列表迭代将vals转换为2D列表,其中内部列表是列。

答案 1 :(得分:2)

你有没有看过openpyxl图书馆?来自文档:

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

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

答案 2 :(得分: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)。