在订购零件的网站上,您可以导入Excel文件,以便订单自动填充。问题在于每次我想下订单时,都必须打开Excel并将文件保存为MS Excel 97-2003类型的xls扩展名,才能让导入工作正常进行。然后,Excel文档看起来完全相同,但如果用记事本打开,我们无法再看到XML,只能看到二进制转储。
有没有办法通过运行批处理文件或者在我的Python脚本中添加一些代码来自动化这个过程,使其转换为正确的格式?
(我知道这个问题之前已经被问过,但从未得到答案。)
有两种基本方法。
你问的是第一种:自动化Excel打开和保存文件。实际上有两种方法可以做到那个。第二种是使用Python工具直接在Python中创建文件,而不需要Excel的帮助。所以:
Excel被设计为可以通过COM自动化由外部应用程序控制。Python内置了一个很棒的pywin32
COM-自动化接口。不幸的是,pywin32
的文档不是很好,并且所有关于Excel的COM自动化接口的文档都是用JScript、VB、.NET或C中的原始COM编写的。幸运的是,这个网站上有很多关于如何使用win32com
驱动Excel的问题,比如这个,所以你可能可以自己解决它。它看起来会像这样:
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
spreadsheet = excel.Workbooks.Open('C:/path/to/spreadsheet.xml')
spreadsheet.SaveAs('C:/path/to/spreadsheet.xls', fileformat=excel.xlExcel8)
这并没有经过任何测试,因为我没有方便使用Excel的Windows电脑。我模糊地记得在从win32com获取文件格式名称时遇到了问题,只能查找相应的数字(快速谷歌搜索“fileformat xlExcel8”显示其数字等效值为56,并确认这是97-2003二进制xls的正确格式)。
当然,如果您不需要用Python完成此操作,MSDN中有很多JScript、VBA等优秀的示例。
您需要的文档都在MSDN上(自从Excel Office Developer Network合并到MSDN后,似乎变成了404页面)。Excel的顶级页面是欢迎使用Excel 2013开发人员参考资料(如果您想要其他版本,请点击上方导航栏中的“Office客户端开发”,然后选择不同的版本),而您最关心的是对象模型参考。您还可以在Excel内置帮助中找到相同的文档(通常链接到完全相同的网页)。例如,您可以在那里了解到Application
对象具有一个Workbooks
属性,该属性是一个Workbooks
对象,该对象具有返回Workbook
对象的Open
和Add
方法,该对象具有一个SaveAs
方法,该方法接受一个可选的FileFormat
参数,类型为XlFileFormat
,其中值xlExcel8
=56
。
正如我之前所暗示的,由于我不再记得某些原因,您可能无法访问枚举值,例如xlExcel8
,但是您可以在MSDN上查找该值(或仅使用Google)并替换为数字56。
其他文档(包括MSDN内部和其他地方)通常要么是您可以自己猜测的内容,要么是与win32com
无关的内容。不幸的是,已经稀少的win32com
文档希望您已经阅读了那些文档 - 但是幸运的是,示例足以让您摆脱几乎所有除对象模型之外的一切。
在Windows上自动化GUI非常麻烦,但有许多工具可以使它变得更加容易,例如pywinauto
。您可以尝试使用swapy
来为您编写pywinauto
脚本。
AutoIt
这样的单独脚本系统拥有更大的用户群体和更多的示例,可以让你的生活更加轻松。xlutils
可能能够在不接触Excel的情况下完成你想要的操作。
.xls
应该用于二进制(BIFF)Excel文件,而不是XML格式,因此如果您将扩展名更改为.xml
或.xslx
(并/或更改内容类型,具体取决于您如何使用该文件来下订单),则可以直接使用您的XML格式文件。 - abarnert