如何用xlwings将股票价格写入Excel指定单元格且避免覆盖?
问题修复:股票股价写入Excel避免覆盖并对应指定单元格
问题原因
你的代码每次循环都将单个股价值写入B1:B3整个区域,导致后续获取的股价会完全覆盖之前的内容;同时没有区分GGAL和BMA对应的目标单元格(B2、B3),所以无法实现预期效果。
修复方案
核心是给每个股票指定对应的单个单元格写入,而不是覆盖整个区域。可以通过两种方式实现:
方式1:通过索引对应单元格位置
利用enumerate获取股票列表的索引,计算对应的目标行号(GGAL是第0个元素,对应B2;BMA是第1个元素,对应B3):
import xlwings as xw import time import yfinance as yf wb = xw.Book('EPGB V3.3.2 FE-AB - Python.xlsb') sht1 = wb.sheets['Dolar'] while True: try: tickers = ['GGAL','BMA'] # 枚举股票和对应的索引 for idx, ticker in enumerate(tickers): ticker_yahoo = yf.Ticker(ticker) data = ticker_yahoo.history() last_quote = data['Close'].iloc[-1] last_quote_decimals = "{:.2f}".format(last_quote) print(ticker, last_quote_decimals) # 索引0对应B2,索引1对应B3,行号为索引+2 sht1.range(f'B{idx+2}').value = last_quote_decimals time.sleep(10) except Exception as e: # 输出具体错误信息,便于调试 print(f'Hubo un error al actualizar excel: {str(e)}')
方式2:用字典映射股票与目标单元格
直接建立股票代码和目标单元格的映射关系,可读性更强,后续新增股票也方便扩展:
import xlwings as xw import time import yfinance as yf wb = xw.Book('EPGB V3.3.2 FE-AB - Python.xlsb') sht1 = wb.sheets['Dolar'] # 定义股票代码到目标单元格的映射 ticker_to_cell = { 'GGAL': 'B2', 'BMA': 'B3' } while True: try: for ticker, target_cell in ticker_to_cell.items(): ticker_yahoo = yf.Ticker(ticker) data = ticker_yahoo.history() last_quote = data['Close'].iloc[-1] last_quote_decimals = "{:.2f}".format(last_quote) print(ticker, last_quote_decimals) # 写入对应单元格 sht1.range(target_cell).value = last_quote_decimals time.sleep(10) except Exception as e: print(f'Hubo un error al actualizar excel: {str(e)}')
关键修改点
- 替换了原代码中
sht1.range('B1:B3').value = last_quote_decimals的整区域写入操作,改为单个单元格写入 - 优化异常处理,捕获并输出具体错误信息,方便排查问题
- 两种方式都能精准将GGAL写入B2、BMA写入B3,且不会互相覆盖
内容的提问来源于stack exchange,提问作者Martin Dvorkin
相关产品推荐
相关产品推荐

