在網(wǎng)上瀏覽了一下逸绎,比較了一下骚腥,python使用openpyxl
庫處理xlsx文件是比較好的選擇晌砾。
目錄:
安裝
pip install openpyxl
基本使用
基本的使用主要涉及以下三個模塊:
讀取文件
導(dǎo)入load_workbook
方法
from openpyxl import load_workbook
導(dǎo)入文件獲取workbook
wb = load_workbook('file_name')
參數(shù)特別說明:
-
read_only
:只讀模式,無法編輯內(nèi)容箩朴,可以優(yōu)化數(shù)據(jù)讀取速度(自測,能夠提高50%)秋度,默認為False -
data_only
:控制單元格是讀取公式還是文件讀取時的值炸庞,默認為False(只獲取計算結(jié)果,并不關(guān)心具體公式荚斯,可以設(shè)置為True)
注:read_only
設(shè)置為True埠居,則無法按列訪問單元格查牌。而且必須調(diào)用close()
顯示關(guān)閉workbook
獲取worksheet
-
根據(jù)sheet名稱獲取
ws = wb['sheet_name']
-
遍歷sheet獲取
for sheet in wb: ... ...
操作完成后注意關(guān)閉workbook:
wb.close()
操作數(shù)據(jù)
獲取worksheet后,獲取其中的數(shù)據(jù):
批量獲取
-
獲取指定行
sheet[1]
輸入所需行號:1, 2 ,3, ...
-
獲取指定列
sheet['A']
輸入所需列標:'A', 'B', 'C', ...
-
獲取指定單元格
sheet['A1']
-
獲取指定范圍的單元格
sheet['A2:D2'] # 獲取行 sheet['A2:A4'] # 獲取列 sheet['A1:D4'] # 獲取4行4列
通過這樣的方式得到的元素是二維元組滥壕,通過迭代訪問單元格:
for row in sheet['A1:D4']: for cell in row: print(cell.value)
操作cell
-
獲取值:
cell.value
注意:空單元格值為
None
獲取cell所在行:
cell.row
獲取cell所在列:
cell.column
添加數(shù)據(jù)
添加行
末尾增加一行
ws.append(['cell1', 'cell 2'])
指定位置插入一行
ws.insert_rows(7)
for cell in ws[7]:
cell.value = 'cell value'
添加列
指定位置插入列
ws.insert_cols(2)
for i in ws.max_row:
cell = ws.cell(i, 2)
cell.value = 'cell value'
刪除數(shù)據(jù)
刪除指定行
ws.delete_rows(2)
刪除指定列
ws.delete_cols(2)
寫入到文件
類似使用的例子:Using filters and sorts
data = [
["Fruit", "Quantity"],
["Kiwi", 3],
["Grape", 15],
["Apple", 3]
]
wb = Workbook()
ws = wb.active
for r in date:
ws.append(r)
wb.save('file_name')
- 寫入文件的數(shù)據(jù)是二維數(shù)組纸颜;
- 使用
worksheet.append()
,填加一行內(nèi)容绎橘,內(nèi)容是一個數(shù)組胁孙; -
save()
方法會以'w'
的模式去寫入文件,注意覆蓋的問題金踪。
為單元格添加樣式
樣式相關(guān)的模塊都在openpyxl.styles package
該例只添加單元格的底色:
導(dǎo)入PatternFill
from openpyxl.styles import PatternFill
創(chuàng)建填充實例
style = PatternFill("solid", fgColor="E2EFDA")
填充單元格
cell.fill = style
保存更改
wb.save(path)
例子
有時候期望填充一行而不是單個單元格浊洞,則可以進行如下操作:
from openpyxl import Workbook, load_workbook
from openpyxl.styles import PatternFill
path = './test.xlsx'
wb = load_workbook(filename=path)
ws = wb['Sheet1']
style = PatternFill("solid", fgColor="E2EFDA")
for cell in ws[1]:
cell.fill = style
wb.save(path)
wb.close() // maybe Unnecessary
從xlsx中導(dǎo)入數(shù)據(jù)
from openpyxl import load_workbook
def import_data(file_path: str, sheets=[]):
wb = load_workbook(file_path)
if not sheets:
sheets = wb.sheetnames
for sheet in sheets:
print(f'--- begin execute [{sheet}]')
ws = wb[sheet]
rows = ws.values
header = next(rows)
print(f'|-- header: {header}')
user = dict()
for row in rows:
for i, h in enumerate(header):
if h == '姓名':
user['name'] = row[i]
......
# save user or do further operations
常用方法
workbook module常用屬性
-
sheetnames
:獲取工作表名稱列表
worksheet module 常用屬性
-
dimensions
:返回包含數(shù)據(jù)的所有單元格的最小邊界范圍- TODO: 不清楚會不會自動忽略空值行
max_column
:包含數(shù)據(jù)的最大列數(shù)max_row
:包含數(shù)據(jù)的最大行數(shù)values
:按行獲取所有單元格的值,返回一個生成器
cell model 常用屬性
row
:單元格的行號(從1開始)column
:單元格的列索引字母(從A開始)col_idx
:單元格的列號(從1開始)column_letter
:單元格的字母索引(A, B, ...)coordinate
: 單元格的坐標(比如:A1)parent
:單元格所在的worksheet-
data_type
:單元格值的類型TYPE_STRING = 's' TYPE_FORMULA = 'f' TYPE_NUMERIC = 'n' TYPE_BOOL = 'b' TYPE_NULL = 'n' TYPE_INLINE = 'inlineStr' TYPE_ERROR = 'e' TYPE_FORMULA_CACHE_STRING = 'str'
來源于:mr_wolverine