Python實(shí)現(xiàn)將列表高效導(dǎo)出為 Excel 文件
在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的世界中,Python 已成為數(shù)據(jù)處理和分析的強(qiáng)大工具。我們經(jīng)常需要將程序中處理好的數(shù)據(jù),特別是以列表形式組織的數(shù)據(jù),導(dǎo)出到 Excel 文件中,以便于共享、可視化或進(jìn)一步分析。然而,如何高效、靈活地將這些列表數(shù)據(jù)寫入 Excel,并確保格式的準(zhǔn)確性和美觀性,是許多開發(fā)者面臨的痛點(diǎn)。
Python 生態(tài)系統(tǒng)為此提供了多種解決方案,從內(nèi)置的 CSV 模塊到第三方庫,各有千秋。本文將深入探討如何利用 Spire.XLS for Python 庫,一個(gè)功能強(qiáng)大且易于使用的 Excel 處理庫,來優(yōu)雅地解決這一問題。它不僅能滿足基礎(chǔ)的數(shù)據(jù)寫入需求,更能應(yīng)對復(fù)雜的格式化和大規(guī)模數(shù)據(jù)處理場景,幫助您輕松實(shí)現(xiàn)數(shù)據(jù)自動(dòng)化和報(bào)表生成。
環(huán)境配置
Spire.XLS for Python 是一個(gè)專業(yè)的 Python Excel 庫,專為創(chuàng)建、讀取、編輯、轉(zhuǎn)換和打印 Excel 文件而設(shè)計(jì)。它的核心優(yōu)勢在于無需依賴 Microsoft Office 即可獨(dú)立運(yùn)行,支持 .xls、.xlsx、.xlsm、.xlt 等多種 Excel 文件格式。對于開發(fā)者而言,這意味著在服務(wù)器端部署時(shí)無需額外安裝 Office 軟件,大大降低了部署成本和復(fù)雜性。
該庫提供了豐富的 API 接口,可以操作 Excel 的各種元素,包括工作簿、工作表、單元格、格式、圖表、公式、批注等。在將列表數(shù)據(jù)寫入 Excel 的場景中,Spire.XLS for Python 能夠讓您靈活控制數(shù)據(jù)的寫入位置、樣式,并支持多種數(shù)據(jù)類型的自動(dòng)轉(zhuǎn)換,從而實(shí)現(xiàn)高度定制化的 Excel 輸出。
安裝指南:
在開始之前,請確保您的 Python 環(huán)境已安裝 Spire.XLS for Python。您可以通過 pip 命令輕松安裝:
pip install Spire.XLS
安裝完成后,您就可以在 Python 項(xiàng)目中導(dǎo)入并使用它了。
從列表到Excel:基礎(chǔ)數(shù)據(jù)寫入實(shí)踐
首先,我們來看一個(gè)最基礎(chǔ)的場景:將一個(gè)簡單的列表數(shù)據(jù)寫入 Excel 文件。假設(shè)我們有一個(gè)包含學(xué)生姓名和分?jǐn)?shù)的列表。
場景設(shè)定:
我們有一個(gè)這樣的列表,其中每個(gè)子列表代表一行數(shù)據(jù):
data = [
["部門", "預(yù)算金額(元)", "實(shí)際支出(元)", "差額"],
["市場部", 80000, 76500, -3500],
["技術(shù)部", 150000, 162300, 12300],
["行政部", 50000, 48200, -1800]
]
代碼示例:
from spire.xls import *
from spire.xls.common import *
def write_simple_list_to_excel(data_list, file_path="simple_data.xlsx"):
"""
將簡單的列表數(shù)據(jù)寫入Excel文件。
:param data_list: 包含數(shù)據(jù)的列表,每個(gè)子列表代表一行。
:param file_path: 輸出Excel文件的路徑。
"""
# 創(chuàng)建一個(gè)工作簿對象
workbook = Workbook()
# 獲取第一個(gè)工作表
sheet = workbook.Worksheets[0]
# 遍歷列表數(shù)據(jù),并寫入工作表
for row_idx, row_data in enumerate(data_list):
for col_idx, cell_value in enumerate(row_data):
# 將列表中的值賦給對應(yīng)的單元格
sheet.Range[row_idx + 1, col_idx + 1].Value = str(cell_value) # spire.xls 默認(rèn)接受字符串或數(shù)字
# 保存工作簿到指定文件
workbook.SaveToFile(file_path, FileFormat.Version2016) # 保存為xlsx格式
workbook.Dispose() # 釋放資源
print(f"數(shù)據(jù)已成功寫入:{file_path}")
# 調(diào)用函數(shù)
write_simple_list_to_excel(data)
寫入效果預(yù)覽:

關(guān)鍵步驟解釋:
Workbook(): 創(chuàng)建一個(gè)新的 Excel 工作簿實(shí)例。workbook.Worksheets[0]: 獲取工作簿中的第一個(gè)工作表(默認(rèn)創(chuàng)建)。sheet.Range[row_idx + 1, col_idx + 1].Value = str(cell_value): 這是核心的寫入操作。Range對象代表一個(gè)或一組單元格。Range[row, column]使用基于 1 的索引來指定單元格位置。我們將列表中的每個(gè)元素cell_value賦給對應(yīng)的單元格的Value屬性。為了通用性,這里將所有值轉(zhuǎn)換為字符串,但spire.xls也能自動(dòng)處理數(shù)字類型。workbook.SaveToFile(file_path, FileFormat.Version2016): 將修改后的工作簿保存到磁盤上的指定路徑。FileFormat.Version2016表示保存為.xlsx格式。workbook.Dispose(): 釋放工作簿對象占用的資源,這是一個(gè)良好的編程習(xí)慣,尤其是在處理大量文件時(shí)。
注意事項(xiàng):
- 確保
file_path指定的目錄存在且有寫入權(quán)限。 spire.xls的行和列索引都是從 1 開始,而不是 Python 列表的從 0 開始,這一點(diǎn)在row_idx + 1和col_idx + 1中體現(xiàn)。
深度定制:復(fù)雜數(shù)據(jù)結(jié)構(gòu)與Excel格式化
在實(shí)際應(yīng)用中,數(shù)據(jù)往往更復(fù)雜,并且對 Excel 的呈現(xiàn)效果有更高的要求,比如添加標(biāo)題、設(shè)置樣式、調(diào)整列寬等。
場景設(shè)定:
- 帶標(biāo)題的列表數(shù)據(jù): 假設(shè)我們希望列表的第一行作為 Excel 的標(biāo)題行,并對其進(jìn)行加粗、設(shè)置背景色。
- 多維列表: 如果列表數(shù)據(jù)包含日期或其他特殊類型,我們也希望它們能夠正確顯示。
代碼示例:
from spire.xls import *
import datetime
def write_advanced_list_to_excel(data_list, file_path="advanced_data.xlsx"):
"""
將包含標(biāo)題和復(fù)雜數(shù)據(jù)類型的列表寫入Excel,并進(jìn)行格式化。
:param data_list: 包含數(shù)據(jù)的列表,第一行是標(biāo)題。
:param file_path: 輸出Excel文件的路徑。
"""
workbook = Workbook()
sheet = workbook.Worksheets[0]
# 寫入標(biāo)題行并設(shè)置樣式
header_data = data_list[0]
for col_idx, header_text in enumerate(header_data):
header_cell = sheet.Range[1, col_idx + 1]
header_cell.Value = header_text
# 設(shè)置字體加粗
header_cell.Style.Font.IsBold = True
# 設(shè)置背景色 (RGB顏色)
header_cell.Style.KnownColor = ExcelColors.LightYellow
# 居中對齊
header_cell.Style.HorizontalAlignment = HorizontalAlignType.Center
# 寫入數(shù)據(jù)行
for row_idx, row_data in enumerate(data_list[1:]): # 從第二行開始遍歷數(shù)據(jù)
for col_idx, cell_value in enumerate(row_data):
current_cell = sheet.Range[row_idx + 2, col_idx + 1] # 數(shù)據(jù)從第二行開始寫
if isinstance(cell_value, datetime.date):
current_cell.DateTimeValue = DateTime.Parse(str(cell_value)) # 寫入日期/時(shí)間對象
current_cell.Style.NumberFormat = "yyyy-mm-dd" # 設(shè)置日期格式
if isinstance(cell_value, datetime.datetime):
current_cell.DateTimeValue = DateTime.Parse(str(cell_value))
current_cell.Style.NumberFormat = "yyyy-mm-dd hh:mm"
else:
current_cell.Value = str(cell_value)
# 自動(dòng)調(diào)整列寬以適應(yīng)內(nèi)容
sheet.AutoFitColumn(1) # 自動(dòng)調(diào)整第一列
sheet.AutoFitColumn(2) # 自動(dòng)調(diào)整第二列
sheet.AutoFitColumn(3) # 自動(dòng)調(diào)整第三列
sheet.AutoFitColumn(4) # 自動(dòng)調(diào)整第四列
# 保存文件
workbook.SaveToFile(file_path, FileFormat.Version2016)
workbook.Dispose()
print(f"高級數(shù)據(jù)已成功寫入:{file_path}")
# 示例數(shù)據(jù),包含日期
advanced_data = [
["訂單編號", "客戶名稱", "訂單金額(元)", "下單時(shí)間"],
["SO-20231026001", "深圳智聯(lián)科技", 32800, datetime.date(2023, 10, 26)],
["SO-20231025002", "北京銳達(dá)信息", 15600, datetime.datetime(2023, 10, 25, 14, 30)],
["SO-20231027003", "上海啟明系統(tǒng)", 48900, datetime.date(2023, 10, 27)],
["SO-20231028004", "杭州云創(chuàng)數(shù)據(jù)", 21450, datetime.datetime(2023, 10, 28, 9, 15)]
]
write_advanced_list_to_excel(advanced_data)
寫入效果預(yù)覽:

關(guān)鍵特性:
CellStyle: 通過cell.Style屬性,您可以訪問單元格的樣式對象,進(jìn)而設(shè)置字體、顏色、對齊方式、邊框等。header_cell.Style.Font.IsBold = True:設(shè)置字體加粗。header_cell.Style.KnownColor = ExcelColors.LightYellow:設(shè)置背景色。ExcelColors枚舉提供了多種預(yù)定義的顏色。header_cell.Style.HorizontalAlignment = HorizontalAlignType.Center:設(shè)置水平居中對齊。
DateTimeValue與NumberFormat: 對于日期和時(shí)間對象,直接賦值給cell.DateTimeValue屬性,并使用cell.Style.NumberFormat設(shè)置顯示格式,Excel 會(huì)自動(dòng)識別并正確顯示。sheet.AutoFitColumn(column_index): 自動(dòng)調(diào)整指定列的寬度,使其內(nèi)容完全顯示,避免了手動(dòng)調(diào)整的麻煩,尤其對于動(dòng)態(tài)數(shù)據(jù)非常有用。
穩(wěn)健之道:錯(cuò)誤處理與寫入優(yōu)化建議
在實(shí)際的數(shù)據(jù)處理流程中,錯(cuò)誤處理和性能優(yōu)化同樣重要,它們決定了程序的健壯性和效率。
常見錯(cuò)誤及其解決方案:
文件路徑錯(cuò)誤/權(quán)限問題:
- 錯(cuò)誤:
FileNotFoundError或PermissionError。 - 解決方案: 確保目標(biāo)文件夾存在,并且程序有權(quán)限在該文件夾下創(chuàng)建或修改文件??梢允褂?
os.makedirs()創(chuàng)建不存在的目錄。
數(shù)據(jù)類型不匹配:
- 錯(cuò)誤: 寫入 Excel 時(shí)出現(xiàn)非預(yù)期的數(shù)據(jù)格式。
- 解決方案:
spire.xls會(huì)嘗試自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型,但對于特殊類型(如datetime對象),最好使用其特定的屬性(如DateTimeValue)進(jìn)行賦值,并配合NumberFormat設(shè)置顯示格式。
內(nèi)存溢出 (大規(guī)模數(shù)據(jù)):
- 錯(cuò)誤: 處理超大型數(shù)據(jù)集時(shí),程序可能因?yàn)閮?nèi)存不足而崩潰。
- 解決方案:
spire.xls內(nèi)部對內(nèi)存使用進(jìn)行了優(yōu)化,但如果數(shù)據(jù)量極其龐大(例如數(shù)百萬行),可以考慮分批寫入,或者優(yōu)化數(shù)據(jù)結(jié)構(gòu),避免一次性加載所有數(shù)據(jù)到內(nèi)存。
try-except-finally 結(jié)構(gòu):
在文件操作中,使用 try-except-finally 結(jié)構(gòu)是最佳實(shí)踐,可以確保即使發(fā)生錯(cuò)誤,資源也能被正確釋放。
try:
workbook = Workbook()
# ... 進(jìn)行Excel操作 ...
workbook.SaveToFile(file_path, FileFormat.Version2016)
except Exception as e:
print(f"寫入Excel文件時(shí)發(fā)生錯(cuò)誤: {e}")
finally:
if 'workbook' in locals() and workbook is not None:
workbook.Dispose() # 確保在任何情況下都釋放資源
性能考量與優(yōu)化:
對于大規(guī)模數(shù)據(jù)寫入,以下建議可以幫助提升性能:
- 避免頻繁保存: 盡量將所有數(shù)據(jù)寫入操作完成后,一次性保存工作簿,而不是每寫入一部分?jǐn)?shù)據(jù)就保存一次。
- 批量操作: 如果需要對大量單元格應(yīng)用相同的樣式,盡量使用
Range對象的一次性操作,而不是逐個(gè)單元格設(shè)置。例如,sheet.Range["A1:D1"].Style.Font.IsBold = True比循環(huán)設(shè)置每個(gè)單元格的樣式效率更高。 - 數(shù)據(jù)預(yù)處理: 在將數(shù)據(jù)傳遞給
spire.xls之前,盡可能完成所有的數(shù)據(jù)清洗、轉(zhuǎn)換和格式化工作,減少在 Excel 庫內(nèi)部的計(jì)算量。 Dispose()的重要性: 務(wù)必在操作完成后調(diào)用workbook.Dispose(),及時(shí)釋放內(nèi)存和文件句柄,防止資源泄露。
代碼可讀性與維護(hù):
- 注釋: 為復(fù)雜的邏輯或關(guān)鍵步驟添加清晰的注釋。
- 函數(shù)化: 將不同的功能封裝到獨(dú)立的函數(shù)中,提高代碼的模塊化和可重用性。
- 變量命名: 使用有意義的變量名,增強(qiáng)代碼的可讀性。
結(jié)語
本文的介紹如何使用 Spire.XLS for Python 庫將 Python 列表數(shù)據(jù)寫入 Excel 文件。從基礎(chǔ)的數(shù)據(jù)導(dǎo)入到復(fù)雜的格式化和樣式設(shè)置,Spire.XLS for Python 都展現(xiàn)了其強(qiáng)大的功能和靈活的控制力。它不僅簡化了數(shù)據(jù)導(dǎo)出的過程,更使得自動(dòng)化報(bào)表生成、數(shù)據(jù)分析結(jié)果呈現(xiàn)等任務(wù)變得觸手可及。
在數(shù)據(jù)處理和自動(dòng)化日益普及的今天,掌握這樣的工具無疑能極大地提升工作效率。進(jìn)一步探索 Spire.XLS for Python 的更多高級功能,例如圖表生成、公式計(jì)算、數(shù)據(jù)驗(yàn)證等,將其融入數(shù)據(jù)工作流,解鎖更多自動(dòng)化潛力。
到此這篇關(guān)于Python實(shí)現(xiàn)將列表高效導(dǎo)出為 Excel 文件的文章就介紹到這了,更多相關(guān)Python列表導(dǎo)出為Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python進(jìn)行屏幕錄制的實(shí)現(xiàn)
關(guān)于屏幕錄制這個(gè)功能需求,之前用過基于ffmpeg的Capture錄屏軟件,但是fps拉高以后會(huì)變得很卡,聲音也同樣出現(xiàn)卡頓,所以本文給大家介紹了用Python進(jìn)行屏幕錄制的實(shí)現(xiàn),感興趣的朋友可以參考下2024-04-04
Python實(shí)現(xiàn)不規(guī)則圖形填充的思路
這篇文章主要介紹了Python實(shí)現(xiàn)不規(guī)則圖形填充的思路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Python基于pycrypto實(shí)現(xiàn)的AES加密和解密算法示例
這篇文章主要介紹了Python基于pycrypto實(shí)現(xiàn)的AES加密和解密算法,結(jié)合實(shí)例形式分析了Python使用pycrypto模塊進(jìn)行AES加密與解密操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04
基于PyQt5實(shí)現(xiàn)一個(gè)無線網(wǎng)連接器
為了方便不會(huì)python的朋友也能夠使用,本文將用pyqt5將制作一個(gè)帶界面的無線網(wǎng)連接器,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
Python 基于jwt實(shí)現(xiàn)認(rèn)證機(jī)制流程解析
這篇文章主要介紹了python 基于jwt實(shí)現(xiàn)認(rèn)證機(jī)制流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

