2016-10-21 3 views
5

私は、ユーザーがエクセルファイルに項目を動的に追加したり削除したりできるアプリケーションを開発中です。品目の数量は無制限とする。ファイルからコンボボックスにアイテムを動的に追加します

私は、Excelファイルからアイテムを取得してComboBoxに転送する方法を探しています。

明らかにするには:問題はセルを反復処理するのではなく、セル値をComboBoxに取り込むことです。私は、指定された列の値を持つすべてのセルの内容を取得し、範囲の終わりが分からないメソッドを必要とし、その値をComboBoxに転送します。

コンボボックスは、空のセルではなく値のみを受け入れます。私はまた、 "値なし"と言っているComboBoxのフィールドを望んでいません。

私はセルと範囲のメソッドを通してiteringを試みましたが、これは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の項目がリストに表示されます。

"カウンター"やパンダで問題を処理するためのより効率的でエレガントな方法はありますか?

ありがとうございます。

答えて

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) 

申し訳ありませんが、私はそれが間違っています。私は与えられた言語の構文を知らない。まだ論理的な答えを見て、投稿することを決めました。

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を参照してください。

+0

はあなたに感謝しますが、動作していない.... 。いいえメソッドUsedRange ou openpyxlで似ています – rainer

+0

おそらくExcelのウェブサイトからこれを持っています..私はこれがどのように動作するのかわかりません。 – rainer

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]

+0

返信いただきありがとうございます。私は自分自身を明確にしませんでした。問題は、セルを反復するのではなく、セルの値をComboBoxに取り込むことです。コンボボックスは、空のセルではなく、実際の値のみを受け入れます。私は、すべてのセルの内容を値で捕捉する方法が必要です。範囲の終わりは不明です。私はまた、 "値なし"と言うComboBoxのフィールドを必要としません。 – rainer

3

私はうまく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

パンダはxlrdを内部的に使用しています。 –

関連する問題