我正在开发一个允许用户动态添加和删除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"还是熊猫?
提前致谢。
答案 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)
抱歉,如果我弄错了。我不知道给定语言的语法。仍然看到一个合乎逻辑的答案,并决定发布。