用Python读写Excel文件总结

大部分Windows环境的开发人员都会选择Microsoft Excel API。实际上不仅仅是Python,几乎各种语言都有相应的方法使用它,因为核心的逻辑完全是由Microsft Excel自身提供的。语言相关的部分只是负责跟Windows的COM组件进行通信。

在Python中首先需要安装Python for Windows extensions(pywin32),具体的文档可以查阅Win32 Modules和Python COM。

当然你还必须要安装某一个版本的Microsoft Office Excel,它内部的DLL负责实际的操作。

一、最大的优点:强大无极限

因为直接与Excel进程通信,你可以做任何在Excel里可以做的事情。

二、文档丰富

MSDN上的文档绝对是世界上最优秀的文档。没有之一。

三、调试方便

你完全可以直接在Excel里面用宏先调试你想要的效果。甚至如果你不清楚怎么用程序实现某个操作,你可以通过宏录制的方法得到该操作的处理代码。

一、致命的缺点:慢到死

因为需要与Excel进程通信,其效率是非常低的。

如果让Excel窗口可见,随着程序的运行,你可以看到每一句程序所带来的变化,单元格的内容一个一个地改变。如果要写入的数据很多,那速度是无法忍受的。

二、平台限制

目前还没有发现可以在非Windows系统使用它的方法。

另外,基于它的程序能做什么事情,很大程度上依赖于当前系统所安装的Excel版本。不同的版本在功能上有很大的差异,API也会有差异。用起来会比较麻烦。

三、Excel自身bug导致的问题

我刚好发现了其中一个,这和Python没有任何关系,可以完全在Excel中手动复现。在Excel 2007中随便创建一个文件,给某个单元格添加注释,保存。换台电脑,用Excel 2013打开,就会报错,然后注释就消失了。

同样如果你的程序在一台装有Excel 2007的机器上创建一个带有注释的Excel文件,把这个文件拿到Excel 2013中打开也会报错,也看不到注释。反过来也一样。

Excel的com接口的具体细节我就不介绍了,需要的话直接查阅相关的MSDN文档即可。这里只提几个特殊的小问题。

要想得到一个可以操作的excel对象,一般可以有两种方式:

二者的区别在于,Dispatch方法会试图寻找并复用一个已有的Excel进程(比如你已经在运行着的Excel程序),而DispatchEx则一定会创建一个新的Excel进程。一般情况使用前者就可以了,还能节省一些资源的开销。但也会带来一些麻烦,有一些状态是在一个Excel进程内共享的,你在同进程的其他窗口内操作有可能会影响到Python程序所要进行的处理,导致各种错误。比如当你手动开启的Excel窗口中,某个单元格正处于编辑状态,那Python程序控制的大部分操作都有可能失败(即使它操作的是另一个文件),因为一个Excel进程中无法让两个单元格同时被编辑。

为了避免麻烦,我一般都使用DispatchEx方法。

可以让新启动的Excel进程窗口可见,就像你通过双击桌面上的图标启动一样,程序所控制的每一步操作,在这个窗口中都可以观察得到。你也可以同时进行手动的操作,但一旦这样做,很有可能使你的Python程序崩溃。

窗口不可见也会带来一些麻烦,前面说了,通过Python启动的Excel进程跟你直接从桌面打开的Excel进程没有什么区别,在使用Excel的过程中,我们经常会遇到各种弹出的错误、警告或者提示框,这些在用Python处理时也有可能遇到。尤其当你的程序还没完全调试好时。

我一般都会让程序控制的Excel进程在调试过程中可见,正式使用时不可见,,通过类似这样的命令(假设你有一个叫做is_debug的变量记录当前是否在调试状态):

打开和保存文件的细节不在这里多说了,可以查看MSDN中相关的API介绍,非常详细。这里只说一下在另存为时,如果目标文件已经存在怎么办。Excel的API另存为方法似乎并没有提供参数决定是否直接覆盖同名的目标文件,在窗口操作中,这种情况会弹出一个确认框来让用户决定。我们的程序当然不想这么做,实际上如果你按照上面所说的让窗口不可见,你也就看不到弹出的窗口。

可以把DisplayAlert属性关闭,这样Excel就不会弹出确认窗,而是直接覆盖同名文件。

进程是一种资源,我们申请了资源,在用完之后就必须要释放掉。尤其如果你隐藏了Excel窗口,用户只有查看系统进程,否则无法关闭你所开启的进程。

但是一个Excel进程是可以同时开启多个文件的,这些文件可能是你程序的其他部分开启的,也可能是用户自己开启的。这样你就不能随意地结束Excel进程,否则会影响到其他人或程序的操作。

我一般会在我的处理完成后(关闭了我自己打开或者创建的Excel文件),判断一下当前Excel进程是否还开启着其他的文档,如果没有了才会结束该进程。

Excel API中有各种各样的枚举常量,我还没有找到在Python中直接引用这些常亮的方法,目前的办法是找到所需的常数的值,自己定义这些常数。比如我用到了如下这些枚举常量:

1 2 3 4 5 6 7 8 9101112131415

要想知道某一个枚举常量的数值,可以查阅MSDN中Excel Enumerations相关的资料。

而在于当时的那份心情。可是旅行的彼时那刻我的心情一直是好的吗?

用Python读写Excel文件总结

相关文章:

你感兴趣的文章:

标签云: