更多內容,請訪問個人 我的博客。html
用 Python
處理Excel表格的幾個常規庫:編程
這些庫都不如 OpenPyXL 強大,OpenPyXL
便可以讀也能夠寫 Excel 2010+
的 xlsx
xlsm
xltx
xltm
文件。不過, OpenPyXL
庫也是比較吃內存的,大約是原始文件的50倍左右。例如,一個50M大小的Excel文件,須要2.5G大小的內存運行。關於以上幾個庫的性能比對,請移步 OpenPyXL性能測試。api
在終端中輸入命令,以下:bash
pip install openpyxl
複製代碼
openpyxl
在保存Excel表格時候會丟失原文件的圖片和圖表。若是要操做圖片,則須要 pillow
庫,安裝以下:app
pip install pillow
複製代碼
因爲最近軍運會要在天朝舉行,所以必須翻-牆才能安裝。ide
新建Excel表格,默認有一個名爲 Sheet
的表格,以下:性能
from openpyxl import Workbook
wb = Workbook() #建立文件對象
ws = wb.active #獲取默認sheet
wb.save("sample.xlsx")
複製代碼
對已有的Excel表格進行操做,以下:測試
from openpyxl import Workbook, load_workbook
wb = load_workbook('sample.xlsx')
wb.save("sample.xlsx")
複製代碼
使用 Workbook.create_sheet()
方法新建Sheet表格。第一個參數是sheet名稱,若不填,則默認以 Sheet1
Sheet2
Sheet3
...方式命名;第二個參數是插入Sheet表格的位置,以 0
爲第一個位置,若不填,則置於最後。以下:字體
ws1 = wb.create_sheet("Mysheet") #默認在最後插入
ws2 = wb.create_sheet("Mysheet", 0) #在第一個位置插入
wb.remove(ws1) #刪除sheet
複製代碼
也能夠後期隨時修改sheet的名字,以下:優化
ws.title = "New Title"
複製代碼
修改sheet標籤顏色,以下:
ws.sheet_properties.tabColor = "1072BA"
複製代碼
若知道sheet的名字,能夠用以下方式獲取sheet :
ws = wb.get_sheet_by_name("New Title")
ws = wb["New Title"]
複製代碼
也可獲取所有sheet的名字,遍歷sheet名字,以下:
sheets = wb.sheetnames
for sheet in sheets:
print(sheets)
for sheet in wb:
print sheet.title
['Sheet1', 'New Title', 'Sheet2']
複製代碼
也能夠定位到相應sheet頁,[0]爲sheet頁索引,以下:
sheet_names = wb.sheetnames # 獲取全部sheet頁名字
ws = wb[sheet_names[0]]
複製代碼
僅能複製 單元格的值
樣式
超連接
註釋塊
等,而 圖片
和 表格
等是沒法複製的,以下:
source = wb.active
target = wb.copy_worksheet(source)
複製代碼
由 worksheet
獲取單元格,或直接給單元格賦值,以下:
cell = ws['A4'] #獲取第4行第A列的單元格
ws['A4'] = 4 #給第4行第A列的單元格賦值爲4
ws.cell(row=4, column=2, value=10) #給第4行第2列的單元格賦值爲10
ws.cell(4, 2, 10) #同上
複製代碼
獲取區域內的單元格,以下:
cell_range = ws['A1':'C2'] #獲取A1-C2內的區域
colC = ws['C'] #獲取第C列
col_range = ws['C:D'] #獲取第C-D列
row10 = ws[10] #獲取第10列
row_range = ws[5:10] #獲取第5-10列
複製代碼
若是獲得單元格,能夠賦值,以下:
cell.value = 'hello, world'
或
cell = ws.cell(row=i, column=j, value="金額")
複製代碼
獲取單元格的值,以下:
cellValue = ws.cell(row=i, column=j).value
複製代碼
獲取行列數,以下:
row = ws.max_row #最大行數
column = ws.max_column #最大列數
複製代碼
一行行的獲取數據,以下:
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
複製代碼
一列列的獲取數據,以下:
>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
... for cell in col:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.A2>
<Cell Sheet1.B1>
<Cell Sheet1.B2>
<Cell Sheet1.C1>
<Cell Sheet1.C2>
複製代碼
由於性能的緣由, Worksheet.iter_cols()
方法不能在只讀模式下使用。
獲取全部的列或行,以下:
rows = ws.rows
columns = ws.columns
複製代碼
由於性能的緣由, Worksheet.columns
方法不能在只讀模式下使用。
若是隻想從worksheet中獲取值,可使用 Worksheet.values
屬性,以下:
for row in ws.values:
for value in row:
print(value)
複製代碼
Worksheet.iter_rows()
和 Worksheet.iter_cols()
方法均可以添加 values_only
參數來達到僅獲取值的目的,以下:
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
print(row)
複製代碼
使用 Workbook.save()
方法保存workbook,這個方法會不加提示的覆蓋原文件,以下:
wb = Workbook()
wb.save('balances.xlsx')
複製代碼
from openpyxl import Workbook, load_workbook
import datetime
wb = load_workbook('sample.xlsx')
ws=wb.active
wb.guess_types = True #開啓獲取單元格類型
ws["A1"]=datetime.datetime(2010, 7, 21)
print ws["A1"].number_format
ws["A2"]="12%"
print ws["A2"].number_format
ws["A3"]= 1.1
print ws["A4"].number_format
ws["A4"]= "中國"
print ws["A5"].number_format
wb.save("sample.xlsx")
# 執行結果:
# yyyy-mm-dd h:mm:ss
# 0%
# General
# General
# 若是是常規,顯示general,若是是數字,顯示'0.00_ ',若是是百分數顯示0%
# 數字須要在Excel中設置數字類型,直接寫入的數字是常規類型
複製代碼
from openpyxl import Workbook, load_workbook
wb = load_workbook('sample.xlsx')
ws1=wb.active
ws1["A1"]=1
ws1["A2"]=2
ws1["A3"]=3
ws1["A4"] = "=SUM(1, 1)"
ws1["A5"] = "=SUM(A1:A3)"
print ws1["A4"].value #打印的是公式內容,不是公式計算後的值,程序沒法取到計算後的值
print ws1["A5"].value #打印的是公式內容,不是公式計算後的值,程序沒法取到計算後的值
wb.save("sample.xlsx")
複製代碼
from openpyxl import Workbook, load_workbook
wb = load_workbook('sample.xlsx')
ws1=wb.active
ws.merge_cells('A2:D2')
ws.unmerge_cells('A2:D2') #合併後的單元格,腳本單獨執行拆分操做會報錯,須要從新執行合併操做再拆分
# or equivalently
ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4)
ws.unmerge_cells(start_row=2,start_column=1,end_row=2,end_column=4)
wb.save("sample.xlsx")
複製代碼
須要 pillow
庫,安裝以下:
pip install pillow
複製代碼
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
wb = load_workbook('sample.xlsx')
ws1=wb.active
img = Image('1.png')
ws1.add_image(img, 'A1')
wb.save("sample.xlsx")
複製代碼
from openpyxl import load_workbook
wb = load_workbook('sample.xlsx')
ws = wb.active
ws.column_dimensions.group('A', 'D', hidden=True) # 隱藏A到D列
ws.row_dimensions.group(1, 10, hidden=True) # 隱藏1到10行
ws.row_dimensions[2].hidden # 獲取第二行是否隱藏了
wb.save("sample.xlsx")
複製代碼
在處理很是大的 XLSX
文件時,openpyxl
的常規模式沒法處理這種負載。幸運的是,有兩種模式能夠在(幾乎)恆定內存消耗的狀況下讀寫無限量的數據。
from openpyxl import load_workbook
wb = load_workbook(filename='large_file.xlsx', read_only=True)
ws = wb['big_data']
for row in ws.rows:
for cell in row:
print(cell.value)
複製代碼
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet()
# now we'll fill it with 100 rows x 200 columns
for irow in range(100):
... ws.append(['%d' % i for i in range(200)])
# save the file
wb.save('new_big_file.xlsx') # doctest: +SKIP
複製代碼
create_sheet()
方法專門建立工做表。append()
添加行。使用 cell()
或 iter_rows()
在任意位置寫(或讀)單元格是不可能的。在第7行之上插入一行,以下:
ws.insert_rows(7)
複製代碼
在第7列的左邊插入一列,以下:
ws.insert_cols(7)
複製代碼
從第6列開始,刪除3列,即刪除六、七、8列,以下:
ws.delete_cols(6, 3)
複製代碼
將 D4:F10
區域向上移動一行向右移動2列,以下:
ws.move_range("D4:F10", rows=-1, cols=2)
複製代碼
若是區域內包含 公式
,則以下方法能夠連同公式一塊兒挪動:
ws.move_range("G4:H10", rows=1, cols=1, translate=True)
複製代碼
詳情請移步 Working with Pandas and NumPy
圖表由至少一個系列的一個或多個單元格區域數據點組成。更多內容請移步 圖表介紹
openpyxl
可讀/寫註釋,但格式信息會被丟失。在 只讀模式
下不支持操做註釋。註釋必須包括 內容
和 做者
。
讀註釋,以下:
comment = ws["A1"].comment
comment.text # 註釋內容
comment.author # 註釋做者
複製代碼
寫註釋,以下:
comment = Comment("Text", "Author")
comment.width = 300 # 設置寬度
comment.height = 50 # 設置高度
ws["A1"].comment = comment
ws["B2"].comment = comment
複製代碼
字體名稱、字體大小、字體顏色、加粗、斜體、縱向對齊方式(有三種:baseline
,superscript
, subscript
)、下劃線、刪除線,以下:
from openpyxl.styles import Font
font = Font(name='Calibri',
size=11,
color='FF000000',
bold=False,
italic=False,
vertAlign=None,
underline='none',
strike=False)
ws['A1'].font = font
cell2.font = Font(name=cell1.font.name, sz=cell1.font.sz, b=cell1.font.b, i=cell1.font.i)
複製代碼
字體顏色能夠用 RGB
或 aRGB
,以下:
font = Font(color="FFBB00")
font = Font(color="FFFFBB00")
複製代碼
繼承並重寫樣式,以下:
ft1 = Font(name='Arial', size=14)
ft2 = copy(ft1)
ft2.name = "Tahoma"
複製代碼
詳情請移步 填充樣式
from openpyxl.styles import PatternFill
# fill_type 的樣式爲 None 或 solid
cell2.fill = PatternFill(fill_type=cell1.fill.fill_type, fgColor=cell1.fill.fgColor)
複製代碼
詳情請移步 邊框樣式
from openpyxl.styles import Border, Side
border = Border(left=Side(border_style=None, color='FF000000'),
right=Side(border_style=None, color='FF000000'),
top=Side(border_style=None, color='FF000000'),
bottom=Side(border_style=None, color='FF000000'),
diagonal=Side(border_style=None, color='FF000000'),
diagonal_direction=0,
outline=Side(border_style=None, color='FF000000'),
vertical=Side(border_style=None, color='FF000000'),
horizontal=Side(border_style=None, color='FF000000')
)
複製代碼
horizontal 的值有:distributed
, justify
, center
, left
, fill
, centerContinuous
, right
, general
vertical 的值有:bottom
, distributed
, justify
, center
, top
from openpyxl.styles import Alignment
alignment=Alignment(horizontal='general',
vertical='bottom',
text_rotation=0,
wrap_text=False,
shrink_to_fit=False,
indent=0)
複製代碼
鎖定、隱藏
from openpyxl.styles import Protection
protection = Protection(locked=True, hidden=False)
複製代碼
col = ws.column_dimensions['A']
col.font = Font(bold=True)
row = ws.row_dimensions[1]
row.font = Font(underline="single")
複製代碼
合併的單元格能夠想一想成爲左上角的那個單元格來操做。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
data = [
["Fruit", "Quantity"],
["Kiwi", 3],
["Grape", 15],
["Apple", 3],
["Peach", 3],
["Pomegranate", 3],
["Pear", 3],
["Tangerine", 3],
["Blueberry", 3],
["Mango", 3],
["Watermelon", 3],
["Blackberry", 3],
["Orange", 3],
["Raspberry", 3],
["Banana", 3]
]
for r in data:
ws.append(r)
ws.auto_filter.ref = "A1:B15"
ws.auto_filter.add_filter_column(0, ["Kiwi", "Apple", "Mango"])
ws.auto_filter.add_sort_condition("B2:B15")
wb.save("filtered.xlsx")
複製代碼
生成的Excel表格,有篩選排序的操做,可是沒有實際表現出效果,以下圖:
須要手動點擊 重寫應用
才能顯示出效果,以下圖:
該功能僅能提供一個很基礎的密碼保護,沒有進行加密處理,網上普通的破解軟件均可以破解密碼。不過,平常使用仍是能夠的。
該功能僅可用於新建excel表格,不能用於已存在的excel表格。
防止查看隱藏sheet,避免增長、移動、刪除、隱藏或重命名sheet等操做,能夠保護workbook的結構,以下:
wb.security.workbookPassword = '...'
wb.security.lockStructure = True
複製代碼
worksheet保護不須要密碼,以下:
ws = wb.active
wb.protection.sheet = True
複製代碼
更多詳情請移步 openpyxl package
更多編程教學請關注公衆號:潘高陪你學編程