xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

如何将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文件:如何批量转为xlsx文件?你真的以为很容易吗?

部分结果

可以看到,有的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文件却报错了,如下所示:

xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

报错信息1

xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

报错信息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报错,如下所示:

xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

报错信息1

xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

报错信息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文件?你真的以为很容易吗?

报错信息

所以,这种方法也无法有效地将所有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文件报错,如下所示:

xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

报错信息1

xls文件:如何批量转为xlsx文件?你真的以为很容易吗?

报错信息2

这种方法同样无法进行批量有效转换,与方法4和5和6一样。

最后总结

以上使用了7种方法来将xls文件转换为xlsx文件,最后的结果是,只有pywin32模块能够一次性批量转换,其它6种方法均无法有效进行批量转换。