2017-09-06 1 views
0

Je veux analyser Excel et mettre des données dans le modèle (utilisateur). Cependant maintenant, seule la dernière des données Excel est mis dans le modèle et le nombre des données est 4.4 est le nombre de lignes comme tous Excel excelSeules les dernières données Excel sont mises dans le modèle

maintenant db.sqlite3 est

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

Mon idéal db.sqlite3 est

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

toutes les données que vous voulez y mettre. Pourquoi un tel résultat se produit-il? views.py est

#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() 

Quand j'imprime des lignes dans print(rows), le résultat est

Blear 
Tom 
Rose 
Karen 

donc je pense que les lignes a toutes les données dans Excel. models.py est

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) 

Comment puis-je résoudre ce problème?

+0

Je veux juste vérifier que vous accédez à la feuille 2 en appelant 'sheet = book.sheet_by_index (1)', si vous voulez accéder à la feuille 1, vous devez appeler 'sheet = book.sheet_by_index (0)' – kaza

+0

@bulbus c'est ok parce que je veux lire la feuille 2. – user8504021

Répondre

0

A la fin de ce bloc, rows n'a que les valeurs de la dernière ligne (La ligne avec Karen).

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

Maintenant, après ce qui précède, lorsque vous faites ce qui suit, vous itérez sur les valeurs dans la dernière rangée. Rappelez-vous aussi vous n'utilisez pas row à l'intérieur du pour le bloc qui est une itérer de valeur de la cellule unique sur ['',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() 

Vous devez corriger le bloc ci-dessus comme ci-dessous ..

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() 

S'il vous plaît noter que j'ai pas pris soin de la ligne d'en-tête. S'il vous plaît faites-le à votre fin si nécessaire.

+0

Aussi il devrait y avoir six entrées identiques dans votre db, je suis surpris qu'il n'y en ait que quatre! – kaza

+0

thx, votre réponse.Je lis votre réponse, mais je ne peux pas comprendre où je devrais réécrire.Je ne peux pas trouver la différence entre mes codes et les vôtres.Où dois-je résoudre? Et, pourquoi pensez-vous qu'il devrait y avoir six entrées identiques? cet utilisateur (id_utilisateur = lignes [1], nom_id = lignes [2], nom = lignes [3], age = lignes [4], man = is_man, employee = emp) place? Si vous êtes i, comment allez-vous écrire pour éviter l'erreur de numéro de DB? – user8504021

+0

Désolé pour la confusion plus tôt, je viens de coller votre code et a indiqué où il allait mal, je n'avais pas mis dans le code corrigé. Maintenant, j'ai modifié pour mettre dans le bloc de code corrigé. S'il vous plaît remplacer «SEULEMENT votre dernier pour la boucle avec le mien et voir si cela fonctionne. – kaza