从文件动态添加项目到ComboBox

5
我正在开发一个应用程序,允许用户动态添加和删除Excel文件中的项目,项目数量不限。
我正在寻找一种方法,从Excel文件中获取项目并将其传输到ComboBox中。需要注意的是,问题不在于遍历单元格,而在于将单元格值获取到ComboBox中。我需要一种方法,可以捕获给定列中所有具有值的单元格的内容,其中范围的结尾未知,然后将这些值传输到ComboBox中。
ComboBox只接受值,而不接受任何空单元格。我也不希望ComboBox中出现“无值”的字段。
我已经尝试了迭代单元格和范围方法,但这并不能将值传输到ComboBox中。
目前为止,我所做的是:
    wb = load_workbook (source_file)
    ws = wb.active

    self.value_1 = ws['B2'].value
    self.value_2 = ws['B3'].value
    self.value_3 = ws['B4'].value
    self.value_4 = ws['B5'].value
    self.value_5 = ws['B6'].value
    self.value_6 = ws['B7'].value
    self.value_7 = ws['B8'].value
    self.value_8 = ws['B9'].value
    self.value_9 = ws['B10'].value
    self.value_10 = ws['B11'].value

    stock_items = [ self.value_1 , self.value_2 , self.value_3 , self.value_4 , self.value_5 ,
    self.value_6 , self.value_7 , self.value_8 , self.value_9 , self.value_10 ] 

    self.combo_items_list = [ ]

    for stock_item in stock_items :
        if stock_item != None : 
            self.combo_items_list.append (stock_item)

    self.combo.addItems(self.combo_items_list)

这个代码可以正常运行,但让我不满意的是,我必须为每个从Excel文件中获取的项目添加一行代码,并除了要将额外的条目放入stock_items列表。如果文件中有5000个项目,则会导致需要编写5000行代码并在列表中添加5000个条目。
是否有更高效和优雅的方式来处理"counter"或者pandas中的问题呢?
提前感谢。
4个回答

4
我发现使用Pandas而不是openpyxl可以很好地完成这个任务:
    import pandas as pd
    import numpy as np


    # get sheet and whole column
    sales = pd.read_excel ("Inventory.xlsx")

    # filter out any None Values
    sales_article = sales ["Artigo"] .dropna()

    # transform into list
    sales_list = sales_article.values.tolist()

    # add list to ComboBox
    self.combo.addItems(sales_list)

Pandas 在内部使用 xlrd。 - Charlie Clark

2
在openpyxl 2.4中,工作表有一个iter_cols方法,允许您选择一系列单元格并将它们作为列返回。就像iter_rows将它们作为行返回一样。这是实现你想要做的最简单和最有效的方法。详见https://openpyxl.readthedocs.io/en/default/tutorial.html#accessing-many-cells
以下是一个适用于您的用例的示例:cells = [cell.value for cell in ws.iter_cols(min_col=2, max_col=2, min_row=2) if cell.value is not None]

谢谢回复。我表达不够清楚。问题不在于遍历单元格,而是将单元格的值放入ComboBox中。ComboBox只接受实际的值,而不是任何空单元格。我需要一种方法来捕获所有具有值的单元格的内容,其中范围的结尾是未知的。我也不希望ComboBox中出现“无值”的字段。 - rainer

1
wb = load_workbook(source_file)
ws = wb.active

lastrow = ws.UsedRange.Height  # don't remember method name
for row in range(lastrow):
    value = ws['B' + str(row + 2)].value
    if value is not None:
        self.combo_items_list.append (value)

self.combo.addItems(self.combo_items_list)

请参见工作表文档以了解获取Excel行范围的其他方法。

谢谢,但不起作用.....在openpyxl中没有使用UsedRange或类似方法。 - rainer

0
wb = load_workbook (source_file)
ws = wb.active

self.combo_items_list = [ ]
// loop from 2(start)-11(end)
// check if ws['B'<counter>].value is available and not null
// add this value to your array of combo for each ittration. 
self.combo_items_list.append (ws['B'<counter>].value)

self.combo.addItems(self.combo_items_list)

抱歉,如果我理解错了。我不知道给定语言的语法。但我看到了一个合乎逻辑的答案,所以决定发表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接