def importation(file): try: wb = load_workbook(filename=file, read_only=True) mySession = { "attributes": [], "k_calculus": [ {"method": "multiplicative", "active": True, "k": [], "GK": None, "GU": None}, {"method": "multilinear", "active": False, "k": [], "GK": None, "GU": None}, ], } for sheet in wb: myAttribut = {} ws = wb[sheet.title] # ws is now an IterableWorksheet if sheet.title == "Multi attribute multilinear" or sheet.title == "Multi attribute multiplicative": continue myAttribut["name"] = ws["B2"].value myAttribut["unit"] = ws["B3"].value myAttribut["val_min"] = ws["B4"].value myAttribut["val_max"] = ws["B5"].value myAttribut["method"] = ws["B6"].value myAttribut["mode"] = ws["B7"].value myAttribut["checked"] = ws["B8"].value myAttribut["questionnaire"] = {} ligne = 3 number = 0 mesPoints = [] while ws["C" + str(ligne)].value != None: mesPoints.append([ws["C" + str(ligne)].value, ws["D" + str(ligne)].value]) ligne = ligne + 1 number = number + 1 myAttribut["questionnaire"]["points"] = mesPoints myAttribut["questionnaire"]["number"] = number mySession["attributes"].append(myAttribut) for sheet in wb: ws = wb[sheet.title] # ws is now an IterableWorksheet if sheet.title != "Multi attribute multilinear" and sheet.title != "Multi attribute multiplicative": continue ligne = 2 mesK = [] while ws["C" + str(ligne)].value != None: mesK.append( { "ID": ws["A" + str(ligne)].value, "ID_attribute": json.loads(ws["D" + str(ligne)].value), "attribute": json.loads(ws["C" + str(ligne)].value), "value": ws["B" + str(ligne)].value, } ) ligne = ligne + 1 if sheet.title == "Multi attribute multilinear": mySession["k_calculus"][1]["k"] = mesK mySession["k_calculus"][1]["GK"] = ws["B" + str(ligne)].value elif sheet.title == "Multi attribute multiplicative": mySession["k_calculus"][0]["k"] = mesK mySession["k_calculus"][0]["GK"] = ws["B" + str(ligne)].value try: GU = {"U": None, "utilities": [], "k": mesK} GU["U"] = ws["B" + str(len(mesK) + 5)].value ligne = 2 while ws["E" + str(ligne)].value != None: utilityType = ws["E" + str(ligne)].value if utilityType == None: # we brake all ligne = 2 break ID_attribute = ws["D" + str(ligne)].value.replace("[", "").replace("]", "") monAttribut = mySession["attributes"][int(ID_attribute)] points = monAttribut["questionnaire"]["points"][:] if monAttribut["mode"] == "normal": points.append([monAttribut["val_max"], 1]) points.append([monAttribut["val_min"], 0]) else: points.append([monAttribut["val_max"], 0]) points.append([monAttribut["val_min"], 1]) allUtilities = fit.regressions_under_list_form(points) for myUtility in allUtilities: if myUtility["type"] == utilityType: GU["utilities"].append(myUtility) break ligne = ligne + 1 if ligne != 2: # If we have some utilityType function, ligne is different from 2 if sheet.title == "Multi attribute multilinear": mySession["k_calculus"][1]["GU"] = GU elif sheet.title == "Multi attribute multiplicative": mySession["k_calculus"][0]["GU"] = GU except: # if it doesn't worl because there is no U or utilities type pass os.remove(file) return {"success": True, "data": mySession} except Exception, err: os.remove(file) return {"success": False, "data": traceback.format_exc()}
def importation(file): try: wb = load_workbook(filename=file, read_only=True) mySession = { 'attributes': [], 'k_calculus': [{ 'method': 'multiplicative', 'active': True, 'k': [], 'GK': None, 'GU': None }, { 'method': 'multilinear', 'active': False, 'k': [], 'GK': None, 'GU': None }] } for sheet in wb: myAttribut = {} ws = wb[sheet.title] # ws is now an IterableWorksheet if sheet.title == "Multi attribute multilinear" or sheet.title == "Multi attribute multiplicative": continue myAttribut['name'] = ws['B2'].value myAttribut['unit'] = ws['B3'].value myAttribut['val_min'] = ws['B4'].value myAttribut['val_max'] = ws['B5'].value myAttribut['method'] = ws['B6'].value myAttribut['mode'] = ws['B7'].value myAttribut['checked'] = ws['B8'].value myAttribut['questionnaire'] = {} ligne = 3 number = 0 mesPoints = [] while ws['C' + str(ligne)].value != None: mesPoints.append( [ws['C' + str(ligne)].value, ws['D' + str(ligne)].value]) ligne = ligne + 1 number = number + 1 myAttribut['questionnaire']['points'] = mesPoints myAttribut['questionnaire']['number'] = number mySession['attributes'].append(myAttribut) for sheet in wb: ws = wb[sheet.title] # ws is now an IterableWorksheet if sheet.title != "Multi attribute multilinear" and sheet.title != "Multi attribute multiplicative": continue ligne = 2 mesK = [] while ws['C' + str(ligne)].value != None: mesK.append({ 'ID': ws['A' + str(ligne)].value, 'ID_attribute': json.loads(ws['D' + str(ligne)].value), 'attribute': json.loads(ws['C' + str(ligne)].value), 'value': ws['B' + str(ligne)].value }) ligne = ligne + 1 if sheet.title == "Multi attribute multilinear": mySession['k_calculus'][1]['k'] = mesK mySession['k_calculus'][1]['GK'] = ws['B' + str(ligne)].value elif sheet.title == "Multi attribute multiplicative": mySession['k_calculus'][0]['k'] = mesK mySession['k_calculus'][0]['GK'] = ws['B' + str(ligne)].value try: GU = {'U': None, 'utilities': [], 'k': mesK} GU['U'] = ws['B' + str(len(mesK) + 5)].value ligne = 2 while ws['E' + str(ligne)].value != None: utilityType = ws['E' + str(ligne)].value if utilityType == None: #we brake all ligne = 2 break ID_attribute = ws['D' + str(ligne)].value.replace( "[", "").replace("]", "") monAttribut = mySession['attributes'][int(ID_attribute)] points = monAttribut['questionnaire']['points'][:] if monAttribut['mode'] == "normal": points.append([monAttribut['val_max'], 1]) points.append([monAttribut['val_min'], 0]) else: points.append([monAttribut['val_max'], 0]) points.append([monAttribut['val_min'], 1]) allUtilities = fit.regressions_under_list_form(points) for myUtility in allUtilities: if myUtility['type'] == utilityType: GU['utilities'].append(myUtility) break ligne = ligne + 1 if ligne != 2: #If we have some utilityType function, ligne is different from 2 if sheet.title == "Multi attribute multilinear": mySession['k_calculus'][1]['GU'] = GU elif sheet.title == "Multi attribute multiplicative": mySession['k_calculus'][0]['GU'] = GU except: #if it doesn't worl because there is no U or utilities type pass os.remove(file) return {'success': True, 'data': mySession} except Exception, err: os.remove(file) return {'success': False, 'data': traceback.format_exc()}
def generate_fichier(data): # On crée un "classeur" r = random.randint(1,1000) classeur = xlsxwriter.Workbook('fichier'+str(r)+'.xlsx') # On ajoute une feuille au classeur for monAttribut in data['attributes']: feuille = classeur.add_worksheet(monAttribut['name']) format01 = classeur.add_format() format01.set_num_format('0.00') formatCoeff = classeur.add_format() formatCoeff.set_num_format('0.000000') formatTitre = classeur.add_format() formatTitre.set_bg_color('#C0C0C0') formatTitre.set_bold() formatNom = classeur.add_format() formatNom.set_font_color('#D95152') formatNom.set_align('center') formatNom.set_bold() #ici on va mettre toutes les infos sur l'attribut #feuille.merge_range('A1:B1','Attribut') feuille.write(0,0, 'Attribut', formatTitre); feuille.write(0,1, '', formatTitre); feuille.write(1, 0, 'Name',formatNom) feuille.write(2, 0, 'Unit',formatNom) feuille.write(3, 0, 'Val_min',formatNom) feuille.write(4, 0, 'Val_max',formatNom) feuille.write(5, 0, 'Method',formatNom) feuille.write(6, 0, 'Mode',formatNom) feuille.write(7, 0, 'Active',formatNom) feuille.write(1, 1, monAttribut['name']) feuille.write(2, 1, monAttribut['unit']) feuille.write(3, 1, monAttribut['val_min']) feuille.write(4, 1, monAttribut['val_max']) feuille.write(5, 1, monAttribut['method']) feuille.write(6, 1, monAttribut['mode']) feuille.write(7, 1, monAttribut['checked']) feuille.write(8, 1, " ") feuille.write(9, 1, " ") feuille.write(10, 1, " ") feuille.write(11, 1, " ") feuille.write(12, 1, " ") feuille.write(13, 1, " ") #ensuite on va mettre les points obtenus: #feuille.merge_range('C1:D1','Points') feuille.write(0,2, 'Points', formatTitre); feuille.write(0,3, '', formatTitre); feuille.write(1, 2, "Y") feuille.write(1, 3, "X") #on va maintenant les remplir lignePoint=0 for monPoint in monAttribut['questionnaire']['points']: feuille.write(lignePoint+2, 2, monPoint[0]) feuille.write(lignePoint+2, 3, monPoint[1]) lignePoint=lignePoint+1 #Ensuite on s'occupe de la fonction d'utilité #feuille.merge_range('E1:F1','Utility Function') # on fait une regression à l'aide des points que l'on a dans le questionnaire et on envoit tout ça dans la fonction regressions du fichier fit.py points=monAttribut['questionnaire']['points'][:] if len(points)>0: if monAttribut['mode']=="normal": points.append([monAttribut['val_max'], 1]); points.append([monAttribut['val_min'], 0]); else: points.append([monAttribut['val_max'], 0]); points.append([monAttribut['val_min'], 1]); #go for fit regression using our points utilities=fit.regressions_under_list_form(points); else: #no need of fit regression because we don't have point utilities=[] ligne=0; for utility in utilities: feuille.write(ligne,4, 'Utility Function', formatTitre); feuille.write(ligne,5, '', formatTitre); feuille.write(ligne+1, 4, "type",formatNom) feuille.write(ligne+2, 4, "a",formatNom) feuille.write(ligne+3, 4, "b",formatNom) feuille.write(ligne+4, 4, "c",formatNom) feuille.write(ligne+5, 4, "d",formatNom) feuille.write(ligne+6, 4, "r2",formatNom) feuille.write(ligne+7, 4, "DPL",formatNom) #feuille.write(ligne, 5, utility) #Dans le cas ou la fonciton d'utilité est de type exp #on cherche quel est notre type de fonction d'utilite if utility['type']=='exp': feuille.write(ligne+1, 5, "exponential") if utility['type']=='quad': feuille.write(ligne+1, 5, "quadratic") if utility['type']=='pow': feuille.write(ligne+1, 5, "power") if utility['type']=='log': feuille.write(ligne+1, 5, "logarithm") if utility['type']=='lin': feuille.write(ligne+1, 5, "linear") #On rempli les coefficients try: #On remplit d'abord le dernier car pour les coefficients d ça s'arretera feuille.write(ligne+6, 5, utility['r2'], formatCoeff) feuille.write(ligne+7, 5, convert_to_text(utility, "x"), formatCoeff) feuille.write(ligne+2, 5, utility['a'], formatCoeff) feuille.write(ligne+3, 5, utility['b'], formatCoeff) feuille.write(ligne+4, 5, utility['c'], formatCoeff) feuille.write(ligne+5, 5, utility['d'], formatCoeff) except: pass feuille.set_column(5, 5, 20); feuille.write(ligne+0,6, 'Calculated points', formatTitre); feuille.write(ligne+0,7, '', formatTitre); #On va maintenant generer plusieurs points amplitude=(monAttribut['val_max']-monAttribut['val_min'])/10.0 for i in range(0,11): feuille.write(ligne+1+i, 6, i*amplitude ) if utility['type']=='exp': feuille.write_formula(ligne+1+i, 7, funcexp_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5))) elif utility['type']=='quad': feuille.write_formula(ligne+1+i, 7, funcquad_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5))) elif utility['type']=='pow': feuille.write_formula(ligne+1+i, 7, funcpuis_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5))) elif utility['type']=='log': feuille.write_formula(ligne+1+i, 7, funclog_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5), "$F$"+str(ligne+6))) elif utility['type']=='lin': feuille.write_formula(ligne+1+i, 7, funclin_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4))) #Ensuite on fait le Chart ! (le diagramme) chart5 = classeur.add_chart({'type': 'scatter', 'subtype': 'smooth'}) # Configure the first series. chart5.add_series({ 'name': utility['type'], 'categories': '='+monAttribut['name']+'!$G$'+str(ligne+2)+':$G$'+str(ligne+12), 'values': '='+monAttribut['name']+'!$H$'+str(ligne+2)+':$H$'+str(ligne+12), }) # Add a chart title and some axis labels. chart5.set_title ({'name': 'Utility Function'}) # Set an Excel chart style. chart5.set_style(4) chart5.set_x_axis({ 'min': monAttribut['val_min'], 'max': monAttribut['val_max'] }) # Insert the chart into the worksheet (with an offset). feuille.insert_chart('I'+str(1+ligne), chart5, {'x_offset': 25, 'y_offset': 10}) ligne+=15; for mesK in data['k_calculus']: feuille = classeur.add_worksheet("Multi attribute "+mesK['method']) formatTitre = classeur.add_format() formatTitre.set_bg_color('#C0C0C0') formatTitre.set_align('center') formatTitre.set_bold() formatNom = classeur.add_format() formatNom.set_font_color('#D95152') formatNom.set_align('center') formatNom.set_font_size(12) formatNom.set_bold() #ici on va mettre toutes les infos sur l'attribut feuille.write(0,0, 'K', formatTitre); feuille.set_column(0, 0, 10); feuille.write(0,1, 'Value', formatTitre); feuille.write(0,2, 'Attribute', formatTitre); feuille.set_column(2, 2, 30); feuille.write(0,3, 'IDAttribute', formatTitre); feuille.set_column(3, 3, 10); feuille.write(0,4, 'utility type', formatTitre); feuille.set_column(4, 4, 15); ligne=1 for monK in mesK['k']: feuille.write(ligne, 0, monK['ID'], formatNom) feuille.write(ligne, 1, monK['value']) feuille.write(ligne, 2, json.dumps(monK['attribute'])) feuille.write(ligne, 3, json.dumps(monK['ID_attribute'])) ligne=ligne+1 if mesK['method']=="multiplicative": feuille.write(ligne, 0, "K", formatNom) feuille.write(ligne, 1, mesK['GK']) else: feuille.write(ligne, 0, " ", formatNom) feuille.write(ligne, 1, mesK['GK']) ligne=ligne+3 if mesK['GU']!=None: feuille.write(ligne,0, 'DPL', formatNom); feuille.write(ligne,1, mesK['GU']['U']); ligne=0 utilities=mesK['GU']['utilities'] numberUtilities=len(utilities) k=mesK['GU']['k'] numero=1 for myUtility in utilities: feuille.write(numero, 4, myUtility['type']) feuille.write(ligne,4+numero, "x"+str(numero), formatTitre) feuille.write(ligne+1,4+numero, 1) feuille.write(ligne,4+numero+numberUtilities, "u"+str(numero)+"(x"+str(numero)+")", formatTitre) if myUtility['type']=='exp': feuille.write_formula(ligne+1, 4+numero+numberUtilities, funcexp_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c']))) elif myUtility['type']=='quad': feuille.write_formula(ligne+1, 4+numero+numberUtilities, funcquad_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c']))) elif myUtility['type']=='pow': feuille.write_formula(ligne+1, 4+numero+numberUtilities, funcpuis_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c']))) elif myUtility['type']=='log': feuille.write_formula(ligne+1, 4+numero+numberUtilities, funclog_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c']), str(myUtility['d']))) elif myUtility['type']=='lin': feuille.write_formula(ligne+1, 4+numero+numberUtilities, funclin_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']))) numero=numero+1 feuille.write(ligne,4+numero+numberUtilities, "U", formatTitre) def K(i): return xl_rowcol_to_cell(i,1, row_abs=True, col_abs=True) def U(i): return xl_rowcol_to_cell(ligne+1,4+i+numberUtilities) if mesK['method']=="multiplicative": if numberUtilities==2: GU=utilite2_excel(K(1), K(2), K(3), U(1), U(2)) feuille.write_formula(ligne+1,4+numero+numberUtilities, GU) if numberUtilities==3: #in reality K(4) is K GU=utilite3_excel(K(1), K(2), K(3), K(4), U(1), U(2), U(3)) feuille.write_formula(ligne+1,4+numero+numberUtilities, GU) if numberUtilities==4: GU=utilite4_excel(K(1), K(2), K(3), K(4), K(5), U(1), U(2), U(3), U(4)) feuille.write_formula(ligne+1,4+numero+numberUtilities, GU) if numberUtilities==5: GU=utilite5_excel(K(1), K(2), K(3), K(4), K(5), K(6), U(1), U(2), U(3), U(4), U(5)) feuille.write_formula(ligne+1,4+numero+numberUtilities, GU) if numberUtilities==6: GU=utilite6_excel(K(1), K(2), K(3), K(4), K(5), K(6), K(7), U(1), U(2), U(3), U(4), U(5), U(6)) feuille.write_formula(ligne+1,4+numero+numberUtilities, GU) else: nombre=1 GU="" for monK in k: GU+=K(nombre) for dk in monK['ID'].split(','): GU+="*"+U(int(dk)) GU+="+" nombre=nombre+1 GU=GU[:-1] feuille.write_formula(ligne+1,4+numero+numberUtilities, GU) # Ecriture du classeur sur le disque classeur.close() #On retourne le nom du fichier return 'fichier'+str(r)