openpyxl
xlrd/xlwt操作03版本之前的Excel文件,openpyxl操作03版本之后的Excel文件。
安裝
方式一
在pycharm下面的命令行中輸入如下代碼:
pip install openpyxl
方式二
在Pycharm的File→Settings...→Project:xxoo→Project Interperter中的
中右上角的+或者雙擊列表框中的任何一個庫名都可以,彈出如下框:
選中openpyxl,然后點擊左下角的Install Package按鈕即可安裝。
注意
如果excel里面有圖片(jpeg,png,bmp。。。),需要安裝圖片處理模塊pillow模塊。
pip install pillow
使用
在使用之前需要先導入模塊openpyxl
from openpyxl import Workbook
寫
在寫之前需要先初始化,也就是先實例化一個對象。
wb = Workbook()
創建一個新的工作簿
ws1 = wb.create_sheet('Mysheet1') # 默認是最后一個 ws2 = wb.create_sheet('Mysheet2', 0) # 第一個
創建完成以后,還需要保存下文件。
wb.save('write.xlsx') # write.xlsx為文件名加文件后綴名
讀
獲取單元格數據
在進行工作簿數據讀取之前,先進行模塊導入
from openpyxl import load_workbook
然后進行實例化,插入需要讀取的表格文件的文件名。打開的文件,默認的是read_only=False,即可讀可寫,若有需要,可以指定read_only為True,即只讀模式。
wb = load_workbook(filename='write.xlsx') # write.xlsx是Excel文件名。
最后選中目標工作簿,進行取值。其中,new_name為工作簿的名字。
sheet = wb['new_name'] print(sheet['B1'].value)
當目標單元格內填充的為公式時,需要指定data_only=True,這樣返回的就是數字,如果不加這個參數,則讀取到的是公式本身。
獲取工作簿名稱
獲取所有工作簿名稱
wb.sheetnames
獲取單個工作簿名稱
for i in sheet in wb: print(sheet)
獲取工作簿
直接獲取名稱為new_name的工作簿。
wb['new_name']
獲取行
獲取最大行數
sheet.max_row
獲取每一行的值
sheet.rows為生成器,里面是每一行的數據,每一行又由一個tuple包裹。
for row in sheet.rows: for cell in row: print(cell.value)
因為是按行,所以返回值的順序為A1、B1、C1。
獲取列
獲取最大列數
sheet.max_column
獲取每一列的值
與sheet.rows類似,不過這里的每一個元組是每一列的單元格的值。
for column in sheet.columns: for cell in column: print(cell.value)
因為按列,所以輸出結果的順序為A1、A2、A3。
獲取任意單元格的值
使用索引獲取單個單元格的值
上面的代碼是獲取所有的單元格的數據,如果要獲得某行的數據,給其一個索引就行了,因為sheet.rows與sheet.columns是生成器類型的,不能使用索引,轉換成list之后在使用索引,list(sheet.rows)[2]這樣就可以獲取到第三行或者列的tuple對象。
for cell in list(sheet.rows)[2]: print(cell.value)
獲取任意區間的單元格
可以使用range函數,上面的寫法,獲得了以A1為左上角,B3為右下角矩形區域的所有的單元格、需要注意的是,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)
還可以使用切片的方式。sheet['A1', 'B2']返回一個元組,該元組內部還是元組,由每一行的單元格構成一個元組。
for row_cell in sheet['A1': 'B3']: for cell in row_cell: print(cell)
改
修改工作簿的名字
ws1 = wb.create_sheet('Mysheet1') ws1.title = 'new_name' print(wb.sheetnames) # 打印所有的工作簿的名字,以列表的形式展現 wb.save('write.xlsx')
修改或設置指定單元格的內容
方式一
設置A4出的單元格的內容,如果需要修改的單元格不存在,則創建該單元格,然后將值寫入。
ws1['A4'] = 4 wb.save('write.xlsx')
方式二
通過cell來進行寫入,通過行數和列數找到單元格,通過value進行賦值。
ws1.cell(row=4, column=2, value=10) wb.save('write.xlsx')
append函數
可以一次添加多行數據,從第一行空白行開始(下面所有的都是空白行)寫入。
將row中的值分別寫入到第一行的單元格中。其中row的值的類型必須是列表、元組、一個范圍(range)、生成器。
row = [1, 2, 3, 4, 5] ws1.append(row) wb.save('write.xlsx')
設置單元格風格
在設置之前需要先導入模塊
from openpyxl.styles import Font, colors, Alignment # 字體、顏色、對齊方式
設置字體樣式
bold_italic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True) sheet['A1'].font = bold_italic_24_font
設置對其方式
居中方式
直接使用屬性aligment,這里指定垂直居中和左右居中。除了center,還可以使用right、left等等參數。
sheet['B1'].aligment = Alignment(horizontal='center', vertical='center')
行高
sheet.row_dimensions[2].height = 40 # 第二行行高
列寬
sheet.column_dimensions['C'].width = 30 # C列列寬
合並和拆分單元格
合並單元格
以合並區域的右上角的那個單元格為基准,覆蓋其他單元格,稱之為一個大單元格。
合並單元格,往左上角單元格寫入數據。如果這些單元格都有數據,則只保存左上角的單元格的數據。
合並一行中的單元格
sheet.merge_cells('B1:G1') # 合並一行中的單元格
合並矩形區域的單元格
sheet.merge_cells('A1:C3')
拆分單元格
將一個大單元格拆分為幾個小單元格。拆分完成后,大單元格中的值回到A1的位置。
sheet.unmerge_cells('A1:C3')