2017-09-14 1 views
-1

J'ai été bloqué pendant un moment en essayant d'étendre les numéros de ligne dans Excel en utilisant OpenPyxl et xlsxwriter.Ajouter des lignes avec des données et après la cellule correspondante

Maintenant mon dossier ressemble à:

enter image description here

Et je dois ajouter une autre donnée, ce qui correspond à la forme et déplacer tout vers le bas, il ressemblera à ceci:

enter image description here

J'ai mes données ['a', 'b', 'c'] stockées sous forme de liste. Ai-je besoin d'utiliser un dictionnaire à la place? Ou une approche facile?

Pour l'instant mon code ressemble:

from openpyxl import load_workbook 
from openpyxl import Workbook 
import xlsxwriter 
import collections 

INPUT_FILE = 'output.xlsx' 



wb = load_workbook(filename=INPUT_FILE) 
ws = wb['cond'] 

workbook = xlsxwriter.Workbook('data.xlsx') 
worksheet = workbook.add_worksheet() 


def get_data(start, stop, col): 
    mylist = [ws.cell(row=i,column= col).value for i in range(start,stop)] 
    findings = [v for i,v in enumerate(mylist) if mylist.index(v) == i] 
    return findings 

def get_data_row(start, stop, row): 
    mylist = [ws.cell(row = row, column = i).value for i in range(start, stop)] 
    values = [v for i,v in enumerate(mylist) if mylist.index(v) == i] 
    return values 

def write_from_dict(row, col, dict): 
    row = row 
    col = col 
    for key in dict.keys(): 
     worksheet.write(row, col, key) 
     for item in dict[key]: 
      worksheet.write(row, col + 1, item) 
      row += 1 



if __name__ == '__main__': 

    mammo_findings_list = get_data(2,10, 11) 
    us_findings_list = get_data(10, 17, 11) 
    mri_findings_list = get_data(17, 27, 11) 

    mammo_params_list = [get_data(2, 5, 14), get_data(5,8,14), 
         get_data(8, 9, 14), get_data(9,10, 14)] 
    mammo_data = dict(zip(mammo_findings_list,mammo_params_list)) 


    mammo = write_from_dict(1, 1, mammo_data) 


    shape_val = get_data_row(15, 19, 2) 
    margin_val = get_data_row(15, 19, 3) 
    density_val = get_data_row(15, 19, 4) 

    mass_dict = dict(zip(mammo_params_list[0],shape_val,margin_val,density_val])) 
    print(mass_dict) 

    test = write_from_dict(1,2,mass_dict) #eventually didn't work for me now 

    workbook.close() 

sortie Dictionnaire:

{'Shape': ['Oval, Round', None, 'Irregular'], 'Margin': ['Circumscribed', None, 'Obscured, Microlobulated, Indistinct, Spiculated'], 'Density': ['High density', 'Equal density, Low density', None]} 
{'Mass': ['Shape', 'Margin', 'Density'], 'Calcifications': ['Typically benign', 'Suspicious morphology', 'Distribution'], 'Assymetry': ['Assymetry'], 'Lymph nodes': ['Lymph nodes']} 

Et je dois juste ajouter/fusionner ces données en quelque sorte et écrire tout à Excel en même temps.

Merci!

+2

À quoi ressemble votre code pour le moment? –

+0

@CharlieClark éditée post. –

+0

Merci. Une raison pour laquelle vous utilisez les deux bibliothèques? openpyxl devrait être capable de faire tout ce dont vous avez besoin. –

Répondre

1

Si nous nous limitons à la conversion d'un dictionnaire de termes en colonnes pertinentes dans une feuille de calcul.

values_dict = { 
'Shape': ['Oval, Round', None, 'Irregular'], 
'Margin': ['Circumscribed', None, 'Obscured, Microlobulated, Indistinct, Spiculated'], 
'Density': ['High density', 'Equal density, Low density', None] 
} 

Si ce n'est pas le cas, les listes contenues dans les chaînes doivent d'abord être agrandies.

L'approche la plus simple consiste à travailler avec chaque clé, paire de valeurs séparément. Pour openpyxl ce serait

for col, (key, values) in enumerate(values_dict.items(), start=1): 
    ws.cell(row=1, column=col, value=key) # column title 
    for row, v in enumerate(values, start=2): 
     ws.cell(row=2, column=col, value=v) # column values 

Mais cela implique beaucoup de la ligne et de la cellule de coordonnées comptage que nous essayons et éviter dans openpyxl. Une approche alternative consiste à utiliser zip pour convertir les colonnes de valeurs en lignes que nous pouvons ajouter.

from itertools import zip_longest 
headers = [] 
values = [] 
for k, v in values_dict.items(): 
    headers.append(k) 
    values.append(v) 
ws.append(headers) 
for row in zip_longest(*values): 
    ws.append(row) 

Bien entendu, il vaudrait mieux que les structures intermédiaires soient éliminées.