Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:迭代excel列并使用Win32 COM获取值_Python_Excel_Win32com - Fatal编程技术网

Python:迭代excel列并使用Win32 COM获取值

Python:迭代excel列并使用Win32 COM获取值,python,excel,win32com,Python,Excel,Win32com,我正在使用Python3.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

我正在使用Python3.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)
问题主要在于:“数据=excel应用程序范围(“A1:A60”)”

  • 这需要前60行,我只希望得到excel文件中数据的行数,否则要么我得不到足够的数据,要么我得到的数据太多,结果是一堆“无”

  • 它返回一个元组,因此如果我得到的数据比电子表格中的数据多,我不能修改它以删除“None”值


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

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

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

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

    您可以使用以下命令获取行数:

    worksheet.UsedRange.Rows.Count
    
    其中表示任何时候包含值的所有单元格

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

    如果要复制到新列表中,同时不删除任何值,请执行以下操作:

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

    您可以使用以下命令获取行数:

    worksheet.UsedRange.Rows.Count
    
    其中表示任何时候包含值的所有单元格

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

    如果要复制到新列表中,同时不删除任何值,请执行以下操作:

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

    您使用win32com的具体原因是什么?是的,我需要win32com,因为它是我所知道的唯一一个库,如果我的条件为真(如果我不是无),它允许我将对象嵌入excel,代码如下:Embedded_object.Add(ClassType=None,Filename=file_location,Link=False,DisplayAsIcon=true,Left=3,Top=0,Width=50,Height=50)好的,明白了。。。但是,如果阅读是如此的不方便,而嵌入只有在win32com中才有可能,为什么不混合使用呢?使用win32com处理一切可行且没有其他选择的事情,简单的阅读问题可以通过XLRD解决。您使用win32com的具体原因是什么?是的,我需要win32com,因为它是我所知道的唯一一个库,如果我的条件为真(如果我不是无),它允许我将对象嵌入excel,代码如下:Embedded_object.Add(ClassType=None,Filename=file_location,Link=False,DisplayAsIcon=true,Left=3,Top=0,Width=50,Height=50)好的,明白了。。。但是,如果阅读是如此的不方便,而嵌入只有在win32com中才有可能,为什么不混合使用呢?使用win32com处理一切工作正常且没有其他选择的事务,简单的读取问题可以通过XLRDX解决。出于某种原因,这会在更复杂的工作表中产生意外的高计数,可能是因为后面的行用于包含数据。是否有可能确定某列中当前数据存在的
    UsedRange
    ,例如,
    a
    ?@Mast这是一个众所周知的现象-请参阅以获得相当全面的讨论。虽然是VBA,但同样的原则也适用。我建议您将您的具体需求作为一个问题发布—例如,您是否必须像这张原始海报一样使用win32com—然后您应该得到一个答案。由于某些原因,这会在更复杂的工作表中提供意外的高计数,可能是因为后面的行用于包含数据。是否有可能确定某列中当前数据存在的
    UsedRange
    ,例如,
    a
    ?@Mast这是一个众所周知的现象-请参阅以获得相当全面的讨论。虽然是VBA,但同样的原则也适用。我建议您将您的具体需求作为一个问题发布—例如,您是否必须像这张原始海报一样使用win32com—然后您应该得到一个答案