如何將xls文件批量轉為xlsx文件,網上有很多所謂的“方法”,也有很多人想當然的認為這是很容易的事情。現在,我就以50個xls文件為例,來驗證下網上的那些方法到底效果如何!
用Excel或wps表格打開每個xls文件,然后另存為xlsx格式的文件。這是種很笨的方法,不到萬不得已,實在沒必要用,因為太耗時。這只是50個xls文件,如果有幾百個xls文件呢?也人工一個個轉換嗎?不現實。
要讀取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文件。
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文件。
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是無效的。
首先安裝以下模塊
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是無效的。
首先安裝 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文件。
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種方法均無法有效進行批量轉換。
在工作中,人事、財務和庫管經常需要管理很多表格檔案。如果不去整理的話,急需使用時會大半天找不到文件。其實只需幾個步驟,就可以用Excel制作出屬于自己的文件檔案管理系統。主要的思路是新建一個單獨的excel表格來管理這些文件,然后批量創建超鏈接,點擊超鏈接即可打開相應的文件,主要效果如下圖:
快速添加分類名稱
下面是一份文件清單,其中包括了Excel文件,PPT文件和PDF文件。我們現在需要給每一份文件添加分類名稱:Excel/PPT/電子書。
1.添加標題行,打開篩選器
在第一行之前插入新的一行作為標題行,分別起名為“文件名”和“備注”。單擊右鍵打開篩選器。
2.篩選出所有的excel文件,輸入分類名稱
按照不同的文件類型,在篩選彈窗中輸入字符進行篩選。例如excel文件的名稱包括“.xlsx”和“.xls”字符,分別輸入對應的字符搜索即可。篩選完成后全選備注列,輸入分類名稱,下面以excel作為示范,按住”ctrl+enter”,填充所有選中的單元格
3.重復步驟2,分別對ppt文件和pdf文件進行篩選
按照類別查看文件列表
有時需要按照文件的類別分類查看文件,這時備注列就有大作用啦。點擊備注下方的三角形,彈出篩選彈窗。這里可以查看我們前面設置好的分類名稱,勾選需要查看的文件類型,點擊確定即可。如果需要查看全部文件,選中“全選”即可。
批量創建超鏈接
在C列創建超鏈接,有了超鏈接,點擊即可查看對應的圖片、excel文件或者其他文件。主要用到的函數是HYPERLINK函數。
1.在C2單元格中輸入公式
我們分析一下C2的公式,就是兩個參數:
=HYPERLINK("文件所處的文件夾路徑/"&A2,"點擊打開")
那么我們如何獲得自己文件所處的路徑呢?
找到自己文件所處的文件夾,單擊右鍵,在彈窗中選擇“屬性”,在屬性彈窗中,復制“位置”后面的字符。
將復制到的路徑,粘貼到excel的一個單元格中,并且在路徑最后加上“/”,作為備用。我得到的路徑如下圖,紅框中“/”一定要加上:
2.&A2的含義
&的作用是連接字符,因為我們經過第一步已經得到了文件所處文件夾的路徑,但是超鏈接必須要精確到哪個文件,所以最后要連接上文件名。A列有對應的文件名稱,所以直接連接對應單元格的值就行。
3.“點擊打開”的含義
超鏈接會顯示成“點擊打開”這四個字,這是自定義的,如果你設置成“超鏈接”,在表格中,就會顯示成“超鏈接”,如下圖:
4.按住自動填充手柄,往下拉動,就可以自動創建超鏈接
注意點:
1.所有的文件都必須要在同一個文件夾中,不然就不能用自動填充功能;
2.如果點擊超鏈接之后,彈出安全提示彈窗,請點擊確認授權,因為不同軟件進行了鏈接,所以會出現這個彈窗。
操作是不是非常簡單,但是效果非常震撼?
當然,如果你需要按照前面的步驟在Excel表格中管理文檔,首先需要一份文件清單。公司里有成百上千的文件,難道需要一個個輸入嗎?這樣的效率超低而且非常容易出錯,如果名字錯誤,那鏈接就會失效。
最后,告訴大家一個快速提取文件名到excel的方法,不管有多少文件,一鍵獲得所有文件名。
4
批量獲得文件名清單
在桌面新建一個文本文檔,寫入“DIR *.* /B >文件名列表.CSV”代碼。如下所示:
點擊“文件”-另存為“獲得文件名.bat”文件。
把這個文件移動到需要獲取文件名的文件所在文件夾中,雙擊運行,就會生成一個名為“文件名列表.CSV”的文件,打開該文件,把“文件名列表.CSV”和“獲得文件名.bat”刪掉,就是文件夾所有的文件名清單。
注意點:
1.必須把“獲得文件名.bat”文件放到需要獲取文件名的文件所在文件夾中;
2.如果想獲得文件夾A中所有文件名,但是文件夾A中又有文件夾B,必須將“獲得文件名.bat”再復制到文件夾B下,雙擊運行,這樣才可以獲得所有文件名。
3.這個只適合windows系統
5
小結
非常簡單實用的一個文件管理系統,幾乎每個人在工作中都需要用到。這個系統實現了批量獲得文件名、分類查看文件以及創建超鏈接的功能。同時可以根據自己公司的需求,添加新的功能,完善這個文件管理系統