使用Win32com在Python中处理Excel消息框
我正在处理一些本来应该是xls格式的文件,但实际上它们是其他格式的文件(根据我在python-excel论坛上得到的帮助,这些文件是网页归档文件,或者叫单文件网页(*.mht, *.mhtml))。我可以用Excel打开这些文件,但会弹出一个提示框,我必须先关闭这个提示才能继续。提示内容是:你尝试打开的文件filename.xls的格式与文件扩展名不符。在打开文件之前,请确认文件没有损坏,并且来自可信的来源。你想要打开这个文件吗?
如果我选择“是”,文件就会打开,看起来像一个Excel工作簿。不过,有些工作表的名字被截断了。果然,当我选择“另存为”时,默认的格式是单文件网页。
现在,如果我选择“另存为”,然后选择Excel 97-2003格式,给文件重新命名并点击保存按钮,文件就会以Excel格式打开,而且之后不会再出现任何提示。
我一直在琢磨怎么写一些代码,把这些文件真正保存为xls格式,这样我就不需要让海外的人来打开和保存它们。
我已经快成功了,但在最后一个问题上卡住了。当我用新的文件格式保存时,会弹出一个警告框,提醒我会有一些小的质量损失。我不知道怎么去掉这个警告,接受这个质量损失。
这是我拼凑起来的代码,似乎能工作:
import win32com.client
xl=win32com.client.Dispatch('Excel.Application')
xl.visible=0 # I have noticed that if I don't set visible to 0 I can't get any response
srce=xl.Workbooks.Open(r'c:\testdd.xls') # testdd is my file that is evidently really not an excel file
srce.SaveAs(r'c:\newtttxt2.xls',FileFormat=1) # this is when the message box pops up
我发现有一个叫CheckCompatibility的属性。它似乎是工作簿对象的一个属性。我想我不能在下面的形式中使用它:
srce.CheckCompatibility='False'
这是因为我没有保存原始对象,而是保存了某种类型的副本?
回到我的问题上。
我之前尝试设置srce.CheckCompatibility='False'时没有成功,真是让人失望。
抱歉让你感到困惑。
现在我更加困惑了,这种行为真奇怪。
srce=xl.Workbooks.Open(r'c:\testdd.xls') # I open the file
srce.CheckCompatibility='False' # I try to assign the attribute to srce
srce.SaveAs(r'c:\newtttxt7865.xls',FileFormat=1) #when I SaveAs the compatibility dialog asks if I want to continue
>>> 'asked' # I put this here to reinforce the fact that I was asked
'asked'
>>> srce.CheckCompatibility='False' # again I try to assign the attribute
>>> srce.SaveAs(r'c:\newtttxt78653.xls',FileFormat=1) # I try to save it again
>>> 'did not ask' #it saves this time w/o asking
'did not ask'
>>>
我在想,如果我添加一个make.py文件,按照com帮助中的描述,这个问题会解决吗?我开始怀疑问题是否在于srce还不知道它有哪些属性,它接受了这个赋值,但在某些事件发生之前并没有真正生效?如果我说得很傻,那也没关系。
1 个回答
请查看我对你关于这个问题的另一个提问的回答。
第二次调用SaveAs(...)
时没有弹出对话框的原因是,文件格式在第二次调用时没有改变,文件格式只在第一次调用时发生变化。
你需要在调用SaveAs()
之前添加
>>> xl.DisplayAlerts = False
。