Python-openpyxl操作生成Excel初識(shí)安裝 pip install openpyxl
邏輯 一個(gè)excel文檔就是一個(gè)工作簿 Workbook,每個(gè)工作簿對(duì)應(yīng)可以有很多個(gè)表格sheet,每個(gè)表格頁,由單元格組成。openpyxl通過操作這三個(gè)層級(jí),完成對(duì)excel的操作。 工作簿: 
表格頁: 
單元格: 
基本用法創(chuàng)建工作簿 Workbookfrom openpyxl import Workbook
#創(chuàng)建一個(gè)工作簿對(duì)象 workbook = Workbook() #保存這個(gè)工作簿,命名為test workbook.save('test.xlsx') 打開現(xiàn)有工作簿from openpyxl import load_workbook #打開當(dāng)前路徑下的test表格 workbook = load_workbook('test.xlsx') 創(chuàng)建表from openpyxl import load_workbook #打開當(dāng)前路徑下的test表格 workbook = load_workbook('test.xlsx') #創(chuàng)建一個(gè)名字叫sheet的表格 sheet = wb.create_sheet('test.xlsx') #任何操作都需要保存 workbook.save('test.xlsx') 選擇現(xiàn)有的表from openpyxl import load_workbook #打開當(dāng)前路徑下的test表格 workbook = load_workbook('test.xlsx') #選擇名字為first_sheet的表格頁 sheet = workbook['first_sheet'] 刪除表from openpyxl import load_workbook #打開當(dāng)前路徑下的test表格 workbook = load_workbook('test.xlsx') #選擇名字為first_sheet的表格頁 sheet = workbook['first_sheet'] #刪除這張表 workbook.remove(sheet) 訪問單元格#方法1 cell1 = sheet['A1'] #方法2 cell2 = sheet.cell(row=1,column=2)
#設(shè)置單元格的值 cell1.value = '123456'
#合并A1和A2單元格 sheet.merge_cells('A1:A2') 高級(jí)用法設(shè)置表格樣式先設(shè)置表格的樣式模板 再將模板賦予需要更改樣式的單元格 from openpyxl.styles import *
#先設(shè)置表格的樣式模板,再將模板賦予需要更改樣式的單元格 #設(shè)置樣式模板,這里只列舉一部分常用的樣式 #表格邊緣線的樣式,thin表示有框線,框線顏色為黑色 thin = Side(border_style='thin', color='000000') #設(shè)置表格上下左右都有黑色框線樣式 all_border = Border(top=thin, left=thin, right=thin, bottom=thin) #設(shè)置字體樣式,設(shè)置字體為 微軟雅黑,單下劃線,顏色為藍(lán)色,字體加粗 yahei_font_u = Font(name=u'微軟雅黑',underline='single',color='0000FF',bold=True) #設(shè)置背景顏色,設(shè)置充滿方式為充滿,顏色為黃色 yellow_fill = PatternFill(fill_type='solid',fgColor='FFD700') #設(shè)置字體在表格中的位置,設(shè)置字體為上下區(qū)中,字符長度超過表格寬度時(shí)自動(dòng)換行 alignment_wrap_content = Alignment(wrap_text=True,horizontal='center',vertical='center')
#設(shè)置完成后,改變單元格樣式,這樣這個(gè)單元格的樣式就更改為模板的樣式了 cell = sheet.row(row=1,column=2) cell.fill = self.yellow_fill cell.font = self.yahei_font_u cell.border = self.all_border cell.alignment = self.alignment_wrap_content
#如果要設(shè)置的單元格為合并后的,那么多個(gè)單元格樣式都要設(shè)置 隱藏和折疊#隱藏第二行 sheet.row_dimensions[2].hidden=1 #折疊第2行到第5行 sheet.row_dimensions.group(2,5,hidden=True) 
設(shè)置超鏈接#設(shè)置這個(gè)單元格的超鏈接為 跳轉(zhuǎn)到 test工作簿 Sheet表格的 A1單元格 cell.hyperlink = 'test.xlsx#Sheet!A1' 實(shí)戰(zhàn)原始數(shù)據(jù) 
轉(zhuǎn)換效果 
from openpyxl import * from openpyxl.styles import *
class MakeExcel():
def __init__(self): self.dict = { '英雄聯(lián)盟': 'https://lol.qq.com/main.shtml', '地下城與勇士': 'https://dnf.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '使命召喚Online': 'https://codol.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '疾風(fēng)之刃': 'https://jf.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '冒險(xiǎn)島2':'https://mxd2.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '天涯明月刀':'https://wuxia.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '御龍?jiān)谔?: 'https://yl.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '劍靈': 'https://bns.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '流放之路': 'https://poe.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '軒轅傳奇2': 'https://xy2.qq.com/?ADTAG=media.innerenter.gamecom.navigation', '斗戰(zhàn)神': 'https://dzs.qq.com/?ADTAG=media.innerenter.gamecom.navigation', 'QQ三國': 'https://sg.qq.com/web201706/index.shtml?ADTAG=media.innerenter.gamecom.navigation', } self.excel_template() self.make()
#表格樣式模板 def excel_template(self):
# 表格邊緣線的樣式,thin表示有框線,框線顏色為黑色 self.thin = Side(border_style='thin', color='000000')
# 設(shè)置表格上下左右都有黑色框線樣式 self.all_border = Border(top=self.thin, left=self.thin, right=self.thin, bottom=self.thin)
# 設(shè)置普通字體樣式 self.yahei_normal = Font(name=u'微軟雅黑')
#設(shè)置標(biāo)題字體樣式 self.yahei_title = Font(name=u'微軟雅黑',bold=True)
# 設(shè)置鏈接字體樣式,設(shè)置字體為 微軟雅黑,單下劃線,顏色為藍(lán)色 self.yahei_u = Font(name=u'微軟雅黑', underline='single', color='0000FF')
# 設(shè)置背景顏色,設(shè)置充滿方式為充滿,顏色為黃色 self.yellow_fill = PatternFill(fill_type='solid', fgColor='FFD700')
# 設(shè)置字體在表格中的位置,設(shè)置字體為上下區(qū)中,字符長度超過表格寬度時(shí)自動(dòng)換行 self.alignment_wrap = Alignment(wrap_text=True, horizontal='center', vertical='center')
#設(shè)置表格樣式,根據(jù)傳入的樣式設(shè)置傳入的單元格對(duì)象的樣式 def make_cell_style(self,cell,style):
#普通單元格樣式 if style == 'normal': cell.font = self.yahei_normal cell.border = self.all_border cell.alignment = self.alignment_wrap #標(biāo)題單元格樣式 elif style == 'title': cell.fill = self.yellow_fill cell.font = self.yahei_title cell.border = self.all_border cell.alignment = self.alignment_wrap #地址單元格樣式 elif style == 'addr': cell.font = self.yahei_u cell.border = self.all_border cell.alignment = self.alignment_wrap
#生成表格 def make(self): #創(chuàng)建一個(gè)工作簿,選用Sheet這張表 workbook = Workbook() sheet = workbook['Sheet']
#設(shè)置標(biāo)題的名稱 cell1 = sheet['A1'] cell2 = sheet['B1'] cell1.value = '名稱' cell2.value = '地址'
#設(shè)置列框 sheet.column_dimensions['A'].width = 20.0 sheet.column_dimensions['B'].width = 100.0
#設(shè)置標(biāo)題樣式 self.make_cell_style(cell1, 'title') self.make_cell_style(cell2, 'title')
#設(shè)置游戲和地址的樣式 cur_row = 2 for key in self.dict.keys():
#設(shè)置名稱和地址的值 temp_cell_A = sheet.cell(row=cur_row, column=1) temp_cell_B = sheet.cell(row=cur_row, column=2) temp_cell_A.value = key temp_cell_B.value = self.dict[key] #設(shè)置地址超鏈接 temp_cell_B.hyperlink = self.dict[key] #設(shè)置名稱和地址的樣式 self.make_cell_style(temp_cell_A, 'normal') self.make_cell_style(temp_cell_B, 'addr') cur_row = cur_row + 1
#從第六行開始折疊 sheet.row_dimensions.group(6, cur_row, hidden=True) workbook.save('游戲.xlsx')
MakeExcel()
|