如何在保留原有数据的前提下更新Azure Blob Storage中的Excel工作表?
如何在保留原有数据的前提下更新Azure Blob Storage中的Excel工作表?
嗨,我看了你的代码,问题出在这儿:你虽然加载了原有的Excel工作簿,但最终上传时只把新的DataFrame写入了output流,完全没把原有工作簿的内容包含进去,所以旧数据自然就被覆盖啦。
要解决这个问题,我们需要在加载好的原有工作簿里添加新数据,然后把整个更新后的工作簿上传,而不是直接用df.to_excel生成全新的文件。下面是修改后的代码,我标注了关键改动点:
from azure.storage.blob import BlobServiceClient import pandas as pd import logging import openpyxl as xl import io def update_excel(): try: # Azure Blob Storage Configuration account_name = 'account_name' account_key = 'account_key' connect_str = 'DefaultEndpointsProtocol=https;AccountName=' + account_name + ';AccountKey=' + account_key + ';EndpointSuffix=core.windows.net' # 创建Blob服务客户端 blob_service_client = BlobServiceClient.from_connection_string(connect_str) # 容器信息 container = 'container_name' directory = 'directory_name' # 获取容器客户端 container_client = blob_service_client.get_container_client(container) # Excel文件信息 excel_name = 'Excel_file.xlsx' sheet_name = 'Sheet1' blob_name = directory + '/' + excel_name # 下载Blob到内存 blob_client = blob_service_client.get_blob_client(container=container, blob=blob_name) downloaded_blob = blob_client.download_blob() # 加载原有的Excel工作簿 wb1 = xl.load_workbook(filename=io.BytesIO(downloaded_blob.read()), keep_vba=False) ws = wb1[sheet_name] max_row = ws.max_row # 创建要添加的新数据DataFrame data = {'Name': ['Tom', 'nick', 'krish', 'jack'], 'Age': ['20', '30', '40', '50'] } df = pd.DataFrame(data) # 关键改动1:把DataFrame的数据逐行写入原有工作表的下方 for r_idx, row in enumerate(df.values, start=max_row + 1): for c_idx, value in enumerate(row, start=2): # startcol=1对应Excel的B列(索引从1开始) ws.cell(row=r_idx, column=c_idx, value=value) # 关键改动2:把整个更新后的工作簿保存到输出流 output = io.BytesIO() wb1.save(output) output.seek(0) # 上传回Blob Storage:如果要覆盖原文件用原blob_name,要保留原文件就用新文件名 container_client.upload_blob(name=blob_name, data=output, overwrite=True) # 若要保存为新文件,替换上面的name参数即可 # container_client.upload_blob(name=directory + '/Excel_file_new.xlsx', data=output, overwrite=True) except Exception as e: logging.error(f"Error: {e}")
核心改动说明:
- 保留原有工作簿:不再直接用
df.to_excel生成新文件,而是把新数据写入到已经加载好的原有工作表中,确保旧数据不会丢失。 - 完整保存工作簿:最后将包含新旧数据的整个工作簿保存到输出流,再上传回Blob Storage,这样上传的文件就是完整的更新版本。
- 灵活选择上传方式:可以选择直接覆盖原文件,或者保存为新文件,根据你的需求调整即可。
备注:内容来源于stack exchange,提问作者user3498592
相关产品推荐
相关产品推荐

