2017-09-06 1 views
0

私は解析し、モデル(ユーザ)にデータを入れたいと思います。しかし今、唯一の最後のデータがモデルに入れられ、データの数は4.4であるEXCEL全ての数は今最後のExcelデータのみをモデルに入れます

|10|Karen||| 
|10|Karen||| 
|10|Karen||| 
|10|Karen||| 

私の理想的なdb.sqlite3がdb.sqlite3ある excel

のような行をエクセルであります

1|1|Blear|40|false|l 
2|5|Tom|23|true|o 
3|9|Rose|52|false|m 
|10|Karen||| 

すべてのデータがそこに入力されます。 なぜこのような結果が起こるのですか?私はprint(rows)の行を印刷するとき views.pyは、結果はので、私は行がExcelですべてのデータを持っていると思う

Blear 
Tom 
Rose 
Karen 

#coding:utf-8 
from django.shortcuts import render 
import xlrd 
from .models import User 

book = xlrd.open_workbook('../data/data.xlsx') 
sheet = book.sheet_by_index(1) 

for row_index in range(sheet.nrows): 
    rows = sheet.row_values(row_index) 
    print(rows) 

def build_employee(employee): 
    if employee == 'leader': 
    return 'l' 
    if employee == 'manager': 
    return 'm' 
    if employee == 'others': 
    return 'o' 

for row in rows: 
    is_man = rows[4] != "" 
    emp = build_employee(rows[5]) 
    user = User(user_id=rows[1], name_id=rows[2], name=rows[3], 
       age=rows[4],man=is_man,employee=emp) 
    user.save() 

です。 models.pyは、私はこの問題を解決するにはどうすればよい

class User(models.Model): 
    user_id = models.CharField(max_length=200) 
    name_id = models.CharField(max_length=200) 
    name = models.CharField(max_length=200) 
    age = models.CharField(max_length=200) 
    man = models.BooleanField() 
    TYPE_CHOICES = (
    ('m', 'manager'), 
    ('l', 'leader'), 
    ('o', 'others'), 
    ) 
    employee =models.CharField(max_length=1, choices=TYPE_CHOICES) 

のですか?

+0

'sheet = book.sheet_by_index(1)'を呼び出すことでシート2にアクセスしていることを確認したい場合は、シート1にアクセスしたい場合は 'sheet = book.sheet_by_index(0)'を呼び出す必要があります – kaza

+0

@bulbus私はシート2を読んでいるので大丈夫です。 – user8504021

答えて

0

このブロックの最後では、rowsは最後の行(Karenの行)の値のみを持ちます。

for row_index in range(sheet.nrows): 
    rows = sheet.row_values(row_index) 
    print(rows) 

上記を実行した後、以下を実行すると、最後の行の値が反復処理されます。また、あなたは...あなたは以下のように上記のブロックを修正する必要があり

['',10,'Karen','','','']オーバー
for row in rows: 
    is_man = rows[4] != "" 
    emp = build_employee(rows[5]) 
    user = User(user_id=rows[1], name_id=rows[2], name=rows[3], 
       age=rows[4],man=is_man,employee=emp) 
    user.save() 

を反復する単一のセル値であるブロックのため

for row_index in range(sheet.nrows): 
    rows = sheet.row_values(row_index) 
    is_man = rows[4] != "" 
    emp = build_employee(rows[5]) 
    user = User(user_id=rows[1], name_id=rows[2], name=rows[3], 
       age=rows[4],man=is_man,employee=emp) 
    user.save() 

を内部rowを使用していない覚えている私がしたことに注意してくださいヘッダー行を気にする必要はありません。もし必要なら、あなたの側でそうしてください。

+0

また、あなたのデータベースに6つの同一のエントリがある必要があります、私はわずか4つが驚いています! – kaza

+0

thx、ur answer.私は答えを読んでいますが、どこで書き直すべきかわかりません。私のコードとあなたの違いはわかりません。私はどこで修正すればい​​いですか?そして、なぜ6つの同一エントリーがあると思いますか?このユーザー(user_id =行[1]、name_id =行[2]、名前=行[3]、 年齢=行[4]、男= is_man、従業員= emp)場所?もしあなたが私の場合、どのようにあなたはdb番号のエラーを避けるために書くのですか? – user8504021

+0

混乱のおかげで申し訳ありませんが、コードを貼り付けて間違っていた箇所を指摘しましたが、修正されたコードは入れていませんでした。今私は訂正されたコードブロックを入れるように編集しました。 'あなたの最後のforループのみを私のものと置き換え、それが動作するかどうかを確認してください。 – kaza

関連する問題