生成正确的Excel xls格式

3
我用Python写了一个小脚本,生成了一个兼容Excel的XML文件(保存为xls扩展名)。该文件是从部件数据库中生成的,因此我可以使用提取的数据下订单。
在订购零件的网站上,您可以导入Excel文件,以便订单自动填充。问题在于每次我想下订单时,都必须打开Excel并将文件保存为MS Excel 97-2003类型的xls扩展名,才能让导入工作正常进行。然后,Excel文档看起来完全相同,但如果用记事本打开,我们无法再看到XML,只能看到二进制转储。
有没有办法通过运行批处理文件或者在我的Python脚本中添加一些代码来自动化这个过程,使其转换为正确的格式?
(我知道这个问题之前已经被问过,但从未得到答案。)

1
http://www.python-excel.org/ - Gareth Latty
1
该网站是否接受 CSV 文件? - Eric
@Eric 不,如果有那个的话会更容易些。 - Speccy
值得注意的是,.xls应该用于二进制(BIFF)Excel文件,而不是XML格式,因此如果您将扩展名更改为.xml.xslx(并/或更改内容类型,具体取决于您如何使用该文件来下订单),则可以直接使用您的XML格式文件。 - abarnert
1
此外,如果你能提供之前类似问题的链接(最好是那些有答案但对你不起作用的),并解释为什么它们对你不起作用,那么说“我知道这个问题以前已经被问过,但从未得到答案”会更有帮助。 - abarnert
1个回答

5

有两种基本方法。

你问的是第一种:自动化Excel打开和保存文件。实际上有两种方法可以做到那个。第二种是使用Python工具直接在Python中创建文件,而不需要Excel的帮助。所以:

1a:通过其自动化接口自动化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对象的OpenAdd方法,该对象具有一个SaveAs方法,该方法接受一个可选的FileFormat参数,类型为XlFileFormat,其中值xlExcel8=56

正如我之前所暗示的,由于我不再记得某些原因,您可能无法访问枚举值,例如xlExcel8,但是您可以在MSDN上查找该值(或仅使用Google)并替换为数字56。

其他文档(包括MSDN内部和其他地方)通常要么是您可以自己猜测的内容,要么是与win32com无关的内容。不幸的是,已经稀少的win32com文档希望您已经阅读了那些文档 - 但是幸运的是,示例足以让您摆脱几乎所有除对象模型之外的一切。

1b:通过其GUI自动化Excel。

在Windows上自动化GUI非常麻烦,但有许多工具可以使它变得更加容易,例如pywinauto。您可以尝试使用swapy来为您编写pywinauto脚本。

如果你不一定需要使用Python,像AutoIt这样的单独脚本系统拥有更大的用户群体和更多的示例,可以让你的生活更加轻松。
2:全部使用Python完成。 python-excel中的xlutils可能能够在不接触Excel的情况下完成你想要的操作。

我开始使用COM,但是我很难找到关于Excel应用程序COM方法和常量文档的来源。你知道我应该在哪里看吗? - Speccy
@Speccy:我会在回答中添加一些信息。 - abarnert
谢谢。我一直在苦苦挣扎这行代码:fileformat=excel.xlExcel8,首先,应该将fileformat改为FileFormat以消除属性错误。其次,excel.xlExcel8未被识别。 - Speccy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接