将项目中的项目动态添加到ComboBox

时间:2016-10-21 01:05:49

标签: pandas combobox pyqt openpyxl

我正在开发一个允许用户动态添加和删除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列表中添加一个额外的条目。如果文件中有5.000个项目,则会在列表中生成5.000行代码和5000个条目。

是否有一种更有效,更优雅的方式来处理问题" counter"还是熊猫?

提前致谢。

4 个答案:

答案 0 :(得分:3)

我找到了一种方法,可以很好地使用Pandas,而不是opnpyxl:

    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)

答案 1 :(得分: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]

答案 2 :(得分: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行范围的其他方法,请参阅worksheet docs

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

抱歉,如果我弄错了。我不知道给定语言的语法。仍然看到一个合乎逻辑的答案,并决定发布。