Je souhaite ajouter des données à Excel
Ce code fonctionne presque comme un désir. Bien que cela ne s'ajoute pas à chaque fois. Je le lance et il met le cadre de données dans Excel. Mais chaque fois que je l'exécute, cela ne s'ajoute pas. J'entends aussi que openpyxl est un processeur intensif mais n'entends pas parler de beaucoup solutions de contournement .
import pandas
from openpyxl import load_workbook
book = load_workbook('C:\\OCC.xlsx')
writer = pandas.ExcelWriter('C:\\OCC.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df1.to_Excel(writer, index = False)
writer.save()
Je veux que les données soient ajoutées chaque fois que je les exécute, cela ne se produit pas.
La sortie des données ressemble aux données d'origine:
A B C
H H H
Je veux après courir une deuxième fois
A B C
H H H
H H H
Excuses si cela est évident, je découvre Python pour la première fois et les exemples que je pratique ne marchaient pas comme souhaité.
La question est: comment puis-je ajouter des données à chaque fois que je cours? J'essaie de passer à xlsxwriter mais j'obtiens AttributeError: 'Workbook' object has no attribute 'add_format'
tout d'abord, cet article est le premier élément de la solution, dans lequel vous devez spécifier startrow=
: Ajouter une feuille Excel existante avec un nouveau cadre de données à l'aide de python pandas
vous pourriez aussi considérer header=False
. Il devrait donc ressembler à ceci:
df1.to_Excel(writer, startrow = 2,index = False, Header = False)
si vous voulez qu'il arrive automatiquement à la fin de la feuille et ajoute votre df, utilisez:
startrow = writer.sheets['Sheet1'].max_row
et si vous voulez qu'il passe en revue toutes les feuilles du cahier:
for sheetname in writer.sheets:
df1.to_Excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)
btw: pour le writer.sheets
vous pouvez utiliser la compréhension du dictionnaire (je pense que c'est plus propre, mais c'est à vous de décider, cela produit le même résultat):
writer.sheets = {ws.title: ws for ws in book.worksheets}
donc le code complet sera:
import pandas
from openpyxl import load_workbook
book = load_workbook('test.xlsx')
writer = pandas.ExcelWriter('test.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = {ws.title: ws for ws in book.worksheets}
for sheetname in writer.sheets:
df1.to_Excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)
writer.save()
Voici une fonction d'assistance:
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
# ignore [engine] parameter if it was passed
if 'engine' in to_Excel_kwargs:
to_Excel_kwargs.pop('engine')
writer = pd.ExcelWriter(filename, engine='openpyxl')
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()
Exemples d'utilisation:
filename = r'C:\OCC.xlsx'
append_df_to_Excel(filename, df)
append_df_to_Excel(filename, df, header=None, index=False)
append_df_to_Excel(filename, df, sheet_name='Sheet2', index=False)
append_df_to_Excel(filename, df, sheet_name='Sheet2', index=False, startrow=25)
J'ai essayé de lire un fichier Excel, de le placer dans un cadre de données, puis de concatter le cadre de données à partir d'Excel avec le cadre de données souhaité. Cela a fonctionné pour moi.
def append_df_to_Excel(df, Excel_path):
df_Excel = pd.read_Excel(excel_path)
result = pd.concat([df_Excel, df], ignore_index=True)
result.to_Excel(excel_path, index=False)
df = pd.DataFrame({"a":[11,22,33], "b":[55,66,77]})
append_df_to_Excel(df, r"<path_to_dir>\<out_name>.xlsx")