久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

自動(dòng)化辦公-excel篇 openpyxl的使用詳解_openpyxl.load

 昵稱2548375 2023-12-22 發(fā)布于河北

        本章介紹excel自動(dòng)化辦公——openpyxl庫的使用,。我覺得openpyxl是一款輕量級(jí)的excel操作庫,,適合用于一些基本的操作構(gòu)建,,如果涉及批量處理數(shù)據(jù),如求一整列的最大值最小值等,,無疑是pandas更好,;對(duì)于一些單元格背景填充、單元格合并,、批量創(chuàng)建sheet等的操作,,無疑是openpyxl好,,因?yàn)閜andas無法方便地完成此類操作,。python庫之間的兼容性大,,pandas導(dǎo)出到excel時(shí),,如果沒有安裝openpyxl,將無法完成該操作,??梢哉f,學(xué)好openpyxl庫,,能為以后學(xué)pandas數(shù)據(jù)分析打好良好的基礎(chǔ),。

        必讀:openpyxl 舊庫新庫變化似乎有點(diǎn)大,如果和我的不一樣,,特別是 iter_rows函數(shù),,那么很大可能是因?yàn)槟愕膐penpyxl庫不是最新的。導(dǎo)入庫后可運(yùn)行代碼 print(openpyxl.__version__) 查看其版本,。也可以通過 win +R 輸入cmd,,確認(rèn),打開cmd黑窗后輸入pip install --upgrade openpyxl 去更新庫,。

目錄

1,、新建工作簿workbook及保存

2、創(chuàng)建/新增工作表sheet

3,、移除工作表

4,、讀取現(xiàn)有excel工作簿

5、獲取所有工作表及名稱

6,、獲取活躍工作表

7,、更改工作表名稱

8,、復(fù)制工作表

9、獲取單元格的值

10,、寫入/更改單元格的值

11,、寫入整行數(shù)據(jù)

12、獲取一小塊區(qū)域的內(nèi)容

13,、獲取最小行,、最大行、最小列,、最大列

14,、獲取一整個(gè)sheet的內(nèi)容

15、插入/刪除行列

16,、凍結(jié)單元格

17,、移動(dòng)單元格區(qū)域

18、合并單元格

19,、寫入公式

20,、空值、缺失值判斷

21,、設(shè)置單元格的字體格式

22,、設(shè)置單元格的對(duì)齊方式

23、設(shè)置行高列寬

24,、關(guān)閉文件

結(jié)尾


1,、新建工作簿workbook及保存

openpyxl.Workbook()            新建工作簿。

.save(filename)                      保存工作簿,。filename為保存的路徑,。

  1. import openpyxl
  2. wb = openpyxl.Workbook() # 新建工作簿
  3. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\新建工作簿.xlsx') # 保存

         運(yùn)行后,在目錄下參數(shù)一個(gè)名叫 “新建工作簿” 的excel文件,,因?yàn)闆]有任何內(nèi)容寫入,,所以里面是空的,打開文件,,內(nèi)容如下:

2,、創(chuàng)建/新增工作表sheet

wb.create_sheet(title=None, index=None)         創(chuàng)建/新增工作表。title為工作表的名稱,,index為該工作表的位置,默認(rèn)放在最后,。

        在這先說明一下工作簿和工作表的區(qū)別,,因?yàn)槲覄倢W(xué)也是不知道。工作簿是指這個(gè)excel文件,,而工作表是指這個(gè)excel里的表,。

  1. wb = openpyxl.Workbook() # 新建工作簿
  2. sheet = wb.create_sheet('表1',index=0) # 新建工作表
  3. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\新建工作簿.xlsx') # 保存

        .create_sheet 函數(shù)中,,當(dāng) title不寫時(shí),創(chuàng)建工作表的名字為sheet1,,再建即為sheet2,,依此類推。當(dāng) index不寫時(shí),,默認(rèn)放在最后面,;當(dāng) index為0,即放在最前面,,1即放在第二位,,依此類推。如下為index=0的情況:

        當(dāng)我們需要批量創(chuàng)建2023年1月每天的工作表時(shí),,可以使用for循環(huán)批量生成:

  1. wb = openpyxl.Workbook() # 新建工作簿
  2. for i in range(1,32):
  3. sheet = wb.create_sheet(f'1月{i}日') # 新建工作表,。不能理解的可寫成 '1月'+str(i)+'日'
  4. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx') # 保存

3、移除工作表

        wb.remove(worksheet)                移除工作表,,其中worksheet為工作表對(duì)象,,而非工作表名稱。

  1. wb = openpyxl.Workbook() # 新建工作簿
  2. for i in range(1,32):
  3. sheet = wb.create_sheet(f'1月{i}日') # 新建工作表,。不能理解的可寫成 '1月'+str(i)+'日'
  4. wb.remove(wb['Sheet']) # ,!移除工作表
  5. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx') # 保存

        注意,在創(chuàng)建工作簿的時(shí)候就已經(jīng)自動(dòng)創(chuàng)建了一個(gè)名叫 “Sheet” 的工作表,,首字母是大寫的,。移除工作表時(shí),要先找到工作表對(duì)象 wb['Sheet'],,再把它放進(jìn)remove函數(shù)中進(jìn)行移除,。

        此次創(chuàng)建的工作簿就沒有上圖的 “Sheet” 表了。

4,、讀取現(xiàn)有excel工作簿

        openpyxl.load_workbook(filename, read_only=False, keep_vba=False, data_only=False, guess_types=False, keep_links=True)               讀取excel文件,。

        filename:文件路徑。

        read_only:只讀模式,,默認(rèn)為False,。建議大文件都設(shè)置為True,可以減少很多內(nèi)存的耗用而加快速度,;還有一種可能就是大文件把內(nèi)存占用滿了會(huì)直接報(bào)錯(cuò),,設(shè)置為True則不會(huì)。

        keep_vba:默認(rèn)為False,,即不保留vba代碼,。

        data_only:如果True,只有值,,不包含公式(不保留公式,,把公式最終的值算出來,,把值寫進(jìn)去)

        guess_types:讀取單元格數(shù)據(jù)類型時(shí),啟用或禁用類型推斷,。

        keep_links:如果設(shè)置為True,,則保留外部鏈接。

        我們可以手動(dòng)創(chuàng)建一個(gè)文件然后用代碼去讀取,,或者直接讀取我們上面創(chuàng)建的文件,。以下直接讀取我們上面創(chuàng)建的 "批量創(chuàng)建1月每天的表.xlsx" 文件去演示 讀取工作簿和工作表:

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. sheet = wb['1月1日']
  3. print(sheet.title)

        第一行代碼為讀取文件,其他參數(shù)一般默認(rèn)就好,。第二行是獲取指定工作表,,返回一個(gè)對(duì)象。第三行輸出該工作表的名稱,。openpyxl總體的操作就是,,先讀取文件,后選擇相應(yīng)的sheet表,,然后在表的基礎(chǔ)上進(jìn)行各種操作,。

5、獲取所有工作表及名稱

        ① wb.worksheets           獲取所有工作表,,返回一個(gè)工作表對(duì)象,。可以用 .title去提取其名稱,。

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. all_sheet = wb.worksheets
  3. print(all_sheet)

        all_sheet 輸出了所有的工作表,。但該輸出為一個(gè)對(duì)象,想要選擇表格需要先提取其名稱,,才能放入wb[]中,,否則會(huì)報(bào)錯(cuò)。

  1. one = all_sheet[0]
  2. one_sheet = wb[one.title]
  3. print(one_sheet)
  4. print(type(one_sheet))

        ② wb.sheetnames       獲取所有工作表,,返回一個(gè)工作表名稱,。

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. sn = wb.sheetnames
  3. print(sn)

         該函數(shù)直接返回了所有工作表的名稱。

6,、獲取活躍工作表

        wb.active         獲取活躍工作表,。活躍工作表即在關(guān)閉工作簿的那一刻,,當(dāng)前處于哪個(gè)工作表,,那活躍工作表就是這個(gè)。

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. active = wb.active
  3. print(active.title)

        如果重新打開改工作簿,,把鼠標(biāo)選擇在最后一個(gè)工作表,,隨便點(diǎn)幾個(gè)單元格,然后保存,。那么活躍工作表就是最后一個(gè)工作表了,。它表示的是文件在關(guān)閉前的最后更改的那個(gè)工作表。

7,、更改工作表名稱

        sheet.title = ?           先獲取到該工作表的名稱,,再=?,,以重命名該工作表,。

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. all_sheet = wb.worksheets # 所有工作表
  3. sheet = wb[all_sheet[0].title] # 獲取第一個(gè)工作表對(duì)象
  4. print('改前,該工作表的名稱為:',sheet.title)
  5. sheet.title = '改名稱啦' # 改工作表名稱
  6. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx') # 保存

        改后,,該工作表的名稱為:

        除了直接改名稱,,也可以在原來的名稱上增加字符,如:

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. all_sheet = wb.worksheets # 所有工作表
  3. sheet = wb[all_sheet[0].title] # 獲取第一個(gè)工作表對(duì)象
  4. print('改前,,該工作表的名稱為:',sheet.title)
  5. sheet.title = sheet.title + '改名稱啦' # 在原基礎(chǔ)上增加字符
  6. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表——改工作表名稱.xlsx') # 保存

        重命名還有更多的操作,,待小伙伴自己去研究。

8,、復(fù)制工作表

        wb.copy_worksheet(worksheet)         復(fù)制工作表,。其中worksheet為工作表對(duì)象,而非工作表名稱,,工作表對(duì)象可用 工作簿[工作表名稱] 即 wb['工作表名稱'] 獲取,。

  1. wb = openpyxl.load_workbook(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\批量創(chuàng)建1月每天的表.xlsx')
  2. sheet_1_1 = wb['1月1日'] # 獲取1月1日的工作表,得到的為一個(gè)對(duì)象
  3. new_sheet = wb.copy_worksheet(sheet_1_1) # 復(fù)制1月1日的工作表
  4. new_sheet.title = '復(fù)制' + sheet_1_1.title # 重命名為“復(fù)制”+ 原名
  5. wb.save(r'D:\臨時(shí)\python試驗(yàn)\openpyxl\復(fù)制工作表.xlsx')

        復(fù)制文件到最后(似乎只能復(fù)制到最后,,沒有index可以選擇),。

9、獲取單元格的值

        獲取單元格的有兩種方法:① sheet['單元格'].value   ② sheet.cell(row,column).value

        ① sheet['單元格'].value         獲取該單元格的值,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. F2 = sheet['F2'].value
  4. print(F2)

        ② sheet.cell(row, column, value=None)          獲取第row行,,第column列的單元格。

        row:第幾行,。

        column:第幾列,。

        value:默認(rèn)為None。如果設(shè)置了值,,則該單元格會(huì)被重新賦值為該值,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. B5 = sheet.cell(4,2).value
  4. print(B5)

 

        讀取第4行第2列單元格的值為2300??芍?,該函數(shù)的參數(shù)row和column都是從1開始計(jì)算的。需要記得,,先行后列,,不記得的話也可以以傳參的形式輸入,如:sheet.cell(row=4,column=2).value,。

10,、寫入/更改單元格的值

        ① 當(dāng)sheet.cell(row, column, value=None)函數(shù)傳入value參數(shù)時(shí),,該單元格的值會(huì)被改成value的值,從而更改單元格的值,。如:

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.cell(4,2,value=2222) # 重新賦值,,也可以賦以變量 B = sheet.cell(4,2,value=2222)
  4. B4_2 = sheet.cell(4,2).value
  5. print(B4_2)

 

        ② 直接通過對(duì) sheet.cell(row, column).value 進(jìn)行賦值。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.cell(4,2).value = 1111
  4. B42 = sheet.cell(4,2).value
  5. print(B42)

        兩種方法都可以更改單元格的值,,本人用方法二比較多,,具體要看個(gè)人習(xí)慣。如果需要獲取多個(gè)單元格的值,,可以用 for循環(huán)對(duì) row和 column參數(shù)進(jìn)行賦值獲得,。

        如果需要批量寫入/修改數(shù)據(jù)(一小塊區(qū)域),openpyxl在這方面并不占優(yōu)勢(shì),,需要把每個(gè)單元格逐一遍歷出來,,再進(jìn)行寫入/修改,學(xué)了下面的遍歷/獲取一小塊區(qū)域內(nèi)容,,你就會(huì)有靈感如何逐一遍歷出來再寫入/修改數(shù)據(jù)了,。

11、寫入整行數(shù)據(jù)

再工作中不可能一個(gè)一個(gè)數(shù)據(jù)地寫入,,也為了防止出錯(cuò),,通常以一整行的方式寫入。以一整行形式寫入需要為一個(gè)列表,,直接在sheet里append一個(gè)列表即可,。

  1. import openpyxl
  2. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  3. sheet = wb.create_sheet('sheet2')
  4. lis = ['張三','在家','地址','學(xué)號(hào)','手機(jī)','昵稱']
  5. sheet.append(lis)
  6. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\整行寫入數(shù)據(jù).xlsx")

        需要寫入多行就用 for循環(huán),一次一次地把每行寫入,。

12,、獲取一小塊區(qū)域的內(nèi)容

        獲取小塊區(qū)域單元格的值由兩種方法:① 直接通過[]對(duì)一小塊區(qū)域進(jìn)行提取。② 通過函數(shù)sheet.iter_rows() 或 sheet.iter_cols() 獲得,。

        ① 通過[]獲得

        在講解之前,,我們先看看對(duì)于一小塊區(qū)域,openpyxl是如何逐一提取單元格的值的,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sg = sheet['C2:E6']
  4. print(sg)
  5. print('-'*70)
  6. for row in sg:
  7. print(row)
  8. for i in row:
  9. print(i)

        可見,,對(duì)于一小塊區(qū)域 sg,openpyxl的[]提取法是先將行遍歷出來,,再將該行的單元格一個(gè)一個(gè)按順序的提取的,。如此,我們可以先遍歷每行,,再遍歷該行的每個(gè)單元格去獲得值:

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sg = sheet['C2:E6']
  4. for row in sg:
  5. for cell in row:
  6. print(cell.value)
  7. print('-'*70)

 

          ② sheet.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)

min_row:最小行,。

max_row:最大行。

min_col:最小列。

max_col:最大列,。

values_only:默認(rèn)為False,。如果設(shè)置為True,那么迭代產(chǎn)生的為值而非對(duì)象,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sg = sheet.iter_rows(2,6,3,5,values_only=False)
  4. for row in sg:
  5. print(row)

        這次我們就不把一個(gè)輸出為一行了,,我們把(表格的)一行輸出為(屏幕的)一行,。

        輸出結(jié)果為一個(gè)對(duì)象,,此時(shí)如果需要得到值,可直接用列表生成式 或者 一個(gè)個(gè)再次遍歷出來,,取 .title即可,。而當(dāng)我們?cè)O(shè)置 values_only為True時(shí),輸出結(jié)果為值,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sg = sheet.iter_rows(2,6,3,5,values_only=True)
  4. for row in sg:
  5. print(row)

 

        ③ sheet.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)

min_col:最小列,。

max_col:最大列。

min_row:最小行,。

max_row:最大行,。

values_only:默認(rèn)為False。如果設(shè)置為True,,那么迭代產(chǎn)生的為值而非對(duì)象,。

        該函數(shù)的參數(shù)和上一個(gè)沒有區(qū)別,意思也是一樣,,但是就是參數(shù)的位置不同,。sheet.iter_rows各參數(shù)的順序是最小行、最大行,、最小列,、最大列;而 sheet.iter_cols各參數(shù)的順序是最小列,、最大列,、最小行、最大行,。一句話,,就是iter_rows先行后列,iter_cols先列后行,。這個(gè)對(duì)于位置傳參是非常重要的,,而對(duì)于關(guān)鍵字傳參沒有影響,需要注意,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sg = sheet.iter_cols(2,6,3,5,values_only=True)
  4. for row in sg:
  5. r = [i for i in row]
  6. print(r)

        我們說過,,sheet.iter_cols為先列后行,所以是提取2-6列 3-5行的內(nèi)容。

        如果你的和我的不一樣,,那么很有可能你的openpyxl庫不是最新的,。

13、獲取最小行,、最大行,、最小列、最大列

sheet.min_row:獲取最小行,。

sheet.max_row:獲取最大行,。

sheet.min_column:獲取最小列。

sheet.max_column:獲取最大列,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. print('最小行:',sheet.min_row)
  4. print('最大行:',sheet.max_row)
  5. print('最小列:',sheet.min_column)
  6. print('最大列:',sheet.max_column)

        獲取到最小最大行列后可以更方便地對(duì)區(qū)域進(jìn)行迭代,。如第十一的獲取一小塊內(nèi)容,在不知道最大行列的時(shí)候,,需要取到最大行的情況,,就需要用到了。下面舉一個(gè)例子,,獲取第3行以后的行 第5列以后的列組成的區(qū)域:

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sg = sheet.iter_rows(min_row=3, max_row = sheet.max_row,
  4. min_col=5, max_col = sheet.max_column,
  5. values_only = True)
  6. for row in sg:
  7. r = [i for i in row]
  8. print(r)

14,、獲取一整個(gè)sheet的內(nèi)容

        sheet.values        獲取sheet表中所有值,返回的是一個(gè)可迭代對(duì)象,。如果需要得到值,,可對(duì)該可迭代對(duì)象進(jìn)行列表化處理 list(sheet.values)。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. all_value = list(sheet.values)
  4. print(all_value)

        返回的數(shù)據(jù)依舊是以行存儲(chǔ)的,,即每一行作為一個(gè)整體元素存于列表中,。這意味著可以切片去取對(duì)應(yīng)的行,如取第2-4行:

  1. rows = all_value[1:4]
  2. for row in rows:
  3. print(row)

15,、插入/刪除行列

sheet.insert_rows(idx, amount=1):插入幾行,。

sheet.insert_cols(idx, amount=1):插入幾列。

sheet.delete_rows(idx, amount=1):刪除幾行,。

sheet.delete_cols(idx, amount=1):刪除幾列,。

        ① 插入行

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.insert_rows(3,2) # 在第3行處插入2行
  4. ls_6 = list(sheet.values)[:6]
  5. for row in ls_6:
  6. print(row)
  7. print('-'*70)

        在第3行處插入2行,插入后第3行開始(而不是第4行)為插入的數(shù)據(jù),。插入列為同樣的操作,,這里就不演示了。

        ② 刪除行,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.delete_rows(3,2) # 在第3行處刪除2行
  4. ls_6 = list(sheet.values)[:6]
  5. for row in ls_6:
  6. print(row)
  7. print('-'*70)

        可見,,第3、4行已經(jīng)被刪除(看最左邊的序號(hào),,而不是看rank列),。刪除列也是同樣操作。

16、凍結(jié)單元格

        sheet.freeze_panes = '單元格'

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.freeze_panes = 'E5'
  4. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\凍結(jié)單元格.xlsx")

        凍結(jié)了E5后,,當(dāng)頁面左右上下滑動(dòng)時(shí),,A、B,、C,、D列以及1、2,、3,、4行都不會(huì)動(dòng),方便觀看表頭等,。

        至于如何解凍,,小編也想到過這個(gè)問題,但是沒有找到答案(找到有的說凍結(jié)填A(yù)1的,,或者填None的,但是我試過不太行,,因?yàn)榇蜷_文件會(huì)出現(xiàn)提示需要修復(fù)文件之類的),,等到小編找到答案后,再修改文章,,和大家分享,!也希望知道如何解凍的小伙伴在下方留言,幫助到更多的人,。

17,、移動(dòng)單元格區(qū)域

        sheet.move_range(cell_range, rows=0, cols=0, translate=False)

cell_range:?jiǎn)卧駞^(qū)域。

rows:要向某方向移動(dòng)多少行,,正數(shù)向下,,負(fù)數(shù)向上。

cols:要向某方向移動(dòng)多少列,,正數(shù)向右,,負(fù)數(shù)向左。

translate:翻譯公式,,移動(dòng)中包含公式引用的自動(dòng)轉(zhuǎn)換,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.move_range('D2:E5',5,-3)
  4. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\移動(dòng)區(qū)域.xlsx")

        可全程只看左上角的單元格,如把D2移到了A7,,就是向左移動(dòng)了3列,,向下移動(dòng)了5行。移動(dòng)超出范圍會(huì)報(bào)錯(cuò),。

        如果沒有替換到單元格,,那么很有可能是你的openpyxl庫不是最新的。

18、合并單元格

sheet.merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None)

range_string:要合并的單元格的范圍,。

start_row:左上角單元格的行,。

start_column:左上角單元格的列。

end_row:右下角單元格的行,。

end_column:右下角單元格的列,。

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.merge_cells('D2:F10')
  4. # sheet.merge_cells(start_row=2,start_column=4,end_row=10,end_column=6) # 結(jié)果上面一樣
  5. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\合并單元格.xlsx")

19、寫入公式

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet['L2'].value = '=D2&E2'
  4. # sheet['L2'] = '=D2&E2' # 結(jié)果和上面一樣
  5. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\寫入公式.xlsx")

        寫入公式是直接在''或者""中寫公式即可,。至于代碼中有兩行都可以,,如果不行,試試另一行,,按道理結(jié)果是一樣的(目前兩行的結(jié)果都一樣,,沒遇到過不行的)。公式單元格的讀取也和普通單元格一樣,,具體查看第九點(diǎn)獲取單元格的值,。

        寫入公式也挺有趣的一個(gè)函數(shù),如用于求和的 "=sum(A1:B1)" 等,,更多功能自己去思考產(chǎn)生,,一個(gè)功能的誕生并不是只為了解決一個(gè)問題的,而是經(jīng)過靈活運(yùn)用去解決很多問題,。

        說到這里,,想到了前面第四點(diǎn)讀取excel的一個(gè)點(diǎn):data_only。如果讀取excel時(shí)假如了該參數(shù),,那么原來excel里含有的公式都不是公式了,,變成了一個(gè)值。如上面的L2單元格,,原本意義是 "=D2&E2" ,,但設(shè)置了data_only的讀取模式后,它就只是 "鐘睒睒先生"幾個(gè)字,,不再是一個(gè)公式了,。

20、空值,、缺失值判斷

        這里我們的sheet表的L2單元格的沒有東西的,。輸出L2的值及格式如下:

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. L2 = sheet['L2'].value
  4. print(L2)
  5. print(type(L2))

        這個(gè)NoneType格式是python內(nèi)置的空值的格式,并非字符串,。所以我們可以通過判斷單元格的值是否為None來判斷這個(gè)單元格是否是缺值的,。

  1. if sheet['L2'].value == None:
  2. print('是空值(缺失值)')

        注意這個(gè)None,用于python內(nèi)置缺失值的含義時(shí)是不需要加""的,,如果加了,,那就是判斷該單元格是不是一個(gè)字符串了,,如M2:

  1. if sheet['M2'].value == 'None':
  2. print('M2的值為None')

21、設(shè)置單元格的字體格式

Font(name=None, sz=None, b=None, i=None, charset=None, u=None, strike=None, color=None, scheme=None, family=None, size=None, bold=None, italic=None, strikethrough=None, underline=None, vertAlign=None, outline=None, shadow=None, condense=None, extend=None)

name:字體名稱,。

size:字體大小,。

color:顏色。

bold:加粗,。

italic:斜體,。

underline:下劃線。

        用得最多的是這6個(gè)字體屬性,,其他如果生活中需要的話可以網(wǎng)上馬上搜,,很快的,比在我文章里找快,。

  1. from openpyxl.styles import Font,colors # 導(dǎo)入相關(guān)庫
  2. font_temp = Font(name='Tahoma',size=11,color=colors.BLUE) # 定義字體模板
  3. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  4. sheet = wb['2022年']
  5. sheet['A1'].font = font_temp # 應(yīng)用該字體模板
  6. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\設(shè)置單元格顏色.xlsx")

        給 font屬性賦值 font對(duì)象即可,。如下,對(duì)A1單元格的字體格式進(jìn)行更改:

22,、設(shè)置單元格的對(duì)齊方式

Alignment(horizontal=None, vertical=None, textRotation=0, wrapText=None, shrinkToFit=None, indent=0, relativeIndent=0, justifyLastLine=None, readingOrder=0, text_rotation=None, wrap_text=None, shrink_to_fit=None, mergeCell=None)

        horizontal:橫向(左右)對(duì)齊方式,。可選參數(shù) 'left' , 'centerContinuous' , 'center' , 'distributed' , 'right' , 'fill' , 'general' , 'justify',。

        vertical:豎向(上下)對(duì)齊方式,。可選參數(shù) 'bottom' , 'center' , 'distributed' , 'top' , 'justify',。

        同樣,知道這兩個(gè)就可以了,,其他需要的再搜,。可以這樣記:h是 "橫" 的首字母,,橫向,;v像一個(gè)山溝,很深,,豎向,。

  1. from openpyxl.styles import Alignment # 導(dǎo)入相關(guān)庫
  2. Ali_template = Alignment(horizontal='left',vertical='top') # 定義對(duì)齊方式
  3. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  4. sheet = wb['2022年']
  5. sheet['D1'].alignment = Ali_template # 應(yīng)用對(duì)齊方式
  6. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\設(shè)置對(duì)齊方式.xlsx")

        D1單元格已經(jīng)被左對(duì)齊。

23,、設(shè)置行高列寬

  1. wb = openpyxl.load_workbook(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\2022富豪榜.xlsx")
  2. sheet = wb['2022年']
  3. sheet.row_dimensions[3].height = 55 # 第3行的行高
  4. sheet.column_dimensions['C'].width = 55 # C列的列寬
  5. wb.save(r"D:\臨時(shí)\python試驗(yàn)\openpyxl\設(shè)置行高列寬.xlsx")

        如果想要對(duì)所有行或者列進(jìn)行設(shè)置行高列寬,,可以使用for循環(huán),加上前面所以學(xué)的最大最小行列的獲取等知識(shí),,綜合運(yùn)用,,做出讓自己滿意的表格。

24,、關(guān)閉文件

wb.close()

        關(guān)閉文件可以釋放內(nèi)存,,加快下個(gè)文件的運(yùn)行時(shí)間,。如把一個(gè)sheet表按照班級(jí)拆分成多個(gè)excel文件時(shí),每完成一個(gè)班級(jí)文件就關(guān)閉,,不會(huì)拖延下一個(gè)文件的寫入速度,。

結(jié)尾

        本篇開頭說過openpyxl 的優(yōu)缺點(diǎn),也和pandas作了對(duì)比,,各有春秋,。pandas更偏向于大數(shù)據(jù)的批量處理以及數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等,,在pandas導(dǎo)出到excel之前,,無法對(duì)excel 的格式進(jìn)行設(shè)置,必須先導(dǎo)出為文件,,再用openpyxl 去調(diào)格式,。

        不知各位小伙伴有沒有試過需要把一整列數(shù)據(jù)區(qū)進(jìn)行處理,如改格式,,+某個(gè)數(shù),,條件+值等呢,此類操作對(duì)于openpyxl來說太復(fù)雜,,如果用pandas進(jìn)行處理,,可能就幾行代碼。對(duì)于一個(gè)sheet拆分成多個(gè)sheet時(shí),,openpyxl也是麻煩透頂,,先全部遍歷,把它們?nèi)夸浫胱值?,再一一取值?chuàng)建sheet,,太麻煩啦,一頓操作下來幾十行代碼,,但是對(duì)于pandas來說,,可能都不用10行代碼就完成了。

        大家如果對(duì)pandas感興趣,,大家可以自學(xué)起來了,,這個(gè)庫功能太多太復(fù)雜,需要互相鼓勵(lì),,相互加油,。

        本文excel文件:鏈接:https://pan.baidu.com/s/1vjijcga5xlq2y36H30bFIQ?pwd=vffz 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多