如何将xls文件批量转为xlsx文件,网上有很多所谓的“方法”,也有很多人想当然的认为这是很容易的事情。现在,我就以50个xls文件为例,来验证下网上的那些方法到底效果如何!
方法1:人工批量转换
用Excel或wps表格打开每个xls文件,然后另存为xlsx格式的文件。这是种很笨的方法,不到万不得已,实在没必要用,因为太耗时。这只是50个xls文件,如果有几百个xls文件呢?也人工一个个转换吗?不现实。
方法2:使用pandas的read_csv()和to_csv()批量转换
要读取xls文件,pandas使用的是read_csv()函数,不是read_excel()函数。
但是使用pathlib模块和pandas.read_csv()函数批量读取xls时,会遇到xls文件编码encoding的问题,都是xls文件,但是其编码却很多时候不一样,有的xls是utf-8编码,有的xls是ansi编码,有的xls是gbk编码,等等。所以,无法在read_csv()函数中设置统一的编码来读取可能存在很多种编码的xls文件。
有的人会说,可以使用charde模块来识别xls文件的编码啊!
我们看下面的代码的代码及其部分结果:
import chardet
for file in Path('e:/fqb/3/').glob('*.xls'):
with open(file, 'rb') as f:
result = chardet.detect(f.read())
print(result)

部分结果
可以看到,有的xls文件,无法识别出编码方式,有的识别为ascii,有的识别出的编码还会存在confidence(置信度即概率)的问题。总之,即使使用chardet识别xls文件,也存在无法识别或者识别的置信度问题,也无法在pandas.read_csv()函数中设置可变变量的参数或使用switch-case或if-elif等多重选择来读取可能多种编码的批量xls文件。
方法3:使用pywin32模块
from win32com import client
from pathlib import Path
import pandas as pd
for file in Path('e:/fqb/3/').glob('*.xls'):
save_dir = 'e:/fqb/4/'+ file.stem + '.xlsx'
file = file.as_posix()
print(file)
excel = client.Dispatch('Excel.Application')
excel.Visible = False
excel.DisplayAlerts = False
wb = excel.Workbooks.Open(file)
wb.SaveAs(save_dir, FileFormat=51)
wb.Close()
excel.Application.Quit()
print('全部完成')
以上代码,可以将不同编码的xls文件,成功批量转为xlsx文件。
实测结果表明,这种方法是有效的。进一步说,批量转为xlsx文件后,再使用pandas.read_excel()和to_csv()函数,可以批量将xls转换后的xlsx文件,再转换为csv文件。
方法4:使用xlrd和openpyxl模块
import xlrd
from openpyxl.workbook import Workbook
from pathlib import Path
def xls2xlsx(xls_file, xlsx_file):
wb = xlrd.open_workbook(xls_file)
index = 0
nrows, ncols = 0, 0
while nrows * ncols == 0:
sheet = wb.sheet_by_index(index)
nrows = sheet.nrows
ncols = sheet.ncols
index = index + 1
wb2 = Workbook()
sheet_new = wb2.create_sheet('sheet1',0)
for row in range(0, nrows):
for col in range(0,ncols):
sheet_new.cell(row+1, col+1).value = sheet.cell_value(row,col)
wb2.save(xlsx_file)
for file in Path('e:/fqb/3/').glob('*.xls'):
print('开始处理表:',file.name)
save_file = 'e:/fqb/4/' + file.stem + '.xlsx'
xls2xlsx(file, save_file)
print('全部完成')
运行以上代码后,有的xls文件转换正常,但是有的xls文件却报错了,如下所示:

报错信息1

报错信息2
我们看到,这种方法并不能保证批量有效转换,因为该方法对有的xls是无效的。
方法5:使用pyexcel模块
首先安装以下模块
pip install pyexcel
pip install pyexcel-xls
pip install pyexcel-xlsx
pip install pyexcel-xlsxw
from pathlib import Path
import pyexcel
for file in Path('e:/fqb/3/').glob('*.xls'):
print('开始处理表:',file.name)
save_file = 'e:/fqb/4/' + file.stem + '.xlsx'
file = file.as_posix()
pyexcel.save_book_as(file_name=file, dest_file_name=save_file)
print('全部完成')
安装指定模块后,运行以上代码,有的xls文件可以正常转换,有的xls报错,如下所示:

报错信息1

报错信息2
这种方法与方法4存在同样的问题:并不能保证批量有效转换,因为该方法对有的xls是无效的。
方法6:使用xls2xlsx模块
首先安装 pip install xls2xlsx和 pip install xlrd
from pathlib import Path
import xls2xlsx
for file in Path('e:/fqb/3/').glob('*.xls'):
print('开始处理表:',file.name)
save_file = 'e:/fqb/4/' + file.stem + '.xlsx'
f = xls2xlsx.XLS2XLSX(file.as_posix())
f.to_xlsx(save_file)
print('全部完成')
运行以上代码后,不仅运行速度非常慢,而且出现以下报错:

报错信息
所以,这种方法也无法有效地将所有xls文件批量转换为xlsx文件。
方法7:使用xlrd和xlwt模块
from pathlib import Path
import xlrd
import xlwt
for file in Path('e:/fqb/3/').glob('*.xls'):
print('开始处理表:',file.name)
wb = xlrd.open_workbook(file)
wb2 = xlwt.Workbook()
for name in wb.sheet_names():
sheet = wb2.add_sheet(name)
for row in range(wb.sheet_by_name(name).nrows):
for col in range(wb.sheet_by_name(name).ncols):
sheet.write(row, col, wb.sheet_by_name(name).cell(row,col).value)
save_file = 'e:/fqb/4/' + file.stem + '.xlsx'
wb2.save(save_file)
print('全部完成')
运行以上代码后,有的xls文件可以正常转换,但有的xls文件报错,如下所示:

报错信息1

报错信息2
这种方法同样无法进行批量有效转换,与方法4和5和6一样。
最后总结
以上使用了7种方法来将xls文件转换为xlsx文件,最后的结果是,只有pywin32模块能够一次性批量转换,其它6种方法均无法有效进行批量转换。