转换XLS文件至XLSX文件

转换XLS文件至XLSX文件

记录一下最近写的脚本和工具

投身制造业一个多月,用Python+Openpyxl写了好多自动化脚本,开发的密度比我之前在房地产业要高不少。可见现实中大家对于打通最后一公里的数据处理实际需求非常大。

怕写的多了有点忘记,准备记录一下最近开发的东西,将来也好回来复用。

转换XLS至XLSX文件

我最常用的处理Excel库是openpyxl,然而这个库只能处理XLSX文件。在实际工作中,面临着XLS和XLSX混杂的情况,我也不想用新的同时支持两种文件的库再加以判断,而是看看能不能就地把所有文件都转换成XLSX格式。

基本思路

经过网上的一番查找,原来并不需要读取XLS再把其中的内容全部复制,而是调用excel的功能即可,毕竟格式转换这种功能excel程序本身已经写好了。只要想办法通过Python来调用就可以。

由于excel是windows程序,需要使用win32库来调用windows程序,然后就模拟手工操作的打开文件再另存为的方式让excel替我们完成这个工作。

安装pywin32库

核心库是pywin32库,这个库可以让Python来调用windows的API接口,从而完成很多自行编写会很麻烦的操作,功能还不限于打开excel这种。由于Windows API我很陌生,先用到多少了解多少了。

安装很简单:

pip install pywin32

这里一并汇集一下pywin32相关的资源:

  1. Github库
  2. Github示例代码
  3. 微软Windows API 索引
  4. Stackflow - pywin32讨论区

核心代码

我写的程序可以一次将一个目录底下的所有XLS文件都转换成XLSX文件,并且可以选择是否替换原文件。经常需要收集各个公司上报文件的同事,会将文件放到同一个目录下,用这个软件运行一次就可以全部转换。

而且我现在编写的程序,基本上都用pyinstaller编译成exe文件交给同事之间运行,非常简单快捷。

核心代码的逻辑很简单,通过Windows API打开excel让其加载文件,然后控制其另存为即可。只贴核心代码:

# 这个client就是与windows api交互的代理对象
import win32com.client as client
# 打开excel程序,获得程序句柄
excel = client.Dispatch("Excel.Application")
# 让excel读入文件,file_to_process是一个XLS文件的路径
target_file = excel.Workbooks.Open(file_to_process)
# 把读入的文件以51号格式保存为新文件new_file_path
# 51号格式是XLSX,56号是XLS
target_file.SaveAs(new_file_path, FileFormat=51)
# 关闭保存后的文件
target_file.Close()
# 退出excel
excel.Application.Quit()

如果一次性大量操作文件,在循环的最外层打开和关闭excel程序即可,循环内部只需要打开和关闭文件即可。

运行的时候为了保证没有问题,需要关闭所有的excel窗口。在实际运行的时候假如电脑速度慢,会看到excel窗口一闪而过,这其实就是模拟了手工操作excel来转换文件的方法。

这段小代码,也作为我很多其他程序的基础。很多同事们填表时源数据是XLS,目标文件是XLSX的情况非常常见,我就会先用这个东西转换一下源数据文件生成一个XLSX文件,再用openpyxl处理。

LICENSED UNDER CC BY-NC-SA 4.0
Comment