将Excel列中的数据读入Python列表

时间:2017-08-16 08:26:06

标签: python excel xlwings

我正在使用python xlwings在Excel 2013中读取一列数据。列A填充了数字。要将此列导入python列表py_list,我有以下代码;

import xlwings as xw

wb = xw.Book('BookName.xlsm')
sht = xw.Book('SheetName')
py_list = sht.range('A2:A40').value

如果列数据填充在A2:A40,则上述代码有效。但是,列数据可以继续增长。数据可以增长并延伸到A2:A46A2:A80。最后一行是空的。在编译时不知道此列中有多少行数据。

如何修改代码以检测最后一行的空单元格,以便py_list可以读取数据范围?

除了xlwings之外,我还可以使用其他python库来读取Excel数据。我正在使用python v3.6

5 个答案:

答案 0 :(得分:8)

我对从csv或excel中读取文件说了很多,但我会使用pandas

import pandas as pd

df = pd.read_excel('filename.xlsm', sheetname=0) # can also index sheet by name or fetch all sheets
mylist = df['column name'].tolist()

另一种方法是使用动态公式,如excel中的OFFSET,而不是'A2:A40',或者可能是命名范围?

答案 1 :(得分:3)

我知道这是一个老问题,但是您也可以使用openpyxl

from openpyxl import load_workbook
wb = load_workbook("BookName.xlsx")  # Work Book
ws = wb.get_sheet_by_name('SheetName')  # Work Sheet
column = ws['A']  # Column
column_list = [column[x].value for x in range(len(column))]

注意:

  • Pandas是一个很棒的库,但是安装它只是将excel列读入列表是一个过大的恕我直言。

  • xlrd已不再维护。从xlrd github page

      

    请注意:该库当前没有活动的维护者。建议您改用OpenPyXL。

答案 2 :(得分:2)

经过多次反复试验,我将回答我自己的问题。

这个问题的关键是找出A列中的行数。

使用下面的xlwings可以在这一行中找到行数;

rownum = sht.range('A1').end('down').last_cell.row

需要仔细阅读API文档才能得到答案。

http://docs.xlwings.org/en/stable/api.html#xlwings.Range

一旦找到行数,就可以很容易地找出其余部分。

答案 3 :(得分:1)

我发现这是从excel中的整个列创建列表的最简单方法,并且只使用已填充的e​​xcel单元格。     将熊猫作为pd导入     将numpy导入为np

#Insert complete path to the excel file and index of the worksheet
df = pd.read_excel("PATH.xlsx", sheet_name=0)
# insert the name of the column as a string in brackets
list1 = list(df['Column Header 1']) 
list2 = list(df['Column Header 2'])

print(list1)
print(list2)

答案 4 :(得分:1)

我浏览了xlwings文档以查找某些东西,没有找到类似的东西,但是您始终可以尝试解决此问题:

temp = [x for x in xw.Range('A2:A200').value if x != None] #A200 just put a big number..

或者我不知道试试这个:

from itertools import takewhile
temp =[takewhile(lambda x: x != None, xw.Range('A2:A70').value)]
while True:
    try:
         next(temp)
    except StopIteration:
         break

在第2行,起初我尝试做这样的事情:

temp =[lambda x: x for x in xw.Range('D:D').values if x != None else exit()] #or to replace this with quit() but there is no option to break lambdas as far as I know

另一个选择:

temp = iter(xw.Range('A:A').value)
list = []
a = next(temp)               #depending your first cell starts at row 1
while a != None:             #might want zeros or '' etc
    list.append(a)
    a = next(temp)