先上python批量转换xls文件转xlsx文件的源代码:
import os
import win32com.client as win32
def change_xls_to_xlsx():
p_program_running_path = os.getcwd()
rootdir = p_program_running_path # 需要转换的xls文件存放处
rootdir1 = p_program_running_path # 转换好的xlsx文件存放处
files = os.listdir(rootdir) # 列出文件夹下的所有文件
num = len(files) # 列出所有文件的个数
for i in range(num): # 按文件个数执行次数
kname = os.path.splitext(files[i])[1] # 分离文件名与扩展名,返回(f_name, f_extension)元组
if kname == '.xls': # 判定扩展名是否为xls,屏蔽其它文件
fname = rootdir + '\\' + files[i] # 合成需要转换的路径与文件名
fname1 = rootdir1 + '\\' + files[i] # 合成准备存放转换好的路径与文件名
excel = win32.gencache.EnsureDispatch('Excel.Application') # 调用win32模块
wb = excel.Workbooks.Open(fname) # 打开需要转换的文件
wb.SaveAs(fname1 + "x", FileFormat=51) # 文件另存为xlsx扩展名的文件
wb.Close()
excel.Application.Quit()
print('批量格式转换完成。')
return None
代码本身没问题,但是运行起来的时候奇葩的事情就出现了。上面这段代码,在家里的X260、Matebook X Pro上运行毫无问题,但是在办公室的T460p上运行起来的时候,总是提示 ***“被调用的对象已与其客户端断开连接”***。。。。TMD,就是不知道问题出在哪里。
好在CSDN这里的大牛就是多,看到一位朋友在批量转换docx文件时也出现了***“被调用的对象已与其客户端断开连接”*** 的问题,原贴地址:https://blog.csdn.net/weixin_45903952/article/details/106148407。他的解决方案是删除掉了****“.Quit()”**** 语句程序即可正常运行。
回过头来,看看自己的源代码,也有一句***“excel.Application.Quit()”***,屏蔽这句代码之后,程序立刻正常运行。
wb.SaveAs(fname1 + "x", FileFormat=51) # 文件另存为xlsx扩展名的文件
wb.Close()
# excel.Application.Quit()
有没有哪位大神能帮忙解释一下是什么原因呢?
写在最后,如果真的要进行xls to xlsx,甚至是批量的这样操作,还是强烈建议使用xlwings库,这个库在实现这个功能方面实在是太方便了,直接用save()函数,一行代码就能搞定了。例如:
import xlwings
xlwings_app = xlwings.App(visible=False, add_book=False)
work_book = xlwings_app.books.open(‘test.xls’)
work_book.save(‘test.xlsx’)
work_book.close()
xlwings_APP.quit()
就这么简单!