You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保留原有数据的前提下更新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}")

核心改动说明:

  1. 保留原有工作簿:不再直接用df.to_excel生成新文件,而是把新数据写入到已经加载好的原有工作表中,确保旧数据不会丢失。
  2. 完整保存工作簿:最后将包含新旧数据的整个工作簿保存到输出流,再上传回Blob Storage,这样上传的文件就是完整的更新版本。
  3. 灵活选择上传方式:可以选择直接覆盖原文件,或者保存为新文件,根据你的需求调整即可。

备注:内容来源于stack exchange,提问作者user3498592

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:59:32