使用Python覆盖Excel中的工作表
问题内容:
我是Python(和一般编程)的新手,在将数据写到Excel中的工作表时遇到了问题。
我正在读取Excel文件,对特定列执行总和计算,然后将结果写到新工作簿中。然后最后,它根据结果创建两个图表。
该代码有效,除了每次运行时,它都会创建新的工作表,并在其末尾附加数字。我真的只希望它覆盖我提供的工作表名称,而不是创建新的工作表名称。
我对所有模块都不熟悉,无法理解所有可用的选项。我已经研究过openpyxl和pandas,并且与我尝试做的类似的例子很难找到,或者当我尝试使用它们时似乎不起作用。
import pandas as pd
import xlrd
import openpyxl as op
from openpyxl import load_workbook
import matplotlib.pyplot as plt
# declare the input file
input_file = 'TestData.xlsx'
# declare the output_file name to be written to
output_file = 'TestData_Output.xlsx'
book = load_workbook(output_file)
writer = pd.ExcelWriter(output_file, engine='openpyxl')
writer.book = book
# read the source Excel file and calculate sums
excel_file = pd.read_excel(input_file)
num_events_main = excel_file.groupby(['Column1']).sum()
num_events_type = excel_file.groupby(['Column2']).sum()
# create dataframes and write names and sums out to new workbook/sheets
df_1 = pd.DataFrame(num_events_main)
df_2 = pd.DataFrame(num_events_type)
df_1.to_excel(writer, sheet_name = 'TestSheet1')
df_2.to_excel(writer, sheet_name = 'TestSheet2')
# save and close
writer.save()
writer.close()
# dataframe for the first sheet
df = pd.read_excel(output_file, sheet_name='TestSheet1')
values = df[['Column1', 'Column3']]
# dataframe for the second sheet
df = pd.read_excel(output_file, sheet_name='TestSheet2')
values_2 = df[['Column2', 'Column3']]
# create the graphs
events_graph = values.plot.bar(x = 'Column1', y = 'Column3', rot = 60) # rot = rotation
type_graph = values_2.plot.bar(x = 'Column2', y = 'Column3', rot = 60) # rot = rotation
plt.show()
我得到了预期的结果,图表工作正常。我真的很想让每次运行都覆盖这些表。
问题答案:
通过指定唯一的sheet_name可以写入多张纸。将所有数据写入文件后,必须保存更改。请注意,使用已经存在的文件名创建ExcelWriter对象将导致现有文件的内容被删除。
尝试像这样写书
import pandas as pd
df = pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
writer = pd.ExcelWriter('g.xlsx')
df.to_excel(writer, sheet_name = 'first_df')
df.to_excel(writer, sheet_name = 'second_df')
writer.save()
如果您检查工作簿,则将有两个工作表。
然后说您想将新数据写入同一工作簿:
writer = pd.ExcelWriter('g.xlsx')
df.to_excel(writer, sheet_name = 'new_df')
writer.save()
如果您现在检查工作簿,您将只有一个名为 new_df
如果您要保留excel文件中的其他工作表,而只是覆盖所需的工作表,则需要使用load_workbook
。
在写入任何数据之前,可以删除要写入的工作表:
std=book.get_sheet_by_name(<sheee_name>)
book.remove_sheet(std)
一旦您尝试编写具有重复工作表名称的工作簿,这将停止在工作表名称后附加数字的行为。