使用Python進(jìn)行Excel文件xls/xlsx/xsv格式互相轉(zhuǎn)換
1. Excel文件處理 - 將xls文件轉(zhuǎn)換為xlsx
準(zhǔn)備環(huán)境
Python版本需要為3.8-3.14(pywin32的要求)
通過(guò)pip下載pywin32:
pip install pywin32
復(fù)制即可運(yùn)行的完整代碼
import os
from win32com import client as wc
def convert_xls_to_xlsx(xls_path: str) -> str:
"""
將單個(gè)xls文件轉(zhuǎn)換為xlsx格式,并返回轉(zhuǎn)換后的文件路徑
Args:
xls_path (str): xls文件路徑
Returns:
str: 轉(zhuǎn)換后的xlsx文件路徑
Raises:
FileNotFoundError: 如果文件不存在
ValueError: 如果文件不是xls格式或路徑無(wú)效
Exception: 轉(zhuǎn)換過(guò)程中的其他錯(cuò)誤
"""
# 參數(shù)驗(yàn)證
if not xls_path or not isinstance(xls_path, str):
raise ValueError("文件路徑不能為空且必須是字符串")
# 檢查文件是否存在
if not os.path.exists(xls_path):
raise FileNotFoundError(f"文件不存在: {xls_path}")
# 檢查文件擴(kuò)展名
if not xls_path.lower().endswith('.xls'):
raise ValueError(f"文件不是xls格式: {xls_path}")
# 檢查文件是否被占用(臨時(shí)文件)
if os.path.basename(xls_path).startswith('~'):
raise ValueError(f"文件可能是臨時(shí)文件: {xls_path}")
# 檢查文件大小(避免處理空文件或損壞文件)
file_size = os.path.getsize(xls_path)
if file_size == 0:
raise ValueError(f"文件為空: {xls_path}")
excel = None
workbook = None
try:
# 創(chuàng)建Excel應(yīng)用實(shí)例
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False # 不顯示警告對(duì)話框
# 打開(kāi)工作簿
workbook = excel.Workbooks.Open(xls_path)
# 生成新的xlsx文件路徑
base_path = os.path.splitext(xls_path)[0]
new_path = base_path + ".xlsx"
# 處理文件名沖突
count = 0
while os.path.exists(new_path):
count += 1
new_path = f"{base_path}({count}).xlsx"
# 保存為xlsx格式(51代表xlsx格式)
workbook.SaveAs(new_path, 51)
# 驗(yàn)證轉(zhuǎn)換后的文件
if not os.path.exists(new_path):
raise Exception("轉(zhuǎn)換后的文件未創(chuàng)建成功")
# 檢查轉(zhuǎn)換后的文件大小
if os.path.getsize(new_path) == 0:
raise Exception("轉(zhuǎn)換后的文件為空")
return new_path
except Exception as e:
# 清理可能創(chuàng)建的部分文件
if 'new_path' in locals() and os.path.exists(new_path):
try:
os.remove(new_path)
except:
pass
raise e
finally:
# 確保資源被正確釋放
try:
if workbook:
workbook.Close()
except:
pass
try:
if excel:
excel.Quit()
except:
pass
def main():
"""主函數(shù):轉(zhuǎn)換單個(gè)文件并顯示結(jié)果"""
# 直接在代碼中設(shè)置要轉(zhuǎn)換的文件路徑
xls_file_path = r"D:\excel_files\example.xls" # 修改為您要轉(zhuǎn)換的xls文件路徑
try:
print(f"開(kāi)始轉(zhuǎn)換文件: {xls_file_path}")
# 轉(zhuǎn)換文件
xlsx_path = convert_xls_to_xlsx(xls_file_path)
# 輸出成功信息
print("\n" + "="*50)
print("? 文件轉(zhuǎn)換成功!")
print(f"原始文件: {xls_file_path}")
print(f"轉(zhuǎn)換后文件: {xlsx_path}")
print(f"文件大小: {os.path.getsize(xlsx_path)} 字節(jié)")
print("="*50)
except FileNotFoundError as e:
print(f"? 錯(cuò)誤: {e}")
print("請(qǐng)檢查文件路徑是否正確")
except ValueError as e:
print(f"? 錯(cuò)誤: {e}")
print("請(qǐng)確保文件是有效的xls文檔")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
print("可能是Excel應(yīng)用問(wèn)題或文件損壞")
if __name__ == "__main__":
main()
將代碼復(fù)制到你的Python編輯器中,并修改D:\excel_files\example.xls為您需要轉(zhuǎn)換的xls文件路徑即可。轉(zhuǎn)換后的xlsx文件與xls文件同名(如果已經(jīng)存在了同名xlsx文件,將加上(count)后綴以避免沖突)
核心功能代碼
xls文件轉(zhuǎn)換為xlsx文件的核心功能代碼為:
import os
from win32com import client as wc
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
workbook = excel.Workbooks.Open(xls_path)
workbook.SaveAs(new_path, 51)
workbook.Close()
excel.Quit()
將xls_path對(duì)應(yīng)的Excel工作簿轉(zhuǎn)換為new_path對(duì)應(yīng)的Excel工作簿。需要注意的是這個(gè)代碼本身xls_path可以是xls/xlsx類型的Excel文件路徑,Python代碼本身只是起到了讀取Excel文件的作用。
workbook.SaveAs(file_name, file_format)中file_format這個(gè)參數(shù)表示另存為文件的格式。
- 51:
xlOpenXMLWorkbook- 不含宏的xlsx格式 - 52:
xlOpenXMLWorkbookMacroEnabled- 含宏的xlsm格式 - 56:
xlExcel8- Excel 97-2003的xls格式 - 6:
xlCSV- CSV格式 - 62:
xlCSVUTF8- UTF-8編碼的CSV格式 - 22:
xlTextMSDOS- MS-DOS文本格式 - 42:
xlUnicodeText- Unicode文本格式
如果原xls文件包含宏,需要使用52格式保存為xlsm文件。
2. Excel文件處理 - 將xlsx文件轉(zhuǎn)換為xls
準(zhǔn)備環(huán)境和核心功能代碼與項(xiàng)目3相同。
復(fù)制即可運(yùn)行的完整代碼
import os
from win32com import client as wc
def convert_xlsx_to_xls(xlsx_path: str) -> str:
"""
將單個(gè)xlsx文件轉(zhuǎn)換為xls格式
Args:
xlsx_path (str): xlsx文件路徑
Returns:
str: 轉(zhuǎn)換后的xls文件路徑
"""
if not os.path.exists(xlsx_path):
raise FileNotFoundError(f"文件不存在: {xlsx_path}")
if not xlsx_path.lower().endswith('.xlsx'):
raise ValueError(f"文件不是xlsx格式: {xlsx_path}")
excel = None
workbook = None
try:
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
workbook = excel.Workbooks.Open(xlsx_path)
base_path = os.path.splitext(xlsx_path)[0]
new_path = base_path + ".xls"
count = 0
while os.path.exists(new_path):
count += 1
new_path = f"{base_path}({count}).xls"
# 56: xlExcel8 (Excel 97-2003格式)
workbook.SaveAs(new_path, 56)
return new_path
finally:
if workbook:
workbook.Close()
if excel:
excel.Quit()
def main():
xlsx_file_path = r"D:\excel_files\example.xlsx" # 修改為您的xlsx文件路徑
try:
print(f"開(kāi)始轉(zhuǎn)換文件: {xlsx_file_path}")
xls_path = convert_xlsx_to_xls(xlsx_file_path)
print(f"? 轉(zhuǎn)換成功: {xls_path}")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
if __name__ == "__main__":
main()
將代碼復(fù)制到你的Python編輯器中,并修改D:\excel_files\example.xlsx為您需要轉(zhuǎn)換的xlsx文件路徑即可。轉(zhuǎn)換后的xls文件與xlsx文件同名(如果已經(jīng)存在了同名xls文件,將加上(count)后綴以避免沖突)
3. Excel文件處理 - 將xls文件轉(zhuǎn)換為csv
準(zhǔn)備環(huán)境和核心功能代碼與項(xiàng)目3相同。
復(fù)制即可運(yùn)行的完整代碼
import os
from win32com import client as wc
def convert_xls_to_csv(xls_path: str) -> str:
"""
將單個(gè)xls文件轉(zhuǎn)換為csv格式
Args:
xls_path (str): xls文件路徑
Returns:
str: 轉(zhuǎn)換后的csv文件路徑
"""
if not os.path.exists(xls_path):
raise FileNotFoundError(f"文件不存在: {xls_path}")
if not xls_path.lower().endswith('.xls'):
raise ValueError(f"文件不是xls格式: {xls_path}")
excel = None
workbook = None
try:
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
workbook = excel.Workbooks.Open(xls_path)
base_path = os.path.splitext(xls_path)[0]
new_path = base_path + ".csv"
count = 0
while os.path.exists(new_path):
count += 1
new_path = f"{base_path}({count}).csv"
# 6: xlCSV (CSV格式)
workbook.SaveAs(new_path, 6)
return new_path
finally:
if workbook:
workbook.Close()
if excel:
excel.Quit()
def main():
xls_file_path = r"D:\excel_files\example.xls" # 修改為您的xls文件路徑
try:
print(f"開(kāi)始轉(zhuǎn)換文件: {xls_file_path}")
csv_path = convert_xls_to_csv(xls_file_path)
print(f"? 轉(zhuǎn)換成功: {csv_path}")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
if __name__ == "__main__":
main()
將代碼復(fù)制到你的Python編輯器中,并修改D:\excel_files\example.xls為您需要轉(zhuǎn)換的xls文件路徑即可。轉(zhuǎn)換后的csv文件與xls文件同名(如果已經(jīng)存在了同名csv文件,將加上(count)后綴以避免沖突)
4. Excel文件處理 - 將xlsx文件轉(zhuǎn)換為csv
準(zhǔn)備環(huán)境和核心功能代碼與項(xiàng)目3相同。
復(fù)制即可運(yùn)行的完整代碼
import os
from win32com import client as wc
def convert_xlsx_to_csv(xlsx_path: str) -> str:
"""
將單個(gè)xlsx文件轉(zhuǎn)換為csv格式
Args:
xlsx_path (str): xlsx文件路徑
Returns:
str: 轉(zhuǎn)換后的csv文件路徑
"""
if not os.path.exists(xlsx_path):
raise FileNotFoundError(f"文件不存在: {xlsx_path}")
if not xlsx_path.lower().endswith('.xlsx'):
raise ValueError(f"文件不是xlsx格式: {xlsx_path}")
excel = None
workbook = None
try:
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
workbook = excel.Workbooks.Open(xlsx_path)
base_path = os.path.splitext(xlsx_path)[0]
new_path = base_path + ".csv"
count = 0
while os.path.exists(new_path):
count += 1
new_path = f"{base_path}({count}).csv"
# 6: xlCSV (CSV格式)
workbook.SaveAs(new_path, 6)
return new_path
finally:
if workbook:
workbook.Close()
if excel:
excel.Quit()
def main():
xlsx_file_path = r"D:\excel_files\example.xlsx" # 修改為您的xlsx文件路徑
try:
print(f"開(kāi)始轉(zhuǎn)換文件: {xlsx_file_path}")
csv_path = convert_xlsx_to_csv(xlsx_file_path)
print(f"? 轉(zhuǎn)換成功: {csv_path}")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
if __name__ == "__main__":
main()
將代碼復(fù)制到你的Python編輯器中,并修改D:\excel_files\example.xlsx為您需要轉(zhuǎn)換的xlsx文件路徑即可。轉(zhuǎn)換后的csv文件與xlsx文件同名(如果已經(jīng)存在了同名csv文件,將加上(count)后綴以避免沖突)
5. Excel文件處理 - 將csv文件轉(zhuǎn)換為xls
準(zhǔn)備環(huán)境和核心功能代碼與項(xiàng)目3相同。
復(fù)制即可運(yùn)行的完整代碼
import os
from win32com import client as wc
def convert_csv_to_xls(csv_path: str) -> str:
"""
將單個(gè)csv文件轉(zhuǎn)換為xls格式
Args:
csv_path (str): csv文件路徑
Returns:
str: 轉(zhuǎn)換后的xls文件路徑
"""
if not os.path.exists(csv_path):
raise FileNotFoundError(f"文件不存在: {csv_path}")
if not csv_path.lower().endswith('.csv'):
raise ValueError(f"文件不是csv格式: {csv_path}")
excel = None
workbook = None
try:
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
workbook = excel.Workbooks.Open(csv_path)
base_path = os.path.splitext(csv_path)[0]
new_path = base_path + ".xls"
count = 0
while os.path.exists(new_path):
count += 1
new_path = f"{base_path}({count}).xls"
# 56: xlExcel8 (Excel 97-2003格式)
workbook.SaveAs(new_path, 56)
return new_path
finally:
if workbook:
workbook.Close()
if excel:
excel.Quit()
def main():
csv_file_path = r"D:\excel_files\example.csv" # 修改為您的csv文件路徑
try:
print(f"開(kāi)始轉(zhuǎn)換文件: {csv_file_path}")
xls_path = convert_csv_to_xls(csv_file_path)
print(f"? 轉(zhuǎn)換成功: {xls_path}")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
if __name__ == "__main__":
main()
將代碼復(fù)制到你的Python編輯器中,并修改D:\excel_files\example.csv為您需要轉(zhuǎn)換的csv文件路徑即可。轉(zhuǎn)換后的xls文件與csv文件同名(如果已經(jīng)存在了同名xls文件,將加上(count)后綴以避免沖突)
6. Excel文件處理 - 將csv文件轉(zhuǎn)換為xlsx
準(zhǔn)備環(huán)境和核心功能代碼與項(xiàng)目3相同。
復(fù)制即可運(yùn)行的完整代碼
import os
from win32com import client as wc
def convert_csv_to_xlsx(csv_path: str) -> str:
"""
將單個(gè)csv文件轉(zhuǎn)換為xlsx格式
Args:
csv_path (str): csv文件路徑
Returns:
str: 轉(zhuǎn)換后的xlsx文件路徑
"""
if not os.path.exists(csv_path):
raise FileNotFoundError(f"文件不存在: {csv_path}")
if not csv_path.lower().endswith('.csv'):
raise ValueError(f"文件不是csv格式: {csv_path}")
excel = None
workbook = None
try:
excel = wc.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
workbook = excel.Workbooks.Open(csv_path)
base_path = os.path.splitext(csv_path)[0]
new_path = base_path + ".xlsx"
count = 0
while os.path.exists(new_path):
count += 1
new_path = f"{base_path}({count}).xlsx"
# 51: xlOpenXMLWorkbook (不含宏的xlsx)
workbook.SaveAs(new_path, 51)
return new_path
finally:
if workbook:
workbook.Close()
if excel:
excel.Quit()
def main():
csv_file_path = r"D:\excel_files\example.csv" # 修改為您的csv文件路徑
try:
print(f"開(kāi)始轉(zhuǎn)換文件: {csv_file_path}")
xlsx_path = convert_csv_to_xlsx(csv_file_path)
print(f"? 轉(zhuǎn)換成功: {xlsx_path}")
except Exception as e:
print(f"? 轉(zhuǎn)換失敗: {e}")
if __name__ == "__main__":
main()
將代碼復(fù)制到你的Python編輯器中,并修改D:\excel_files\example.csv為您需要轉(zhuǎn)換的csv文件路徑即可。轉(zhuǎn)換后的xlsx文件與csv文件同名(如果已經(jīng)存在了同名xlsx文件,將加上(count)后綴以避免沖突)
以上就是使用Python進(jìn)行Excel文件xls/xlsx/xsv格式互相轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于Python文件格式xls/xlsx/xsv互轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
多版本python的pip 升級(jí)后, pip2 pip3 與python版本失配解決方法
在本篇文章里小編給大家整理的是關(guān)于多版本python的pip 升級(jí)后, pip2 pip3 與python版本失配的解決方法內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-09-09
Python利用pynimate實(shí)現(xiàn)制作動(dòng)態(tài)排序圖
這篇文章主要為大家詳細(xì)介紹了Python如何利用pynimate實(shí)現(xiàn)制作動(dòng)態(tài)排序圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
Python中Dataframe數(shù)據(jù)排序方法(含實(shí)例講解)
在進(jìn)行數(shù)據(jù)分析操作時(shí),經(jīng)常需要對(duì)數(shù)據(jù)按照某行某列排序,或者按照多行多列排序,以及按照索引值排序等等,下面這篇文章主要給大家介紹了關(guān)于Python中Dataframe數(shù)據(jù)排序方法的相關(guān)資料,需要的朋友可以參考下2023-02-02
使用Python 正則匹配兩個(gè)特定字符之間的字符方法
今天小編就為大家分享一篇使用Python 正則匹配兩個(gè)特定字符之間的字符方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
如何利用python?turtle繪圖自定義畫(huà)布背景顏色
Turtle庫(kù)是Python語(yǔ)言中一個(gè)很流行的繪制圖像的函數(shù)庫(kù),想象一個(gè)小烏龜,在一個(gè)橫軸為x、縱軸為y的坐標(biāo)系原點(diǎn),(0,0)位置開(kāi)始,這篇文章主要給大家介紹了關(guān)于如何利用python?turtle繪圖自定義畫(huà)布背景顏色的相關(guān)資料,需要的朋友可以參考下2021-12-12
selenium鼠標(biāo)操作實(shí)戰(zhàn)案例詳解
在實(shí)際場(chǎng)景中,會(huì)有單擊、長(zhǎng)時(shí)間單擊、雙擊、右鍵、拖拽等鼠標(biāo)操作,selenium提供了名為ActionChains的類來(lái)處理這些操作,下面這篇文章主要給大家介紹了關(guān)于selenium鼠標(biāo)操作實(shí)戰(zhàn)案例的相關(guān)資料,需要的朋友可以參考下2023-05-05
基于Python安裝pyecharts所遇的問(wèn)題及解決方法
今天小編就為大家分享一篇基于Python安裝pyecharts所遇的問(wèn)題及解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python全景系列之?dāng)?shù)據(jù)類型大盤(pán)點(diǎn)
這篇文章主要為大家介紹了Python全景系列之?dāng)?shù)據(jù)類型的盤(pán)點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
深入解析Python的Tornado框架中內(nèi)置的模板引擎
模板引擎是Web開(kāi)發(fā)框架中負(fù)責(zé)前端展示的關(guān)鍵,這里我們就來(lái)以實(shí)例深入解析Python的Tornado框架中內(nèi)置的模板引擎,來(lái)學(xué)習(xí)如何編寫(xiě)Tonardo的模板.2016-07-07

