Openpyxl Записать словарь в электронную таблицу - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над трекером белка, чтобы отслеживать количество белка, которое я съел сегодня, и у меня возникают проблемы с вводом значений в электронную таблицу. Я сохранил еду и связанные с ней значения белка в словаре (total_protein_dictionary), и когда я включаю операторы печати в свой код, он говорит, что значения вводятся в лист, но когда я иду проверить это в Excel, там ничего нет. Я пробовал пару разных вещей.

import openpyxl
def write_values_to_spreadsheet(file, total_protein_dictionary):
"""Takes the keys and values of the total protein dictionary and puts them in the spreasheet"""
wb = openpyxl.load_workbook(file)
sheet_names = wb.sheetnames
sheet = wb.get_sheet_by_name(sheet_names[0])
print(len(total_protein_dictionary))

for next_row in range(1, len(total_protein_dictionary)+1):
    food, protein_grams = total_protein_dictionary.popitem()
    sheet.cell(column=1 , row=next_row, value=food)
    sheet.cell(column=2 , row=next_row, value=protein_grams)

    wb.save(file)

вариант 2:

def write_values_to_spreadsheet(file, total_protein_dictionary):
"""Takes the keys and values of the total protein dictionary and puts them in the spreasheet"""
wb = openpyxl.load_workbook(file)

sheet_names = wb.sheetnames
sheet = wb.get_sheet_by_name(sheet_names[0])
print(len(total_protein_dictionary))


for key in range(1, len(total_protein_dictionary)+1):
    food, protein_grams = total_protein_dictionary.popitem()
    print(food, protein_grams)
    index = str(key)

    sheet['A' + index] = food
    sheet['B' + index] = protein_grams
    wb.save(file)

Почему все это не отображается в моем листе Excel? Кроме того, в чем разница между использованием

sheet_names = wb.sheetnames
sheet = wb.get_sheet_by_name(sheet_names[0])

и

wb.active

если я хочу работать на первом листе?

1 Ответ

0 голосов
/ 03 июля 2018

Хорошо, так что функция сама по себе работала нормально, проблема оказалась в моей функции run, и я действительно смог ее исправить. Вот код из моего обновленного write_values_to_spreadsheet и функции 'run'.

def write_values_to_spreadsheet(wb, total_protein_dictionary):
"""Takes the keys and values of the total protein dictionary and puts them in the spreasheet"""
    sheet = wb.active

    print(len(total_protein_dictionary))

    for next_row in range(1, len(total_protein_dictionary)+1):

        food, protein_grams = total_protein_dictionary.popitem()
        sheet.cell(column=1 , row=next_row, value=food)
        sheet.cell(column=2 , row=next_row, value=protein_grams)

def run(file):
"""Runs the whole program"""
    wb = openpyxl.load_workbook(file) #opens the workbook at the beginning
    checks_sheet_title(wb)
    #food_protein(x) function start
    eaten_today = str(input("Did you eat any food today?\n")).lower()
    total_protein_dictionary = {} #creates dictionary that can be updated, taken as a     paramter in food_protein

    if eaten_today == "yes":
        foods_documented = False #answers the question: has all food eaten today been accounted for?
        total_protein_dictionary.update(food_protein(total_protein_dictionary)) #updates with new food
        print(total_protein_dictionary)

        while foods_documented == False:
            more_food = str(input("Did you have any more food?\n"))
            if more_food == "yes":
                total_protein_dictionary.update(food_protein(total_protein_dictionary))
                print(total_protein_dictionary)
            elif more_food == "no":
                foods_documented = True #escapes

    print("Today you've had " + str(sum(total_protein_dictionary.values())) + " grams of protein so far today.")
    write_values_to_spreadsheet(wb, total_protein_dictionary)
    wb.save(file)

Первый бит 'run' предлагает пользователю создать словарь, затем в строке 35 вызывается write_values_to_spreadsheet. Что исправило проблему для меня, так это то, что я изменил write_values_to_spreadsheet, чтобы принимать wb в качестве параметра вместо файла, в процессе я удалил wb = openpyxl.load_workbook (file) и wb.save (file), потому что они были в «run». Я предполагаю, что они были бесполезны и вызывали проблему.

В любом случае, это работает сейчас!

...