鱼C论坛

 找回密码
 立即注册
查看: 699|回复: 9

[已解决]pywintypes.com_error

[复制链接]
发表于 2024-1-10 16:06:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
报错提示:
xl.Quit()
  File "<COMObject Excel.Application>", line 2, in Quit
pywintypes.com_error: (-2147418111, '被呼叫方拒绝接收呼叫。', None, None)

代码:
  1. path_cb = path1 + '/' + file_small
  2.             xl = win32com.client.Dispatch("Excel.Application")
  3.             wb = xl.workbooks.open(path_cb)
  4.             xl.Visible = False
  5.             wb.Save()
  6.             xl.Quit()
复制代码
最佳答案
2024-1-10 17:01:39
negin12 发表于 2024-01-10 17:01
Excel都是设置的自动重算,但是依然出现#NAME?的报错


如果在使用`openpyxl`加载Excel文件时仍然出现了`#NAME?`的错误,那么可能是因为`openpyxl`无法解析某些特殊的公式或函数。`openpyxl`并不完全支持Excel中的所有功能。

为了解决这个问题,您可以尝试使用`pywin32`来获取单元格的值,而不是依赖于`openpyxl`的`data_only`参数。以下是一个示例代码:

  1. import win32com.client as win32

  2. path_cb = path1 + '/' + file_small

  3. xl = win32.gencache.EnsureDispatch("Excel.Application")
  4. wb = xl.Workbooks.Open(path_cb)
  5. xl.Visible = False
  6. xl.DisplayAlerts = False

  7. try:
  8.     ws = wb.ActiveSheet
  9.     # 处理数据...

  10. except Exception as e:
  11.     print(f"Error: {str(e)}")

  12. finally:
  13.     wb.Close(SaveChanges=False)
  14.     xl.Quit()
复制代码


这段代码使用`win32com.client`来获取Excel应用程序对象,并打开指定的Excel文件。然后,您可以通过`ActiveSheet`属性获取活动工作表对象,并进行数据处理。

最后,确保在`wb.Close()`和`xl.Quit()`之前将`xl.DisplayAlerts`设置为`False`,以避免弹出确认对话框。如果需要保存更改,请将`SaveChanges`参数设置为`True`。

希望这可以解决您的问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-10 16:06:31 | 显示全部楼层
这个错误通常是由于Excel应用程序未正确地关闭引起的。在使用pywin32进行Excel操作时,有一些注意事项可以帮助您避免这个错误。

首先,确保在你的代码最后调用`xl.Quit()`来关闭Excel应用程序。这一行代码会发送一个"关闭"命令给Excel应用程序,告诉它退出。然后,通过`wb.Close()`关闭工作簿。最后,确保释放对Excel应用程序的引用,即在代码的最后添加`del xl`。

修改后的代码如下所示:

  1. path_cb = path1 + '/' + file_small
  2. xl = win32com.client.Dispatch("Excel.Application")
  3. wb = xl.workbooks.open(path_cb)
  4. xl.Visible = False
  5. wb.Save()
  6. wb.Close()
  7. xl.Quit()
  8. del xl
复制代码


另外,请注意检查您的代码中是否有其他与Excel相关的操作,例如打开了多个工作簿或者未正确释放对工作簿的引用。这些情况也可能导致该错误出现。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 16:09:44 | 显示全部楼层
FishC 发表于 2024-1-10 16:06
这个错误通常是由于Excel应用程序未正确地关闭引起的。在使用pywin32进行Excel操作时,有一些注意事项可以 ...

加上了wb.Close()之后,报错:File "<COMObject <unknown>>", line 2, in Close
pywintypes.com_error: (-2146777998, 'OLE error 0x800ac472', None, None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-10 16:09:55 | 显示全部楼层
negin12 发表于 2024-01-10 16:09
加上了wb.Close()之后,报错:File "", line 2, in Cl ...


这个错误是由于在关闭工作簿时出现了问题。在pywin32中,如果工作簿中有未保存的更改,调用`wb.Close()`时可能会出现此错误。为了解决这个问题,您可以在关闭工作簿之前先保存它。修改后的代码如下所示:

  1. path_cb = path1 + '/' + file_small
  2. xl = win32com.client.Dispatch("Excel.Application")
  3. wb = xl.workbooks.open(path_cb)
  4. xl.Visible = False
  5. wb.Save()  # 保存工作簿
  6. wb.Close() # 先保存工作簿,再关闭
  7. xl.Quit()
  8. del xl
复制代码


通过首先保存工作簿,然后再关闭它,应该可以避免这个错误的发生。希望这次能成功关闭Excel应用程序和工作簿!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 16:10:28 | 显示全部楼层
FishC 发表于 2024-1-10 16:09
这个错误是由于在关闭工作簿时出现了问题。在pywin32中,如果工作簿中有未保存的更改,调用`wb.Close() ...

已经先保存了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-10 16:10:39 | 显示全部楼层


非常抱歉,让我来尝试解决这个问题。出现 `pywintypes.com_error: (-2146777998, 'OLE error 0x800ac472', None, None)` 错误通常是由于 Excel 进程未正确释放引起的。在使用 pywin32 操作 Excel 时,需要确保及时关闭 Excel 应用程序,并释放对应的进程资源。请尝试以下代码:

  1. import win32com.client

  2. path_cb = path1 + '/' + file_small
  3. xl = win32com.client.Dispatch("Excel.Application")
  4. wb = xl.workbooks.open(path_cb)
  5. xl.Visible = False
  6. wb.Save()
  7. wb.Close()

  8. # 释放对 Excel 应用程序的引用
  9. xl.Quit()
  10. del xl
复制代码


如果这样仍然无法解决问题,可以尝试使用 `win32com.client.gencache.EnsureDispatch` 来代替 `win32com.client.Dispatch`,这样可以确保 PyWin32 使用缓存的类型信息,从而减少错误的发生。

  1. import win32com.client.gencache

  2. path_cb = path1 + '/' + file_small
  3. xl = win32com.client.gencache.EnsureDispatch("Excel.Application")
  4. wb = xl.workbooks.open(path_cb)
  5. xl.Visible = False
  6. wb.Save()
  7. wb.Close()

  8. # 释放对 Excel 应用程序的引用
  9. xl.Quit()
  10. del xl
复制代码


如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 16:40:44 | 显示全部楼层
FishC 发表于 2024-1-10 16:10
非常抱歉,让我来尝试解决这个问题。出现 `pywintypes.com_error: (-2146777998, 'OLE error 0x800ac47 ...

但是这样保存之后,用openpyxl打开的表格,部分单元格内容显示#NAME?,用的是openpyxl.load_workbook(path_cb, data_only=True)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-10 16:40:59 | 显示全部楼层
negin12 发表于 2024-01-10 16:40
但是这样保存之后,用openpyxl打开的表格,部分单元格 ...


这个问题常见于使用 openpyxl 读取包含公式的单元格时。打开文件时使用 `data_only=True` 参数可以解决这个问题,它会将单元格的计算结果作为值返回,而不是公式本身。请尝试以下代码:import win32com.clientimport openpyxlpath_cb = path1 + '/' + file_small# 使用 pywin32 打开 Excel 应用程序xl = win32com.client.Dispatch("Excel.Application")wb = xl.Workbooks.Open(path_cb)# 关闭 Excel 应用程序xl.Visible = Falsewb.Save()wb.Close()xl.Quit()del xl# 使用 openpyxl 读取保存后的文件wb = openpyxl.load_workbook(path_cb, data_only=True)sheet = wb.active# 处理数据...如果仍然遇到问题,请确保原始 Excel 文件中的计算选项已设置为自动重新计算。您可以在 Excel 菜单栏中的“文件”->“选项”->“公式”中找到该选项。同时检查一下公式是否正确,确保它们可以正确地计算出预期的结果。希望这可以解决您的问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 17:01:22 | 显示全部楼层
FishC 发表于 2024-1-10 16:40
这个问题常见于使用 openpyxl 读取包含公式的单元格时。打开文件时使用 `data_only=True` 参数可以解决 ...

Excel都是设置的自动重算,但是依然出现#NAME?的报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-10 17:01:39 | 显示全部楼层    本楼为最佳答案   
negin12 发表于 2024-01-10 17:01
Excel都是设置的自动重算,但是依然出现#NAME?的报错


如果在使用`openpyxl`加载Excel文件时仍然出现了`#NAME?`的错误,那么可能是因为`openpyxl`无法解析某些特殊的公式或函数。`openpyxl`并不完全支持Excel中的所有功能。

为了解决这个问题,您可以尝试使用`pywin32`来获取单元格的值,而不是依赖于`openpyxl`的`data_only`参数。以下是一个示例代码:

  1. import win32com.client as win32

  2. path_cb = path1 + '/' + file_small

  3. xl = win32.gencache.EnsureDispatch("Excel.Application")
  4. wb = xl.Workbooks.Open(path_cb)
  5. xl.Visible = False
  6. xl.DisplayAlerts = False

  7. try:
  8.     ws = wb.ActiveSheet
  9.     # 处理数据...

  10. except Exception as e:
  11.     print(f"Error: {str(e)}")

  12. finally:
  13.     wb.Close(SaveChanges=False)
  14.     xl.Quit()
复制代码


这段代码使用`win32com.client`来获取Excel应用程序对象,并打开指定的Excel文件。然后,您可以通过`ActiveSheet`属性获取活动工作表对象,并进行数据处理。

最后,确保在`wb.Close()`和`xl.Quit()`之前将`xl.DisplayAlerts`设置为`False`,以避免弹出确认对话框。如果需要保存更改,请将`SaveChanges`参数设置为`True`。

希望这可以解决您的问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表