2016-10-21 5 views
5

Ich arbeite an einer Anwendung, die dem Benutzer das dynamische Hinzufügen und Entfernen von Elementen aus einer Excel-Datei ermöglicht. Die Anzahl der Artikel ist unbegrenzt.Elemente aus einer Datei dynamisch zu einer ComboBox hinzufügen

Ich bin auf der Suche nach einer Möglichkeit, die Elemente aus der Excel-Datei zu greifen und sie auf die ComboBox zu übertragen.

Um mich klarer zu machen: Das Problem besteht nicht darin, Zellen durchzulaufen, sondern Zellenwerte in die ComboBox zu bekommen. Ich brauche eine Methode, die den Inhalt aller Zellen mit Werten in einer bestimmten Spalte erfasst, wobei das Ende des Bereichs unbekannt ist, und dann die Werte in eine ComboBox übertragen.

Die Combobox akzeptiert nur Werte, keine leeren Zellen. Ich will auch keine Felder in der ComboBox, die "Kein Wert" sagen.

Ich habe versucht, durch Zellen und Bereich Methoden Itering, aber das bringt nicht die Werte in die ComboBox.

Was ich habe, so weit ist:

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) 

Dies funktioniert wie erwartet, aber was mich stört ist, dass ich für jedes Element eine Codezeile hinzuzufügen habe ich aus der Excel-Datei packen, außer mit zu Fügen Sie einen zusätzlichen Eintrag in die Liste "stock_items" ein. Wenn in der Datei 5.000 Elemente vorhanden wären, würden 5.000 Zeilen Code und 5000 Einträge in der Liste angezeigt.

Gibt es eine effizientere und elegantere Art, das Problem mit "Counter" oder Pandas zu lösen?

Vielen Dank im Voraus.

Antwort

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) 

Sorry, wenn ich es falsch verstehe. Ich kenne die Syntax der gegebenen Sprache nicht. Immer noch eine logische Antwort und entschied sich zu posten.

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) 

Siehe worksheet docs für andere Möglichkeiten Bereich von Excel-Zeilen zu erhalten.

+0

danke, aber nicht funktioniert .... Keine Methode UsedRange ou Ähnliches in openpyx – rainer

+0

wahrscheinlich hat dies von der Excel-Website .. Ich bin mir nicht sicher, wie es funktioniert .. – rainer

2

In openpyxl 2.4 Arbeitsblätter haben eine iter_cols Methode, mit der Sie einen Bereich von Zellen auswählen und als Spalten zurückgegeben werden können. Genau wie iter_rows gibt sie sie als Zeilen zurück. Dies ist der einfachste und effizienteste Weg, um das zu tun, was Sie tun möchten.

Weitere Informationen finden Sie unter https://openpyxl.readthedocs.io/en/default/tutorial.html#accessing-many-cells.

Ein Beispiel für Ihren Anwendungsfall:

cells = [cell.value for cell in ws.iter_cols(min_col=2, max_col=2, min_row=2) if cell.value is not None]

+0

Vielen Dank für die Antwort. Ich habe mich nicht klar gemacht. Das Problem besteht nicht darin, Zellen zu durchlaufen, sondern die Zellenwerte in die ComboBox zu übertragen. Die Combobox akzeptiert nur reale Werte, keine leeren Zellen. Ich brauche eine Methode, die den Inhalt aller Zellen mit Werten erfasst, wobei das Ende des Bereichs unbekannt ist. Ich will auch keine Felder in der ComboBox, die "Kein Wert" sagen. – rainer

3

ich einen Weg, um diese gut mit Pandas zu tun gefunden, nicht 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) 
+0

Pandas verwendet intern xlrd. –

Verwandte Themen