據(jù)外媒報道,微軟正考慮添加 Python 為官方的一種 Excel 腳本語言,如果獲得批準,Excel 用戶將能夠像目前使用 VBA 腳本一樣,使用 Python 腳本與 Excel 文檔、數(shù)據(jù)以及一些 Excel 核心函數(shù)進行交互。
之前做java還是做nodejs,對于讀寫excel一直是一個頭疼的問題,在java中有開源的POI,無論功能和使用上都很齊全;轉(zhuǎn)而看nodejs這一塊,在處理excel問題上一直是一個頭疼的問題,之前做一個項目,就是因為nodejs無法實現(xiàn)模板處理方法而必須使用其他的語言或者方法處理。
最近公司在做一個django的項目,其中后臺涉及到一些python讀寫excel的方法,簡單做個記錄
開源模塊
- xlwings
可結(jié)合 VBA 實現(xiàn)對 Excel 編程,強大的數(shù)據(jù)輸入分析能力,同時擁有豐富的接口,結(jié)合 pandas/numpy/matplotlib 輕松應對 Excel 數(shù)據(jù)處理工作。
- openpyxl
簡單易用,功能廣泛,單元格格式/圖片/表格/公式/篩選/批注/文件保護等等功能應有盡有,圖表功能是其一大亮點,缺點是對 VBA 支持的不夠好。
- pandas
數(shù)據(jù)處理是 pandas 的立身之本,Excel 作為 pandas 輸入/輸出數(shù)據(jù)的容器。
- win32com
從命名上就可以看出,這是一個處理 windows 應用的擴展,Excel 只是該庫能實現(xiàn)的一小部分功能。該庫還支持 office 的眾多操作。需要注意的是,該庫不單獨存在,可通過安裝 pypiwin32 或者 pywin32 獲取。
- xlsxwriter
擁有豐富的特性,支持圖片/表格/圖表/篩選/格式/公式等,功能與openpyxl相似,優(yōu)點是相比 openpyxl 還支持 VBA 文件導入,迷你圖等功能,缺點是不能打開/修改已有文件,意味著使用 xlsxwriter 需要從零開始。
- DataNitro
作為插件內(nèi)嵌到 Excel 中,可完全替代 VBA,在 Excel 中使用 python 腳本。既然被稱為 Excel 中的 python,協(xié)同其他 python 庫亦是小事一樁。然而,這是付費插件...
- xlutils
基于 xlrd/xlwt,老牌 python 包,算是該領(lǐng)域的先驅(qū),功能特點中規(guī)中矩,比較大的缺點是僅支持 xls 文件。
openpyxl
通過openpyxl去讀取excel中單元格內(nèi)容
例如我們讀取一個excel文件中的內(nèi)容

# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
def getSheet(filename, sheetname):
wb = load_workbook(filename=filename)
sheet_ranges = wb[sheetname]
return wb, sheet_ranges
def readSheetContent(sheet_ranges):
flag = True
row = 1
while(flag):
if(sheet_ranges[u'A'+str(row)].value is None):
flag = False
break
# 獲取cell
rule_key = sheet_ranges[u'A'+str(row)]
error_level = sheet_ranges[u'B'+str(row)]
line = sheet_ranges[u'C'+str(row)]
result = sheet_ranges[u'D'+str(row)]
reason = sheet_ranges[u'E'+str(row)]
changeID = sheet_ranges[u'F'+str(row)]
# 獲取cell內(nèi)容
# 1. 獲取cell value值
print("Row"+str(row), rule_key.value, error_level.value, line.value, result.value, reason.value, changeID.value)
# 2. 獲取cell相關(guān)屬性
# 2.1 數(shù)據(jù)類型
rule_key_data_type = rule_key.data_type
print("rule_key_data_type:",rule_key_data_type)
# 2.2 編碼格式
rule_key_encoding = rule_key.encoding
print("rule_key_encoding:", rule_key_encoding)
# 2.3 填充色相關(guān)
rule_key_fill = rule_key.fill
rule_key_fill_bgcolor = rule_key.fill.bgColor.value
rule_key_fill_fgcolor = rule_key.fill.fgColor.value
print("rule_key_fill_bgcolor:",rule_key_fill_bgcolor)
print("rule_key_fill_fgcolor:",rule_key_fill_fgcolor)
# 2.4 字體相關(guān)
rule_key_font = rule_key.font
print("rule_key_font:",
rule_key_font.name,
rule_key_font.size,
rule_key_font.bold,
rule_key_font.italic,
rule_key_font.vertAlign,
rule_key_font.underline,
rule_key_font.strike)
# 3 修改單元格
if(row > 1):
result.value = True
reason.value = u"modify cell content"+str(row)
changeID.value = row
row += 1
return sheet_ranges
def saveWorkbook(wb, targetname):
wb.save(filename = targetname)
filename = u"./test/test.xlsx"
sheetname = u"Sheet1"
wb, sheet_ranges = getSheet(filename, sheetname)
readSheetContent(sheet_ranges)
saveWorkbook(wb, filename)
執(zhí)行完了以后的結(jié)果:

上面的這個例子,給出了一個通用的excel的讀寫方法,詳細的文檔可以參考https://openpyxl.readthedocs.io/en/stable/tutorial.html
pandas
Python Data Analysis Library 或 pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫和一些標準的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。你很快就會發(fā)現(xiàn),它是使Python成為強大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。1
pandas的文檔可以參考[https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html#]
還是參考上面的例子,我們讀取test.xlsx文件內(nèi)容
# -*- coding: utf-8 -*-
import pandas
def dataconvert(data):
# print(data)
if type(data) == unicode:
return data
elif type(data) == str:
return data
elif type(data) == long:
return data
elif type(data) == pandas._libs.tslib.Timestamp:
return str(data)
else:
return ""
excelname = './test/test.xlsx'
xlsx = pandas.read_excel(excelname, header=0, index_col=0)
for idx, row in xlsx.iterrows():
rule_key = idx
error_level = dataconvert(row[u"error_level"])
line = dataconvert(row[u"line"])
result = dataconvert(row[u"是否有問題"])
reason = dataconvert(row[u"理由"])
changeID = dataconvert(row[u"提交ID"])
print(rule_key, error_level,line, result, reason, changeID)
輸出結(jié)果:

其他可以參考Pandas Excel example,Pandas獨有的基本數(shù)據(jù)結(jié)構(gòu)