如何將xls文件批量轉(zhuǎn)為xlsx文件,網(wǎng)上有很多所謂的“方法”,也有很多人想當(dāng)然的認(rèn)為這是很容易的事情?,F(xiàn)在,我就以50個(gè)xls文件為例,來(lái)驗(yàn)證下網(wǎng)上的那些方法到底效果如何!
用Excel或wps表格打開(kāi)每個(gè)xls文件,然后另存為xlsx格式的文件。這是種很笨的方法,不到萬(wàn)不得已,實(shí)在沒(méi)必要用,因?yàn)樘臅r(shí)。這只是50個(gè)xls文件,如果有幾百個(gè)xls文件呢?也人工一個(gè)個(gè)轉(zhuǎn)換嗎?不現(xiàn)實(shí)。
要讀取xls文件,pandas使用的是read_csv()函數(shù),不是read_excel()函數(shù)。
但是使用pathlib模塊和pandas.read_csv()函數(shù)批量讀取xls時(shí),會(huì)遇到xls文件編碼encoding的問(wèn)題,都是xls文件,但是其編碼卻很多時(shí)候不一樣,有的xls是utf-8編碼,有的xls是ansi編碼,有的xls是gbk編碼,等等。所以,無(wú)法在read_csv()函數(shù)中設(shè)置統(tǒng)一的編碼來(lái)讀取可能存在很多種編碼的xls文件。
有的人會(huì)說(shuō),可以使用charde模塊來(lái)識(shí)別xls文件的編碼??!
我們看下面的代碼的代碼及其部分結(jié)果:
import chardet
for file in Path('e:/fqb/3/').glob('*.xls'):
with open(file, 'rb') as f:
result=chardet.detect(f.read())
print(result)
部分結(jié)果
可以看到,有的xls文件,無(wú)法識(shí)別出編碼方式,有的識(shí)別為ascii,有的識(shí)別出的編碼還會(huì)存在confidence(置信度即概率)的問(wèn)題??傊?,即使使用chardet識(shí)別xls文件,也存在無(wú)法識(shí)別或者識(shí)別的置信度問(wèn)題,也無(wú)法在pandas.read_csv()函數(shù)中設(shè)置可變變量的參數(shù)或使用switch-case或if-elif等多重選擇來(lái)讀取可能多種編碼的批量xls文件。
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文件,成功批量轉(zhuǎn)為xlsx文件。
實(shí)測(cè)結(jié)果表明,這種方法是有效的。進(jìn)一步說(shuō),批量轉(zhuǎn)為xlsx文件后,再使用pandas.read_excel()和to_csv()函數(shù),可以批量將xls轉(zhuǎn)換后的xlsx文件,再轉(zhuǎn)換為csv文件。
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('開(kāi)始處理表:',file.name)
save_file='e:/fqb/4/' + file.stem + '.xlsx'
xls2xlsx(file, save_file)
print('全部完成')
運(yùn)行以上代碼后,有的xls文件轉(zhuǎn)換正常,但是有的xls文件卻報(bào)錯(cuò)了,如下所示:
報(bào)錯(cuò)信息1
報(bào)錯(cuò)信息2
我們看到,這種方法并不能保證批量有效轉(zhuǎn)換,因?yàn)樵摲椒▽?duì)有的xls是無(wú)效的。
首先安裝以下模塊
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('開(kāi)始處理表:',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('全部完成')
安裝指定模塊后,運(yùn)行以上代碼,有的xls文件可以正常轉(zhuǎn)換,有的xls報(bào)錯(cuò),如下所示:
報(bào)錯(cuò)信息1
報(bào)錯(cuò)信息2
這種方法與方法4存在同樣的問(wèn)題:并不能保證批量有效轉(zhuǎn)換,因?yàn)樵摲椒▽?duì)有的xls是無(wú)效的。
首先安裝 pip install xls2xlsx和 pip install xlrd
from pathlib import Path
import xls2xlsx
for file in Path('e:/fqb/3/').glob('*.xls'):
print('開(kāi)始處理表:',file.name)
save_file='e:/fqb/4/' + file.stem + '.xlsx'
f=xls2xlsx.XLS2XLSX(file.as_posix())
f.to_xlsx(save_file)
print('全部完成')
運(yùn)行以上代碼后,不僅運(yùn)行速度非常慢,而且出現(xiàn)以下報(bào)錯(cuò):
報(bào)錯(cuò)信息
所以,這種方法也無(wú)法有效地將所有xls文件批量轉(zhuǎn)換為xlsx文件。
from pathlib import Path
import xlrd
import xlwt
for file in Path('e:/fqb/3/').glob('*.xls'):
print('開(kāi)始處理表:',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('全部完成')
運(yùn)行以上代碼后,有的xls文件可以正常轉(zhuǎn)換,但有的xls文件報(bào)錯(cuò),如下所示:
報(bào)錯(cuò)信息1
報(bào)錯(cuò)信息2
這種方法同樣無(wú)法進(jìn)行批量有效轉(zhuǎn)換,與方法4和5和6一樣。
以上使用了7種方法來(lái)將xls文件轉(zhuǎn)換為xlsx文件,最后的結(jié)果是,只有pywin32模塊能夠一次性批量轉(zhuǎn)換,其它6種方法均無(wú)法有效進(jìn)行批量轉(zhuǎn)換。
在工作中,人事、財(cái)務(wù)和庫(kù)管經(jīng)常需要管理很多表格檔案。如果不去整理的話,急需使用時(shí)會(huì)大半天找不到文件。其實(shí)只需幾個(gè)步驟,就可以用Excel制作出屬于自己的文件檔案管理系統(tǒng)。主要的思路是新建一個(gè)單獨(dú)的excel表格來(lái)管理這些文件,然后批量創(chuàng)建超鏈接,點(diǎn)擊超鏈接即可打開(kāi)相應(yīng)的文件,主要效果如下圖:
快速添加分類名稱
下面是一份文件清單,其中包括了Excel文件,PPT文件和PDF文件。我們現(xiàn)在需要給每一份文件添加分類名稱:Excel/PPT/電子書。
1.添加標(biāo)題行,打開(kāi)篩選器
在第一行之前插入新的一行作為標(biāo)題行,分別起名為“文件名”和“備注”。單擊右鍵打開(kāi)篩選器。
2.篩選出所有的excel文件,輸入分類名稱
按照不同的文件類型,在篩選彈窗中輸入字符進(jìn)行篩選。例如excel文件的名稱包括“.xlsx”和“.xls”字符,分別輸入對(duì)應(yīng)的字符搜索即可。篩選完成后全選備注列,輸入分類名稱,下面以excel作為示范,按住”ctrl+enter”,填充所有選中的單元格
3.重復(fù)步驟2,分別對(duì)ppt文件和pdf文件進(jìn)行篩選
按照類別查看文件列表
有時(shí)需要按照文件的類別分類查看文件,這時(shí)備注列就有大作用啦。點(diǎn)擊備注下方的三角形,彈出篩選彈窗。這里可以查看我們前面設(shè)置好的分類名稱,勾選需要查看的文件類型,點(diǎn)擊確定即可。如果需要查看全部文件,選中“全選”即可。
批量創(chuàng)建超鏈接
在C列創(chuàng)建超鏈接,有了超鏈接,點(diǎn)擊即可查看對(duì)應(yīng)的圖片、excel文件或者其他文件。主要用到的函數(shù)是HYPERLINK函數(shù)。
1.在C2單元格中輸入公式
我們分析一下C2的公式,就是兩個(gè)參數(shù):
=HYPERLINK("文件所處的文件夾路徑/"&A2,"點(diǎn)擊打開(kāi)")
那么我們?nèi)绾潍@得自己文件所處的路徑呢?
找到自己文件所處的文件夾,單擊右鍵,在彈窗中選擇“屬性”,在屬性彈窗中,復(fù)制“位置”后面的字符。
將復(fù)制到的路徑,粘貼到excel的一個(gè)單元格中,并且在路徑最后加上“/”,作為備用。我得到的路徑如下圖,紅框中“/”一定要加上:
2.&A2的含義
&的作用是連接字符,因?yàn)槲覀兘?jīng)過(guò)第一步已經(jīng)得到了文件所處文件夾的路徑,但是超鏈接必須要精確到哪個(gè)文件,所以最后要連接上文件名。A列有對(duì)應(yīng)的文件名稱,所以直接連接對(duì)應(yīng)單元格的值就行。
3.“點(diǎn)擊打開(kāi)”的含義
超鏈接會(huì)顯示成“點(diǎn)擊打開(kāi)”這四個(gè)字,這是自定義的,如果你設(shè)置成“超鏈接”,在表格中,就會(huì)顯示成“超鏈接”,如下圖:
4.按住自動(dòng)填充手柄,往下拉動(dòng),就可以自動(dòng)創(chuàng)建超鏈接
注意點(diǎn):
1.所有的文件都必須要在同一個(gè)文件夾中,不然就不能用自動(dòng)填充功能;
2.如果點(diǎn)擊超鏈接之后,彈出安全提示彈窗,請(qǐng)點(diǎn)擊確認(rèn)授權(quán),因?yàn)椴煌浖M(jìn)行了鏈接,所以會(huì)出現(xiàn)這個(gè)彈窗。
操作是不是非常簡(jiǎn)單,但是效果非常震撼?
當(dāng)然,如果你需要按照前面的步驟在Excel表格中管理文檔,首先需要一份文件清單。公司里有成百上千的文件,難道需要一個(gè)個(gè)輸入嗎?這樣的效率超低而且非常容易出錯(cuò),如果名字錯(cuò)誤,那鏈接就會(huì)失效。
最后,告訴大家一個(gè)快速提取文件名到excel的方法,不管有多少文件,一鍵獲得所有文件名。
4
批量獲得文件名清單
在桌面新建一個(gè)文本文檔,寫入“DIR *.* /B >文件名列表.CSV”代碼。如下所示:
點(diǎn)擊“文件”-另存為“獲得文件名.bat”文件。
把這個(gè)文件移動(dòng)到需要獲取文件名的文件所在文件夾中,雙擊運(yùn)行,就會(huì)生成一個(gè)名為“文件名列表.CSV”的文件,打開(kāi)該文件,把“文件名列表.CSV”和“獲得文件名.bat”刪掉,就是文件夾所有的文件名清單。
注意點(diǎn):
1.必須把“獲得文件名.bat”文件放到需要獲取文件名的文件所在文件夾中;
2.如果想獲得文件夾A中所有文件名,但是文件夾A中又有文件夾B,必須將“獲得文件名.bat”再?gòu)?fù)制到文件夾B下,雙擊運(yùn)行,這樣才可以獲得所有文件名。
3.這個(gè)只適合windows系統(tǒng)
5
小結(jié)
非常簡(jiǎn)單實(shí)用的一個(gè)文件管理系統(tǒng),幾乎每個(gè)人在工作中都需要用到。這個(gè)系統(tǒng)實(shí)現(xiàn)了批量獲得文件名、分類查看文件以及創(chuàng)建超鏈接的功能。同時(shí)可以根據(jù)自己公司的需求,添加新的功能,完善這個(gè)文件管理系統(tǒng)