【问题标题】:Python: Iterating through excel column and getting values with win32comPython:遍历excel列并使用win32com获取值
【发布时间】:2026-02-13 09:05:02
【问题描述】:

我正在使用 Python 3.5 和 win32com 遍历一个 excel 文档行(仅从第一列)并从中获取所有值,最好是在一个简单的列表中。我尝试了以下实现,但存在一些问题:

excel_app = win32com.client.Dispatch('Excel.Application')
workbook = excel_app.Workbooks.Open(myfile2)
worksheet = workbook.Sheets('Sheet1')
data = excel_app.Range("A1:A60")
print(data)

for i in data:
    if i is not None:
        print(i)

问题主要出在:"data = excel_app.Range("A1:A60")"

  1. 这需要前 60 行,我希望只获得与 excel 文件中的数据一样多的行,否则要么我没有得到足够的数据,要么我得到的太多而我最终有一堆“无”

  2. 它返回一个元组,因此如果我获得的数据多于电子表格的数据,我无法修改它以删除“无”值。

【问题讨论】:

  • 您使用 win32com 的任何具体原因?这是比较困难的方法之一。
  • 是的,我需要 win32com,因为它是我知道的唯一一个库,如果我的条件为真(如果我不是 None),它可以让我将对象嵌入到 excel 中,使用以下代码:Embedded_object.Add(ClassType =None, Filename=file_loction, Link=False, DisplayAsIcon=True, Left=3, Top=0, Width=50, Height=50)
  • 好的,明白了...但是如果阅读如此不便并且只能使用 win32com 进行嵌入 - 为什么不混合使用呢?使用 win32com 进行所有工作且别无选择,xlrd 可以解决简单的阅读问题

标签: python excel win32com


【解决方案1】:

您可以使用以下方法获取行数:

worksheet.UsedRange.Rows.Count

其中UsedRange 表示在任何时候都包含值的所有单元格。

一旦您的元组中有数据,您可以将其复制到列表中进行处理 - 例如new_list = 数据[:]。

如果你想复制到一个新列表并同时删除 None 值:

new_list = [ item for item in data if item is not None]

【讨论】:

  • 出于某种原因,这会在更复杂的工作表中产生意外的高计数,可能是因为后面的行曾经包含数据。是否可以确定某个列中当前数据存在的UsedRange,例如A
  • @Mast 这是一个众所周知的现象 - 请参阅 this post 以获得相当全面的讨论。虽然它是 VBA,但同样的原则也适用。我建议您将您的具体要求作为一个问题发布-例如您是否必须像此原始海报一样使用win32com-然后您应该得到答案
【解决方案2】:

如果您不介意使用 xlrd,我认为会容易得多。 这就像……

import xlrd

xlf = xlrd.open_workbook('/wherever/file/may/roam/asdf.xlsx')
xls = xlf.sheet_by_name('Sheet1')
data = xls.col_values(0)

【讨论】: