J'ai actuellement ce code. Cela fonctionne parfaitement.
Il parcourt les fichiers Excel dans un dossier, supprime les 2 premières lignes, puis les enregistre en tant que fichiers Excel individuels, et enregistre également les fichiers dans la boucle en tant que fichier ajouté.
Actuellement, le fichier ajouté écrase le fichier existant chaque fois que j'exécute le code.
J'ai besoin d'ajouter les nouvelles données au bas de la feuille Excel déjà existante ('master_data.xlsx)
dfList = []
path = 'C:\\Test\\TestRawFile'
newpath = 'C:\\Path\\To\\New\\Folder'
for fn in os.listdir(path):
# Absolute file path
file = os.path.join(path, fn)
if os.path.isfile(file):
# Import the Excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(file)
# View the Excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('Sheet1',header= None)
df_NoHeader = df[2:]
data = df_NoHeader
# Save individual dataframe
data.to_Excel(os.path.join(newpath, fn))
dfList.append(data)
appended_data = pd.concat(dfList)
appended_data.to_Excel(os.path.join(newpath, 'master_data.xlsx'))
Je pensais que ce serait une tâche simple, mais je suppose que non. Je pense que je dois importer le fichier master_data.xlsx en tant que trame de données, puis faire correspondre l'index avec les nouvelles données ajoutées et le sauvegarder. Ou peut-être existe-t-il un moyen plus simple. Toute aide est appréciée.
Une fonction d'aide pour ajouter DataFrame à existant Fichier Excel:
def append_df_to_Excel(filename, df, sheet_name='Sheet1', startrow=None,
truncate_sheet=False,
**to_Excel_kwargs):
"""
Append a DataFrame [df] to existing Excel file [filename]
into [sheet_name] Sheet.
If [filename] doesn't exist, then this function will create it.
Parameters:
filename : File path or existing ExcelWriter
(Example: '/path/to/file.xlsx')
df : dataframe to save to workbook
sheet_name : Name of sheet which will contain DataFrame.
(default: 'Sheet1')
startrow : upper left cell row to dump data frame.
Per default (startrow=None) calculate the last row
in the existing DF and write to the next row...
truncate_sheet : truncate (remove and recreate) [sheet_name]
before writing DataFrame to Excel file
to_Excel_kwargs : arguments which will be passed to `DataFrame.to_Excel()`
[can be dictionary]
Returns: None
"""
from openpyxl import load_workbook
import pandas as pd
# ignore [engine] parameter if it was passed
if 'engine' in to_Excel_kwargs:
to_Excel_kwargs.pop('engine')
writer = pd.ExcelWriter(filename, engine='openpyxl')
# Python 2.x: define [FileNotFoundError] exception if it doesn't exist
try:
FileNotFoundError
except NameError:
FileNotFoundError = IOError
try:
# try to open an existing workbook
writer.book = load_workbook(filename)
# get the last row in the existing Excel sheet
# if it was not specified explicitly
if startrow is None and sheet_name in writer.book.sheetnames:
startrow = writer.book[sheet_name].max_row
# truncate sheet
if truncate_sheet and sheet_name in writer.book.sheetnames:
# index of [sheet_name] sheet
idx = writer.book.sheetnames.index(sheet_name)
# remove [sheet_name]
writer.book.remove(writer.book.worksheets[idx])
# create an empty sheet [sheet_name] using old index
writer.book.create_sheet(sheet_name, idx)
# copy existing sheets
writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
except FileNotFoundError:
# file does not exist yet, we will create it
pass
if startrow is None:
startrow = 0
# write out the new sheet
df.to_Excel(writer, sheet_name, startrow=startrow, **to_Excel_kwargs)
# save the workbook
writer.save()
Ancienne réponse: elle vous permet d'écrire un plusieurs DataFrames dans un nouveau fichier Excel.
Vous pouvez utiliser le moteur openpyxl
en conjonction avec le paramètre startrow
:
In [48]: writer = pd.ExcelWriter('c:/temp/test.xlsx', engine='openpyxl')
In [49]: df.to_Excel(writer, index=False)
In [50]: df.to_Excel(writer, startrow=len(df)+2, index=False)
In [51]: writer.save()
c: /temp/test.xlsx:
PS, vous pouvez également spécifier header=None
si vous ne voulez pas dupliquer les noms de colonnes ...
MISE À JOUR: vous pouvez également vérifier cette solution