使用win32com.client连接UniSim与Python时空单元格报错问题
问题描述
通过win32com.client在Jupyter Notebook中连接UniSim Design时,访问值为<empty>的单元格(对应代码sheet.Cell(0,13).CellValue,即UniSim中的A14单元格)触发报错,报错信息如下:
C:\ProgramData\Anaconda3\lib\site-packages\win32com\client\dynamic.py in __getattr__(self, attr) 626 ) 627 try: --> 628 ret = self._oleobj_.Invoke(retEntry.dispid, 0, invoke_type, 1) 629 except pythoncom.com_error as details: 630 if details.hresult in ERRORS_BAD_CONTEXT: com_error: (-2147352567, 'Exceção.', (0, None, None, None, 0, -2147467259), None)
连接UniSim的代码如下:
def abresim(): parent = os.path.dirname(os.getcwd()) unisim = win32.Dispatch('UniSimDesign.Application') unisim.visible=True simulation = unisim.SimulationCases.Open(os.path.join(os.path.dirname(os.getcwd()), 'directory with the UniSim file')) simulation.Activate() sheet = simulation.Flowsheet.Operations['Entradas'] # 我的UniSim文件中的表格 return unisim,simulation,sheet
需求:将UniSim中的空值转为0,实现无报错导入数据。
解决方案
可以通过捕获COM异常的方式处理空单元格场景,当访问CellValue触发空值对应的错误时,自动返回0替代。
方式1:封装工具函数(推荐)
编写一个复用性高的函数,安全获取单元格值:
import pythoncom def get_unisim_cell_value(sheet, row, col): try: return sheet.Cell(row, col).CellValue except pythoncom.com_error as e: # 匹配空单元格对应的底层错误码 if e.excepinfo[5] == -2147467259: return 0 # 其他异常正常抛出,不掩盖问题 raise
使用示例:
# 替换原来的sheet.Cell(0,13).CellValue cell_value = get_unisim_cell_value(sheet, 0, 13)
方式2:直接添加异常处理
如果只需要处理单个单元格,可以直接在访问代码中加入try-except:
try: cell_value = sheet.Cell(0,13).CellValue except pythoncom.com_error as e: if e.excepinfo[5] == -2147467259: cell_value = 0 else: raise
说明
- UniSim中空单元格通过COM接口访问时会触发特定错误,这里通过
e.excepinfo[5]获取底层错误码-2147467259来识别该场景。 - 保留抛出其他异常的逻辑,避免忽略诸如连接中断、单元格不存在等其他问题。
内容的提问来源于stack exchange,提问作者Daniel Franceschini
相关产品推荐
相关产品推荐

