2010-07-20 24 views
0

Mes données (tableur):Django importation d'arbre récursif avec XLRD

'1',,, 
,'1.1',, 
,,'1.1.1', 
,,'1.1.2', 
,,'1.1.3', 
,'1.2',, 
,'1.3',, 
,,'1.3.1', 
,,'1.3.2', 
,,'1.3.3', 
'2',,, 
,'2.1',, 
,,'2.1.1', 
,,,'2.1.1.1' 
,,,'2.1.1.2' 
,,,'2.1.1.3' 

Mon modèle:

class Vocabulary(models.Model): 
    name = CharField(max_length=60) 

class Concept(models.Model): 
    parent = ForeignKey('self', blank=True, null=True) 
    vocabulary = ForeignKey(Vocabulary) 
    name = CharField(max_length=60) 
    order = IntegerField(default=0) 

Ce que je suis en train de faire:

def recurse(sheet): 
    'Recurse outer edges of the tree saving concepts.' 
     + 'Imply subtree order numbers. There are no numbers in the real data.' 

Répondre

2

Il n'a pas été facile à comprendre, juste pour le partager. C'est ainsi que j'ai importé la hiérarchie d'Excel vers un simple arbre de liste d'adjacence en utilisant Python XLRD et Django.

class XLRDParseError(Exception): 
    """The XLS file was malformed.""" 

def load_xls(fname): 
    """Import a hierarchy into the DB from Excel""" 
    import xlrd 
    xlrd.open_workbook(fname) 
    firstSheet = book.sheet_by_index(0) 
    v = Vocabulary(title='New Import') 
    v.save() 
    vid = Vocabulary.objects.get(id=v.id) 
    conceptstack = [] 
    for row in range(firstSheet.nrows): 
     blank = 0 
     while True: 
      cell = firstSheet.cell(row, blank) 
      if cell.value: 
       break 
      blank += 1 
     concept = Concept(vocabulary=vid, name=cell.value) 
     concept.save() 
     if len(conceptstack) < blank: 
      raise XLRDParseError 
     if len(conceptstack) > blank: 
      for i in range(len(conceptstack) - blank): 
       conceptstack.pop() 
     if conceptstack: 
      concept.parent = conceptstack[-1] 
      concept.save() 
     conceptstack.append(concept) 

load_xls('/home/frank/top-navigation.xls') 

Mots-clés: hiérarchie, arbre d'importation à partir d'Excel, virgule import/onglet hiérarchie délimitée, les catégories d'importation à partir d'Excel, arbre Python Django XLRD import

+1

Une raison particulière pour faire 'xls = open (FNAME) .Lire() book = xlrd.open_workbook (file_contents = xls) 'au lieu de simplement' book = xlrd.open_workbook (fname) '? Remarque: le fichier doit être ouvert explicitement en mode 'rb' dans le cas où un utilisateur Windows copie aveuglément votre code. [FWIW, je suis l'auteur de xlrd] –

+0

Aucun vraiment, maintenant il semble plus propre. Je ne me soucie pas beaucoup des plates-formes mineures> :) –