生成正确的Excel XLS格式
我写了一个小脚本,用Python生成一个可以和Excel兼容的xml文件(保存时用xls扩展名)。这个文件是从一个零件数据库生成的,这样我就可以用提取的数据下订单。
在下订单的网站上,我可以导入这个Excel文件,这样订单就会自动填好。不过问题是,每次我想下订单时,都得打开Excel,把文件保存为MS Excel 97-2003类型的xls格式,才能让导入正常工作。虽然Excel文档看起来完全一样,但用记事本打开时,我们就看不到xml内容了,只能看到一些二进制数据。
有没有办法自动化这个过程?比如运行一个bat文件,或者在我的Python脚本里加一些代码,让它直接转换成正确的格式?
(我知道这个问题以前有人问过,但一直没有得到答案)
1 个回答
这里有两种基本的方法。
你问的是第一种:自动化Excel来打开和保存文件。实际上,有两种方式可以做到这一点。第二种是使用Python工具,直接在Python中创建文件,而不需要Excel的帮助。所以:
1a:通过Excel的自动化接口来自动化Excel。
Excel设计成可以被外部应用控制,通过COM自动化。Python里面有一个很好的COM自动化接口,叫做pywin32
。不过,关于pywin32
的文档并不是很好,而且关于Excel的COM自动化接口的文档大多是为JScript、VB、.NET或C语言写的。幸运的是,这个网站上有很多关于如何使用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开发者网络已经合并到MSDN里,然后似乎变成了404页面)。Excel的顶级页面是欢迎来到Excel 2013开发者参考(如果你想要不同版本,可以点击上面的“Office客户端开发”选择其他版本),你最关心的是对象模型参考。你也可以在Excel的内置帮助中找到相同的文档(通常链接到完全相同的网页)。例如,你可以在这里找到Application
对象有一个Workbooks
属性,这个属性是一个Workbooks
对象,里面有Open
和Add
方法,这些方法返回一个Workbook
对象,这个对象有一个SaveAs
方法,接受一个可选的FileFormat
参数,类型是XlFileFormat
,这个参数的值xlExcel8
= 56
。
正如我之前提到的,你可能因为某种原因无法访问像xlExcel8
这样的枚举值,但你可以在MSDN上查找这个值(或者直接谷歌一下),然后用数字56代替。
其他文档(这里和MSDN的其他地方)通常是一些你可以自己猜的内容,或者是与win32com
无关的东西。不幸的是,已经很少的win32com
文档还期望你已经阅读过那些文档——但幸运的是,例子足够让你在几乎所有情况下都能摸索出来,除了对象模型。
1b:通过图形用户界面(GUI)自动化Excel。
在Windows上自动化GUI是个大麻烦,但有一些工具可以让这变得简单很多,比如pywinauto
。你也许可以直接使用swapy
来为你写pywinauto
脚本。
如果你不一定要用Python,像AutoIt
这样的独立脚本系统有更大的用户基础和更多的例子,可以让你的生活更轻松。
2:全部用Python来完成。
xlutils
,是python-excel的一部分,可能可以在完全不接触Excel的情况下完成你想要的操作。