2016-10-21 22 views
5

Pracuję nad aplikacją, która pozwala użytkownikowi dynamicznie dodawać i usuwać elementy z pliku programu Excel. Ilość przedmiotów jest nieograniczona.Dynamicznie dodawaj elementy z pliku do ComboBox

Szukam sposobu na pobranie elementów z pliku Excel i przesłanie ich do ComboBox.

Aby być bardziej zrozumiałym: Problem nie polega na iteracji przez komórki, ale na przechwyceniu wartości komórek w ComboBox. Potrzebuję metody przechwytującej zawartość wszystkich komórek z wartościami w danej kolumnie, gdzie koniec zakresu jest nieznany, a następnie przeniesienie wartości do ComboBox.

Funkcja Combobox akceptuje tylko wartości, a nie puste komórki. Nie chcę również pól w ComboBox, które mówią "Brak wartości".

Próbowałem sprawdzać przez komórki i metody zasięgu, ale to nie dostanie wartości do ComboBox.

Co mam tak daleko jest:

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) 

To działa zgodnie z oczekiwaniami, ale to, co martwi mnie to, że muszę dodać linię kodu dla każdego elementu łapię z pliku Excel, oprócz konieczności umieść dodatkowy wpis na liście stock_items. Jeśli w pliku znajdowało się 5000 pozycji, wynikowałby 5000 linii kodu i 5000 wpisów na liście.

Czy istnieje skuteczniejszy i bardziej elegancki sposób na rozwiązanie problemu z "licznikiem" lub pandami?

Z góry dziękuję.

Odpowiedz

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) 

Przepraszam, jeśli się mylę. Nie znam składni danego języka. Nadal widziałem logiczną odpowiedź i postanowiłem opublikować.

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) 

Zobacz inne sposoby uzyskania zakresu wierszy Excela.

+0

dziękuję, ale nie działa .... Żadna metoda UsedRange ani podobne w openpyxl – rainer

+0

prawdopodobnie nie dostałem tego ze strony Excela .. Nie jestem pewien, czy to działa ... – rainer

2

W Openpyxl w 2.4 arkusze mają metodę iter_cols, która pozwala wybrać zakres komórek i zwrócić je jako kolumny. Tak jak iter_rows zwraca je jako wiersze. To najprostszy i najskuteczniejszy sposób robienia tego, co chcesz.

Aby uzyskać szczegółowe informacje, patrz https://openpyxl.readthedocs.io/en/default/tutorial.html#accessing-many-cells.

Przykładem przypadku użycia:

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

Dzięki za odpowiedź. Nie wyraziłem się jasno. Problem nie polega na iteracji przez komórki, ale na przeniesieniu wartości komórek do ComboBox. Tylko Combobox real akceptuje wartości, a nie puste komórki. Potrzebuję metody, która przechwytuje zawartość wszystkich komórek z wartościami, gdzie koniec zakresu jest nieznany. Też nie chcę pól w ComboBox, które mówią "Bez wartości". – rainer

3

Znalazłem sposób to zrobić ładnie korzystając Pandy, nie 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

Panda używa wewnętrznego xlrd. –

Powiązane problemy