超詳細(xì)Python處理Excel表格
目錄
一個(gè)Excel電子表格文檔稱為一個(gè)工作簿- 一個(gè)工作簿保存在一個(gè)擴(kuò)展名為.xlsx的文件中- 一個(gè)工作簿可以包含多個(gè)表- 用戶當(dāng)前查看的表(或關(guān)閉Excel前最后查看的表)稱為「活動(dòng)表」- 在特定行和列的方格稱為「單元格、格子」 
「處理Excel表格需要用到openpyxl模塊,該模塊需要手動(dòng)安裝pip install openpyxl」
xls和xlsx
簡(jiǎn)單來說:xls是excel2003及以前版本所生成的文件格式 xlsx是excel2007及以后版本所生成的文件格式 (excel 2007之后版本可以打開上述兩種格式,但是excel2013只能打開xls格式) 進(jìn)一步的詳細(xì)解釋參見:
基本操作
用到的test.xlsx表格 在這里插入圖片描述
1:用openpyxl模塊打開Excel文檔,查看所有sheet表
openpyxl.load_workbook()函數(shù)接受文件名,返回一個(gè)workbook數(shù)據(jù)類型的值。這個(gè)workbook對(duì)象代表這個(gè)Excel文件,這個(gè)有點(diǎn)類似File對(duì)象代表一個(gè)打開的文本文件。
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')?#?返回一個(gè)workbook數(shù)據(jù)類型的值
print(workbook.sheetnames)?#?打印Excel表中的所有表
#?結(jié)果:
#?['Sheet1',?'Sheet2']
2.1:通過sheet名稱獲取表格
在第10行,使用workbook['Sheet1']獲取指定sheet表
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
print(workbook.sheetnames)??#?打印Excel表中的所有表
sheet?=?workbook['Sheet1']??#?獲取指定sheet表
print(sheet)
#?結(jié)果:
#?['Sheet1',?'Sheet2']
#?<Worksheet?"Sheet1">
2.2:獲取活動(dòng)表
使用workbook.active獲取活動(dòng)表
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active?????#?獲取活動(dòng)表
print(sheet)
#?結(jié)果:
#?<Worksheet?"Sheet1">
3.1:獲取表格的尺寸
這里所說的尺寸大小,指的是excel表格中的數(shù)據(jù)有幾行幾列,針對(duì)的是不同的sheet而言 使用sheet.dimensions獲取表格的尺寸 下面打印的A1:B7是什么意思呢?
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook['Sheet1']??#?獲取指定sheet表
print(sheet.dimensions)?????#?獲取表格的尺寸大小
#?結(jié)果:
#?A1:B7
4.1:獲取單元格中的數(shù)據(jù)
「方法1:指定坐標(biāo)的方式」 「sheet[“A1”]」
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active?????#?獲取活動(dòng)表
#?print(sheet.dimensions)?????#?獲取表格的尺寸大小
cell1?=?sheet['A1']?????????#?獲取A1單元格的數(shù)據(jù)
cell2?=?sheet['B7']?????????#?獲取B7單元格的數(shù)據(jù)
#?cell2?=?sheet['B7'].value??#?另一種寫法
#?正確示范
#?cell1.value獲取單元格A1中的值
#?cell2.value獲取單元格B7中的值
print(cell1.value,cell2.value)??#?姓名?18
#?錯(cuò)誤示范
print(cell1,cell2)??#?<Cell?'Sheet1'.A1>?<Cell?'Sheet1'.B7>
「方法2:指定行列的方式」 「sheet.cell(row=, column=)方式」
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active?????#?獲取活動(dòng)表
#?print(sheet.dimensions)?????#?獲取表格的尺寸大小
cell1?=?sheet.cell(row=1,column=1)?????????#?獲取第1行第1列的數(shù)據(jù)
cell2?=?sheet.cell(row=3,column=2)?????????#?獲取第3行第4的數(shù)據(jù)
#?正確示范
#?cell1.value獲取單元格A1中的值
#?cell2.value獲取單元格B7中的值
print(cell1.value,cell2.value)??#?姓名?41
4.2:獲取單元格的行、列、坐標(biāo)
.row獲取某個(gè)格子的行數(shù);-.columns獲取某個(gè)格子的列數(shù);-.coordinate獲取某個(gè)格子的坐標(biāo);
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
#?print(sheet.dimensions)?????#?獲取表格的尺寸大小
cell?=?sheet.cell(row=3,?column=2)??#?獲取第3行第4的數(shù)據(jù)
print(cell.value,?cell.row,?cell.column,?cell.coordinate)
'''
結(jié)果:
41?3?2?B3
'''
5:獲取區(qū)間內(nèi)的數(shù)據(jù)
獲取單行單列數(shù)據(jù)的時(shí)候,使用一層for循環(huán);獲取多行多列、指定區(qū)間的數(shù)據(jù)時(shí),使用兩層for循環(huán)
獲取指定區(qū)間的數(shù)據(jù)
使用 sheet['A1:A5']拿到指定區(qū)間1. 使用兩個(gè)for循環(huán)拿到數(shù)據(jù)
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:')
print(sheet)
cell?=?sheet['A1:A5']??#?獲取A1到A5的數(shù)據(jù)
print(cell)
#?打印A1到A5的數(shù)據(jù)
for?i?in?cell:
????for?j?in?i:
????????print(j.value)
#?結(jié)果:
#?當(dāng)前活動(dòng)表是:
#?<Worksheet?"Sheet1">
#?((<Cell?'Sheet1'.A1>,),?(<Cell?'Sheet1'.A2>,),?(<Cell?'Sheet1'.A3>,),?(<Cell?'Sheet1'.A4>,),?(<Cell?'Sheet1'.A5>,))
#?姓名
#?張三
#?李四
#?王五
#?趙六
獲取指定行列的數(shù)據(jù)
sheet[“A”] — 獲取A列的數(shù)據(jù)- sheet[“A:C”] — 獲取A,B,C三列的數(shù)據(jù)- sheet[5] — 只獲取第5行的數(shù)據(jù) 下面的代碼,獲取一列數(shù)據(jù)的時(shí)候,使用一層for循環(huán)
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
cell?=?sheet['2']??#?獲取第2行的數(shù)據(jù)
#?打印A1到A5的數(shù)據(jù)
for?i?in?cell:
????print(i.value)
#?結(jié)果:
#?當(dāng)前活動(dòng)表是:<Worksheet "Sheet1">
#?張三
#?74
下面代碼,獲取兩列數(shù)據(jù)的時(shí)候,使用兩層for循環(huán)。注意到,兩列的結(jié)果打印到一起了,可讀性較差
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
cell?=?sheet['A:B']??#?獲取AB列的數(shù)據(jù)
#?打印AB列數(shù)據(jù)
for?i?in?cell:
????for?j?in?i:
????????print(j.value)
#?結(jié)果:
#?當(dāng)前活動(dòng)表是:<Worksheet "Sheet1">
#?姓名
#?張三
#?李四
#?王五
#?趙六
#?alice
#?bob
#?年齡
#?74
#?41
#?56
#?12
#?17
#?18
按行、列獲取值
iter_rows():按行讀取 iter_cols():按列讀取
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
#?按行獲取值
print('按行獲取值')
for?i?in?sheet.iter_rows(min_row=2,?max_row=5,?min_col=1,?max_col=2):
????for?j?in?i:
????????print(j.value)
#?按列獲取值
print('按列獲取值')
for?i?in?sheet.iter_cols(min_row=2,?max_row=5,?min_col=1,?max_col=2):
????for?j?in?i:
????????print(j.value)
#?結(jié)果:
#?當(dāng)前活動(dòng)表是:<Worksheet "Sheet1">
#?按行獲取值
#?張三
#?74
#?李四
#?41
#?王五
#?56
#?趙六
#?12
#?按列獲取值
#?張三
#?李四
#?王五
#?趙六
#?74
#?41
#?56
#?12

獲取活動(dòng)表的行列數(shù)
方法1:使用 sheet.max_row 獲取行數(shù) sheet.max_column 獲取列數(shù)
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('2.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
rows?=?sheet.max_row????????#?獲取行數(shù)
column?=?sheet.max_column???#?獲取列數(shù)
print(rows)
print(column)
'''
結(jié)果:
當(dāng)前活動(dòng)表是:<Worksheet "Sheet1">
381
6
'''
方法2:自己寫一個(gè)for循環(huán)
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
row?=?[]
column?=?[]
#?獲取當(dāng)前活動(dòng)表有多少行
for?i?in?sheet.rows:
????row.append(list(i))?????????#?i是元組類型,轉(zhuǎn)為列表
#?獲取當(dāng)前活動(dòng)表有多少列
for?i?in?sheet.columns:
????column.append(list(i))????#?i是元組類型,轉(zhuǎn)為列表
print('行數(shù):'+str(len(row)))
print('列數(shù):'+str(len(column)))
'''
結(jié)果:
當(dāng)前活動(dòng)表是:<Worksheet "1號(hào)sheet">
行數(shù):12
列數(shù):3
'''
操作
創(chuàng)建新的excel
第9行代碼用來指定創(chuàng)建的excel的活動(dòng)表的名字:
不寫第9行,默認(rèn)創(chuàng)建sheet- 寫了第9行,創(chuàng)建指定名字的sheet表
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.Workbook()
sheet?=?workbook.active
sheet.title?=?'1號(hào)sheet'
workbook.save('1.xlsx')
修改單元格、excel另存為
第9行代碼,通過給單元格重新賦值,來修改單元格的值 第9行代碼的另一種寫法sheet['B1'].value = 'age' 第10行代碼,保存時(shí)如果使用原來的(第7行)名字,就直接保存;如果使用了別的名字,就會(huì)另存為一個(gè)新文件
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
sheet['A1']?=?'name'
workbook.save('test.xlsx')

添加數(shù)據(jù)
插入有效數(shù)據(jù)
使用append()方法,在原來數(shù)據(jù)的后面,按行插入數(shù)據(jù)
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
data?=?[
????['素子',23],
????['巴特',24],
????['塔奇克馬',2]
]
for?row?in?data:
????sheet.append(row)???#?使用append插入數(shù)據(jù)
workbook.save('test.xlsx')

插入空行空列
insert_rows(idx=數(shù)字編號(hào), amount=要插入的行數(shù)),插入的行數(shù)是在idx行數(shù)的下方插入- insert_cols(idx=數(shù)字編號(hào), amount=要插入的列數(shù)),插入的位置是在idx列數(shù)的左側(cè)插入
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
sheet.insert_rows(idx=3,?amount=2)
sheet.insert_cols(idx=2,?amount=1)
workbook.save('test.xlsx')

刪除行、列
delete_rows(idx=數(shù)字編號(hào), amount=要?jiǎng)h除的行數(shù))- delete_cols(idx=數(shù)字編號(hào), amount=要?jiǎng)h除的列數(shù))
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
sheet.delete_rows(idx=10)???????????#?刪除第10行
sheet.delete_cols(idx=1,?amount=2)??#?刪除第1列,及往右共2列
workbook.save('test.xlsx')

移動(dòng)指定區(qū)間的單元格(move_range)
move_range(“數(shù)據(jù)區(qū)域”,rows=,cols=):正整數(shù)為向下或向右、負(fù)整數(shù)為向左或向上
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
sheet.move_range('D11:F12',rows=0,cols=-3)??#?移動(dòng)D11到F12構(gòu)成的矩形格子
workbook.save('test.xlsx')

字母列號(hào)與數(shù)字列號(hào)之間的轉(zhuǎn)換
核心代碼
from?openpyxl.utils?import?get_column_letter,?column_index_from_string
#?根據(jù)列的數(shù)字返回字母
print(get_column_letter(2))??#?B
#?根據(jù)字母返回列的數(shù)字
print(column_index_from_string('D'))??#?4
舉個(gè)例子:
import?os
import?openpyxl
from?openpyxl.utils?import?get_column_letter,?column_index_from_string
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('2.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
#?根據(jù)列的數(shù)字返回字母
print(get_column_letter(2))??#?B
#?根據(jù)字母返回列的數(shù)字
print(column_index_from_string('D'))??#?4
字體樣式
查看字體樣式
import?os
import?openpyxl
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'+str(sheet))
cell?=?sheet['A1']
font?=?cell.font
print('當(dāng)前單元格的字體樣式是')
print(font.name,?font.size,?font.bold,?font.italic,?font.color)
'''
當(dāng)前活動(dòng)表是:<Worksheet "1號(hào)sheet">
當(dāng)前單元格的字體樣式是
等線?11.0?False?False?<openpyxl.styles.colors.Color?object>
Parameters:
rgb=None,?indexed=None,?auto=None,?theme=1,?tint=0.0,?type='theme'
'''
修改字體樣式
「openpyxl.styles.Font(name=字體名稱,size=字體大小,bold=是否加粗,italic=是否斜體,color=字體顏色)」 其中,字體顏色中的color是RGB的16進(jìn)制表示
import?os
import?openpyxl
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print(sheet)
cell?=?sheet['A1']
cell.font?=?openpyxl.styles.Font(name="微軟雅黑",?size=20,?bold=True,?italic=True,?color="FF0000")
workbook.save('test.xlsx')

再者,可以使用for循環(huán),修改多行多列的數(shù)據(jù),在介紹了獲取的方法
import?os
import?openpyxl
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print(sheet)
cell?=?sheet['A']
for?i?in?cell:
????i.font?=?openpyxl.styles.Font(name="微軟雅黑",?size=20,?bold=True,?italic=True,?color="FF0000")
workbook.save('test.xlsx')

設(shè)置對(duì)齊格式
Alignment(horizontal=水平對(duì)齊模式,vertical=垂直對(duì)齊模式,text_rotation=旋轉(zhuǎn)角度,wrap_text=是否自動(dòng)換行) 水平對(duì)齊:‘distributed’,‘justify’,‘center’,‘left’, ‘centerContinuous’,'right,‘general’ 垂直對(duì)齊:‘bottom’,‘distributed’,‘justify’,‘center’,‘top’
import?os
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
cell?=?sheet['A1']
alignment?=?openpyxl.styles.Alignment(horizontal="center",?vertical="center",?text_rotation=0,?wrap_text=True)
cell.alignment?=?alignment
workbook.save('test.xlsx')

當(dāng)然,你仍舊可以調(diào)用for循環(huán)來實(shí)現(xiàn)對(duì)多行多列的操作
import?os
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
cell?=?sheet['A']
alignment?=?openpyxl.styles.Alignment(horizontal="center",?vertical="center",?text_rotation=0,?wrap_text=True)
for?i?in?cell:
????i.alignment?=?alignment
????
workbook.save('test.xlsx')

設(shè)置行高列寬
「設(shè)置行列的寬高:」
row_dimensions[行編號(hào)].height = 行高- column_dimensions[列編號(hào)].width = 列寬
import?os
import?openpyxl
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
#?設(shè)置第1行的高度
sheet.row_dimensions[1].height?=?50
#?設(shè)置B列的卷度
sheet.column_dimensions['B'].width?=?20
workbook.save('test.xlsx')

「設(shè)置所有單元格」 (顯示的結(jié)果是設(shè)置所有,有數(shù)據(jù)的單元格的)
from?openpyxl?import?load_workbook
from?openpyxl.utils?import?get_column_letter
import?os
os.chdir(r'C:\Users\asuka\Desktop')
workbook?=?load_workbook('1.xlsx')
print(workbook.sheetnames)??#?打印所有的sheet表
ws?=?workbook[workbook.sheetnames[0]]??#?選中最左側(cè)的sheet表
width?=?2.0??#?設(shè)置寬度
height?=?width?*?(2.2862?/?0.3612)??#?設(shè)置高度
print("row:",?ws.max_row,?"column:",?ws.max_column)??#?打印行數(shù),列數(shù)
for?i?in?range(1,?ws.max_row?+?1):
????ws.row_dimensions[i].height?=?height
for?i?in?range(1,?ws.max_column?+?1):
????ws.column_dimensions[get_column_letter(i)].width?=?width
workbook.save('test.xlsx')

合并、拆分單元格
合并單元格有下面兩種方法,需要注意的是,如果要合并的格子中有數(shù)據(jù),即便python沒有報(bào)錯(cuò),Excel打開的時(shí)候也會(huì)報(bào)錯(cuò)。
merge_cells(待合并的格子編號(hào))- merge_cells(start_row=起始行號(hào),start_column=起始列號(hào),end_row=結(jié)束行號(hào),end_column=結(jié)束列號(hào))
import?os
import?openpyxl
import?openpyxl.styles
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
#?方法1:
sheet.merge_cells('A12:B13')
#?方法2:
sheet.merge_cells(start_row=12,?start_column=3,?end_row=13,?end_column=4)
#?加一個(gè)居中對(duì)齊
cell?=?sheet['A12']
alignment?=?openpyxl.styles.Alignment(horizontal="center",?vertical="center",?text_rotation=0,?wrap_text=True)
cell.alignment?=?alignment
cell?=?sheet['C12']
alignment?=?openpyxl.styles.Alignment(horizontal="center",?vertical="center",?text_rotation=0,?wrap_text=True)
cell.alignment?=?alignment
workbook.save('test.xlsx')

「拆分單元格的方法同上」
unmerge_cells(待合并的格子編號(hào))- unmerge_cells(start_row=起始行號(hào),start_column=起始列號(hào),end_row=結(jié)束行號(hào),end_column=結(jié)束列號(hào))
sheet表
創(chuàng)建新的sheet(create_sheet)
create_sheet(“新的sheet名”):創(chuàng)建一個(gè)新的sheet表
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
workbook.create_sheet('3號(hào)sheet')????#?創(chuàng)建新的sheet表
print(workbook.sheetnames)????#?查看所有的sheet表
workbook.save('test.xlsx')
'''
當(dāng)前活動(dòng)表是:<Worksheet "Sheet1">
['Sheet1',?'Sheet2',?'3號(hào)sheet']
'''

修改sheet名字(title)
第11行,使用title修改sheet表的名字
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
sheet.title?=?'1號(hào)sheet'??#?修改sheet表
workbook.save('test.xlsx')

復(fù)制sheet表(copy_worksheet)
在“操作”>“修改單元格、excel另存為”中提到了另存為,其實(shí)復(fù)制sheet表就是一個(gè)另存為的過程,你要是在12行代碼保存的時(shí)候使用第7行的文件名,那么復(fù)制的sheet表就保存到自己身上,內(nèi)容跟copy.xlsx一樣。
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
workbook.copy_worksheet(sheet)?#?復(fù)制sheet表
workbook.save('copy.xlsx')

刪除sheet表(remove)
remove(“sheet名”):刪除某個(gè)sheet表 要?jiǎng)h除某sheet表,需要激活這個(gè)sheet表,即:將其作為活動(dòng)表(關(guān)于活動(dòng)表的定義請(qǐng)看前面文章開頭寫的有)下面8~11行代碼展示了原始活動(dòng)表與手動(dòng)更換活動(dòng)表,第13行代碼刪掉活動(dòng)表
import?os
import?openpyxl
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)??#?修改工作路徑
workbook?=?openpyxl.load_workbook('test.xlsx')??#?返回一個(gè)workbook數(shù)據(jù)類型的值
sheet?=?workbook.active??#?獲取活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
sheet?=?workbook['3號(hào)sheet']?????#?手動(dòng)切換到要?jiǎng)h除的sheet表,一旦切換,這張表就是活動(dòng)表
print('當(dāng)前活動(dòng)表是:'?+?str(sheet))
workbook.remove(sheet)??#?刪除當(dāng)前活動(dòng)表
print(workbook.sheetnames)
workbook.save('test.xlsx')
'''
當(dāng)前活動(dòng)表是:<Worksheet "Sheet1">
當(dāng)前活動(dòng)表是:<Worksheet "3號(hào)sheet">
['Sheet1',?'Sheet2']
'''

操作多個(gè)Excel表
其實(shí)想用openpyxl玩這個(gè),但是網(wǎng)上用的是別的庫,就有點(diǎn)無語,以后熟練的話在自己寫一個(gè)函數(shù)實(shí)現(xiàn)吧
背景知識(shí)
numpy與pandas
NumPy是 Python 語言的一個(gè)擴(kuò)展程序庫,支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫;pandas 是基于NumPy 的一種工具,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,我們需要利用Pandas進(jìn)行Excel的合并
下面的代碼生成了一個(gè)5行3列的包含15個(gè)字符的嵌套列表 (注意,第4行代碼:15是等于3「5的,如果是15對(duì)應(yīng)4」3,或者16對(duì)應(yīng)5*3都會(huì)報(bào)錯(cuò)) (注意,第5行代碼,雖然5行3列是15個(gè)數(shù)據(jù),但是可以指定數(shù)據(jù)從1開頭,到16結(jié)束)
import?numpy?as?np
import?pandas?as?pd
xx?=?np.arange(15).reshape(5,?3)
yy?=?np.arange(1,?16).reshape(5,?3)
print(xx)
print(yy)
'''
[[?0??1??2]
?[?3??4??5]
?[?6??7??8]
?[?9?10?11]
?[12?13?14]]
[[?1??2??3]
?[?4??5??6]
?[?7??8??9]
?[10?11?12]
?[13?14?15]]
'''
添加表頭 使用pandas庫的DataFrame來添加表頭。關(guān)于打印的結(jié)果,把最左側(cè)的一列去掉之后會(huì)發(fā)現(xiàn)結(jié)果很和諧,這是因?yàn)樽钭髠?cè)的一列代表行號(hào)。此時(shí)xx變量的類型是
import?numpy?as?np
import?pandas?as?pd
xx?=?np.arange(15).reshape(5,?3)
yy?=?np.arange(1,?16).reshape(5,?3)
xx?=?pd.DataFrame(xx,?columns=["語文",?"數(shù)學(xué)",?"外語"])
yy?=?pd.DataFrame(yy,?columns=["語文",?"數(shù)學(xué)",?"外語"])
print(xx)
print(yy)
'''
結(jié)果:
???語文??數(shù)學(xué)??外語
0???0???1???2
1???3???4???5
2???6???7???8
3???9??10??11
4??12??13??14
???語文??數(shù)學(xué)??外語
0???1???2???3
1???4???5???6
2???7???8???9
3??10??11??12
4??13??14??15
'''
合并兩個(gè)矩陣 pd.concat(list)括號(hào)中傳入的是一個(gè)列表;ignore_list=True表示忽略原有索引,重新生成一組新的索引;或者直接可以寫成z = pd.concat([xx,yy],ignore_list=True);不知道為什么失敗,暫時(shí)擱淺
xlsxwriter
xlsxwriter模塊一般是和xlrd模塊搭配使用的, xlsxwriter:負(fù)責(zé)寫入數(shù)據(jù), xlrd:負(fù)責(zé)讀取數(shù)據(jù)。
「創(chuàng)建一個(gè)工作簿」
import?xlsxwriter
import?os
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)
#?這一步相當(dāng)于創(chuàng)建了一個(gè)新的"工作簿";
#?"demo.xlsx"文件不存在,表示新建"工作簿";
#?"demo.xlsx"文件存在,表示新建"工作簿"覆蓋原有的"工作簿";
workbook?=?xlsxwriter.Workbook("demo.xlsx")
# close是將"工作簿"保存關(guān)閉,這一步必須有,否則創(chuàng)建的文件無法顯示出來。
workbook.close()
「創(chuàng)建sheet表」
import?xlsxwriter
import?os
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)
workbook?=?xlsxwriter.Workbook("cc.xlsx")???#?創(chuàng)建一個(gè)名為cc.xlsx的文件
worksheet?=?workbook.add_worksheet("2018年銷售量")??#?創(chuàng)建一個(gè)名為“2018年銷售量”的sheet表
workbook.close()
「寫入數(shù)據(jù)」
import?xlsxwriter
import?os
path?=?r"C:\Users\asuka\Desktop"
os.chdir(path)
#?創(chuàng)建一個(gè)名為【demo.xlsx】工作簿;
workbook?=?xlsxwriter.Workbook("demo.xlsx")
#?創(chuàng)建一個(gè)名為【2018年銷售量】工作表;
worksheet?=?workbook.add_worksheet("2018年銷售量")
#?使用write_row方法,為【2018年銷售量】工作表,添加一個(gè)表頭;
headings?=?['產(chǎn)品',?'銷量',?"單價(jià)"]
worksheet.write_row('A1',?headings)
#?使用write方法,在【2018年銷售量】工作表中插入一條數(shù)據(jù);
# write語法格式:worksheet.write(行,列,數(shù)據(jù))
data?=?["蘋果",?500,?8.9]
for?i?in?range(len(headings)):
????worksheet.write(1,?i,?data[i])
workbook.close()

