您好,登錄后才能下訂單哦!
python 讀寫 excel 有好多選擇,但是,方便操作的庫不多,在我嘗試了幾個庫之后,我覺得兩個比較方便的庫分別是 xlrd/xlwt、openpyxl。
之所以推薦兩個庫是因為這兩個庫分別操作的是不同版本的 excel,xlrd 操作的是 xls/xlxs 格式的 excel,而 openpyxl 只支持 xlxs 格式的excel,openpyxl 使用起來會更方便一些,所以如果你只操作 xlxs 文件的話,那么可以優(yōu)先選擇 openpyxl,如果要兼容 xls 的話,那就用 xlrd/xlwt 吧。
本處使用openpyxl來實現(xiàn)
pip install openpyxl
如果excel里面有圖片(jpeg, png, bmp,…),需要安裝圖片處理模塊
pip install pillow
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet("Mysheet") #默認最后一個
ws2 = wb.create_sheet("Mysheet", 0) #第一個
wb.save('balances.xlsx')
ws.title = "New Title"
ws['A4']=4 #這將返回A4處的單元格,如果尚不存在,則創(chuàng)建一個單元格。值可以直接分配
ws.cell(row=4, column=2, value=10) # 也可以通過cell來進行寫入,通過行數(shù)和列數(shù)來找到單元格所在的位置,通過value來賦值
可以一次添加多行數(shù)據(jù),從第一行空白行開始(下面都是空白行)寫入。
# 添加一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)
## execl讀
```python
from openpyxl import load_workbook #導入模塊
wb = load_workbook(filename = 'balances.xlsx') #打開文件,默認可讀寫,若有需要可以指定write_only和read_only為True
sheet = wb['test2'] #找到工作表
print(sheet['B4'].value) #輸出內(nèi)容
# B9處寫入平均值
sheet['B9'] = '=AVERAGE(B2:B8)'
但是如果是讀取的時候需要加上data_only=True這樣讀到B9返回的就是數(shù)字,如果不加這個參數(shù),返回的將是公式本身'=AVERAGE(B2:B8)'
print(wb.sheetnames)
for sheet in wb:
print(sheet)
wb["New Title"] #直接獲取名稱為New Title的工作薄
print(sheet.max_row)
print(sheet.max_column)
sheet.rows為生成器, 里面是每一行的數(shù)據(jù),每一行又由一個tuple包裹。
sheet.columns類似,不過里面是每個tuple是每一列的單元格。
# 因為按行,所以返回A1, B1, C1這樣的順序
for row in sheet.rows:
for cell in row:
print(cell.value)
# A1, A2, A3這樣的順序
for column in sheet.columns:
for cell in column:
print(cell.value)
上面的代碼就可以獲得所有單元格的數(shù)據(jù)。如果要獲得某行的數(shù)據(jù)呢?給其一個索引就行了,因為sheet.rows是生成器類型,不能使用索引,轉(zhuǎn)換成list之后再使用索引,list(sheet.rows)[2]這樣就獲取到第三行的tuple對象。
for cell in list(sheet.rows)[2]:
print(cell.value)
如何獲得任意區(qū)間的單元格?
可以使用range函數(shù),下面的寫法,獲得了以A1為左上角,B3為右下角矩形區(qū)域的所有單元格。注意range從1開始的,因為在openpyxl中為了和Excel中的表達方式一致,并不和編程語言的習慣以0表示第一個值。
for i in range(1, 4):
for j in range(1, 3):
print(sheet.cell(row=i, column=j).value)
# out
None
None
None
None
None
None
還可以像使用切片那樣使用。sheet['A1':'B3']返回一個tuple,該元組內(nèi)部還是元組,由每行的單元格構成一個元組
for row_cell in sheet_ranges['A1':'B3']:
for cell in row_cell:
print(cell)
先導入需要的類from openpyxl.styles import Font, colors, Alignment
分別可指定字體相關,顏色,和對齊方式。
bold_itatic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)
sheet['A1'].font = bold_itatic_24_font
也是直接使用cell的屬性aligment,這里指定垂直居中和水平居中。除了center,還可以使用right、left等等參數(shù)。
# 設置B1中的數(shù)據(jù)垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')
設置行高和列寬
有時候數(shù)據(jù)太長顯示不完,就需要拉長拉高單元格。
# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列寬
sheet.column_dimensions['C'].width = 30
所謂合并單元格,即以合并區(qū)域的左上角的那個單元格為基準,覆蓋其他單元格使之稱為一個大的單元格。
相反,拆分單元格后將這個大單元格的值返回到原來的左上角位置。
# 合并單元格, 往左上角寫入數(shù)據(jù)即可
sheet.merge_cells('B1:G1') # 合并一行中的幾個單元格
sheet.merge_cells('A1:C3') # 合并一個矩形區(qū)域中的單元格
合并后只可以往左上角寫入數(shù)據(jù),也就是區(qū)間中:左邊的坐標。
如果這些要合并的單元格都有數(shù)據(jù),只會保留左上角的數(shù)據(jù),其他則丟棄。換句話說若合并前不是在左上角寫入數(shù)據(jù),合并后單元格中不會有數(shù)據(jù)。
以下是拆分單元格的代碼。拆分后,值回到A1位置。
sheet.unmerge_cells('A1:C3')
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。