Измените и обновите ячейку в Excel, используя python на основе ввода пользователя - PullRequest
0 голосов
/ 05 мая 2020
import pandas as pd
from openpyxl import load_workbook

#This is how to make a new dataframe and transfer it to a demo excel file in sheet1

# dataframe Name and Age columns
df = pd.DataFrame({'#': [1, 2, 3, 4], 'Name': ['John Doe', 'Jamie Perkins', 'Daryl Walker', 'Dave Mann'], 'Age': [10, 20, 30, 45]})

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('demo.xlsx', engine='xlsxwriter')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1', index=False)

# Close the Pandas Excel writer and output the Excel file.
writer.save()


#Up next is how to add new information to a sheet1


# new dataframe with same columns
df2 = pd.DataFrame({'#': [5, 6, 7, 8], 'Name': ['E','F','G','H'], 'Age': [100,70,40,60]})
writer = pd.ExcelWriter('demo.xlsx', engine='openpyxl')

# try to open an existing workbook
writer.book = load_workbook('demo.xlsx')

# copy existing sheets
writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets)

# read existing file
reader = pd.read_excel(r'demo.xlsx')

# write out the new sheet
df2.to_excel(writer,index=False,header=False,startrow=len(reader)+1)

writer.close()


#What I want to figure out is how to modify a name based on input from user and update the information to the existing cell in the excel file

num = input("Which name do you want to change?(choose a number)\n")

number = int(num)

if number == 1:
    nName = input("What is the new Name\n")

    df3 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df3.to_excel(writer,index=False,header=False,startrow=1)
    writer.close()

elif number == 2:
    nName = input("What is the new Name\n")

    df4 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df4.to_excel(writer,index=False,header=False,startrow=2)
    writer.close()

elif number == 3:
    nName = input("What is the new Name\n")

    df5 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df5.to_excel(writer,index=False,header=False,startrow=3)
    writer.close()

elif number == 4:
    nName = input("What is the new Name\n")

    df6 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df6.to_excel(writer,index=False,header=False,startrow=4)
    writer.close()

elif number == 5:
    nName = input("What is the new Name\n")

    df7 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df7.to_excel(writer,index=False,header=False,startrow=5)
    writer.close()

elif number == 6:
    nName = input("What is the new Name\n")

    df8 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df8.to_excel(writer,index=False,header=False,startrow=6)
    writer.close()

elif number == 7:
    nName = input("What is the new Name\n")

    df9 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df9.to_excel(writer,index=False,header=False,startrow=7)
    writer.close()

elif number == 8:
    nName = input("What is the new Name\n")

    df10 = pd.DataFrame({'Name': [nName]})

    writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')
    writer.book = load_workbook('demo.xlsx')
    reader = pd.read_excel(r'demo.xlsx')
    df10.to_excel(writer,index=False,header=False,startrow=8)
    writer.close()

else:
    print("Wrong input please try again")

Я знаю, как создать новый фрейм данных, перенести его в демонстрационный файл Excel и назвать его sheet1. Я также знаю, как добавлять новые данные в существующий файл Excel.

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

Буду признателен за любую помощь, которую я могу получить!

Редактировать: Спасибо за отзыв о синтаксисе, к сожалению, я все еще сталкиваюсь с ошибка файла Excel не обновляется, на терминале нет ошибки, но он не обновляется.

1 Ответ

0 голосов
/ 07 мая 2020

Когда я запускал ваш код, я получал новый лист «Sheet11» с обновленными данными, поэтому вам нужно указать имя листа и startcol в вашем to_excel.

Если ваш Excel маленький, вы можете изменить DataFrame и каждый раз перезаписывать весь лист. Ниже я объединяю 2 DataFrames в один, а затем изменяю оттуда.

#What I want to figure out is how to modify a name based on input from user and update the information to the existing cell in the excel file
df = pd.concat([df, df2], ignore_index=True)
print(df)

num = input("Which name do you want to change?(choose a number)\n")
number = int(num)

writer = pd.ExcelWriter('demo.xlsx', engine ='openpyxl')

if number in [1, 2, 3, 4, 5, 6, 7, 8]:
    nName = input("What is the new Name\n")
    df.loc[df['#']==number, 'Name'] = nName
    print(df)
    df.to_excel(writer, sheet_name='Sheet1', index=False)
    writer.close()
else:
    print("Wrong input please try again")

EDIT: Если вы просто хотите обновить одну ячейку, это работает:

#What I want to figure out is how to modify a name based on input from user and update the information to the existing cell in the excel file
df = pd.concat([df, df2], ignore_index=True)
print(df)
num = input("Which name do you want to change?(choose a number)\n")
number = int(num)

writer = pd.ExcelWriter('demo.xlsx', engine='openpyxl')
#Need to load the workbook, or it overwrites all data on the sheet.
writer.book = load_workbook('demo.xlsx')
#Evidently need to load the sheet names in order to write to an existing sheet
writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets) 

if number in [1, 2, 3, 4, 5, 6, 7, 8]:
    nName = input("What is the new Name\n")
    df.loc[df['#']==number, 'Name'] = nName
    print(df)
    df.loc[df['#']==number, 'Name'].to_excel(writer, sheet_name='Sheet1', index=False, header=None, startrow=number, startcol=1)
    writer.save()
else:
    print("Wrong input please try again")

Требуется ли для writer.book = load_workbook('demo.xlsx') подразумевает, что писатель каждый раз переписывает всю книгу?

...