[英]Python (openpyxl) : Put data from one excel file to another (template file) & save it with another name while retaining the template
I have a template excel file named as template.xlsx
which has a number of sheets. 我有一个名为template.xlsx
的模板 excel文件,其中包含多个工作表。 I would like to copy data from a seperate .csv
file into the first sheet of template.xlsx
(named as data
) and save the new file as result.xlsx
while retaining the original template file. 我想将单独的.csv
文件中的数据复制到第一张template.xlsx
(命名为data
)中,并将新文件保存为result.xlsx
同时保留原始模板文件。
I want to paste the data starting from the second row in the data
sheet of template.xlsx
我想从template.xlsx
的data
表中的第二行开始粘贴数据
This is the code I have developed so far 这是我到目前为止开发的代码
import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
import openpyxl
from shutil import copyfile
template_file = 'template.xlsx' # Has a header in row 1 already which needs to be skipped while pasting data but it should be there in the output file
output_file = 'result.xlsx'
copyfile(template_file, output_file)
df = pd.read_csv('input_file.csv') #The file which is to be pasted in the template
wb = openpyxl.load_workbook(output_file)
ws = wb.get_sheet_by_name('data') #Getting the sheet named as 'data'
for r in dataframe_to_rows(df, index=False, header=False):
ws.append(r)
wb.save(output_file)
I am not able to get the desired output 我无法获得所需的输出
The template file (with an extra row) on the left and the input file (data to be copied to the template) on the right, look like this 左侧的模板文件(带有一个额外的行)和右侧的输入文件(要复制到模板的数据),看起来像这样
There's not really any need to use the shutil module, as you could just use openpyxl.load_workbook to load your template and then save by a different name. 实际上并不需要使用shutil模块,因为您可以使用openpyxl.load_workbook加载模板,然后使用其他名称进行保存。
Additionally, ws.append(r)
inside you're for loop will append to the existing data taken form template.xlsx, and it sounds like you only want to keep the header. 另外,你在for循环中的ws.append(r)
将附加到从template.xlsx获取的现有数据,听起来你只想保留标题。
I've provided a fully reproducible example below that creates 'template.xlsx' for demonstration purposes. 我在下面提供了一个完全可重现的示例,它可以创建'template.xlsx'用于演示目的。 Then it loads 'template.xlsx' adds new data to it and saves as result.xlsx. 然后加载'template.xlsx'向其添加新数据并保存为result.xlsx。
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.chart import PieChart, Reference, Series
import pandas as pd
template_file = 'template.xlsx'
output_file = 'result.xlsx'
#This part creates a workbook called template.xlsx with a sheet called 'data' and sheet called 'second_sheet'
writer = pd.ExcelWriter('template.xlsx', engine='openpyxl')
wb = writer.book
df = pd.DataFrame({'Pie': ["Cream", "Cherry", "Banoffee", "Apple"],
'Sold': [2, 2, 1, 4]})
df.to_excel(writer, index=False, sheet_name='data', startrow=1)
ws = writer.sheets['data']
ws['A1'] = 1
ws['B1'] = 2
ch = PieChart()
labels = Reference(ws, min_col=1, min_row=3, max_row=6)
data = Reference(ws, min_col=2, min_row=3, max_row=6)
ch.series = (Series(data),)
ch.title = "Pies sold"
ws.add_chart(ch, "D2")
ws = wb.create_sheet("Second_sheet")
ws['A1'] = 'This Sheet will not be overwitten'
wb.save(template_file)
#Now we load workbook called template.xlsx modify the 'data' sheet and save under a new name
#template.xlsx has not been modified
df_new = pd.DataFrame({'different_name': ["Blueberry", "Pumpkin", "Mushroom", "Turnip"],
'different_numbers': [4, 6, 2, 1]})
wb = load_workbook(template_file)
ws = wb.get_sheet_by_name('data') #Getting the sheet named as 'data'
rows = dataframe_to_rows(df_new, index=False, header=False)
for r_idx, row in enumerate(rows, 1):
for c_idx, value in enumerate(row, 1):
ws.cell(row=r_idx+2, column=c_idx, value=value)
wb.save(output_file)
Expected Output: 预期产出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.