Python-openpyxl操作生成Excel

初识

安装

pip install openpyxl

逻辑

一个excel文档就是一个工作簿 Workbook,每个工作簿对应可以有很多个表格sheet,每个表格页,由单元格组成。openpyxl通过操作这三个层级,完成对excel的操作。

工作簿:

image

表格页:

image

单元格:

image

基本用法

### 创建工作簿 Workbook

#创建一个工作簿对象
workbook = Workbook()
#保存这个工作簿,命名为test
workbook.save('test.xlsx')</pre>

### 打开现有工作簿

from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')</pre>

### 创建表

from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')
#创建一个名字叫sheet的表格
sheet = wb.create_sheet('test.xlsx')
#任何操作都需要保存
workbook.save('test.xlsx')</pre>

### 选择现有的表

from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')
#选择名字为first_sheet的表格页
sheet = workbook['first_sheet']</pre>

### 删除表

from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')
#选择名字为first_sheet的表格页
sheet = workbook['first_sheet']
#删除这张表
workbook.remove(sheet)</pre>

### 访问单元格

#方法1
cell1 = sheet['A1']
#方法2
cell2 = sheet.cell(row=1,column=2)

#设置单元格的值
cell1.value = '123456'

#合并A1和A2单元格
sheet.merge_cells('A1:A2')</pre>

## 高级用法

### 设置表格样式

先设置表格的样式模板

再将模板赋予需要更改样式的单元格

>from openpyxl.styles import *

#先设置表格的样式模板,再将模板赋予需要更改样式的单元格
#设置样式模板,这里只列举一部分常用的样式
#表格边缘线的样式,thin表示有框线,框线颜色为黑色
thin = Side(border_style="thin", color="000000")
#设置表格上下左右都有黑色框线样式
all_border = Border(top=thin, left=thin, right=thin, bottom=thin)
#设置字体样式,设置字体为 微软雅黑,单下划线,颜色为蓝色,字体加粗
yahei_font_u = Font(name=u'微软雅黑',underline='single',color='0000FF',bold=True)
#设置背景颜色,设置充满方式为充满,颜色为黄色
yellow_fill = PatternFill(fill_type='solid',fgColor='FFD700')
#设置字体在表格中的位置,设置字体为上下区中,字符长度超过表格宽度时自动换行
alignment_wrap_content = Alignment(wrap_text=True,horizontal='center',vertical='center')

#设置完成后,改变单元格样式,这样这个单元格的样式就更改为模板的样式了
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

#如果要设置的单元格为合并后的,那么多个单元格样式都要设置</pre>

### 隐藏和折叠

>#隐藏第二行
sheet.row_dimensions[2].hidden=1
#折叠第2行到第5行
sheet.row_dimensions.group(2,5,hidden=True)</pre>

![image](https://upload-images.jianshu.io/upload_images/46858-8a3f7335d325dcd2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "4.png") 

### 设置超链接

>#设置这个单元格的超链接为 跳转到 test工作簿 Sheet表格的 A1单元格
cell.hyperlink = 'test.xlsx#Sheet!A1'</pre>

实战

原始数据

image

转换效果

image
from openpyxl import *
from openpyxl.styles import *

class MakeExcel():

    def __init__(self):
        self.dict = {
        '英雄联盟': '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',
        '疾风之刃': 'https://jf.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '冒险岛2':'https://mxd2.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '天涯明月刀':'https://wuxia.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '御龙在天': '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',
        '斗战神':  '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")

        # 设置表格上下左右都有黑色框线样式
        self.all_border = Border(top=self.thin, left=self.thin, right=self.thin, bottom=self.thin)

        # 设置普通字体样式
        self.yahei_normal = Font(name=u'微软雅黑')

        #设置标题字体样式
        self.yahei_title = Font(name=u'微软雅黑',bold=True)

        # 设置链接字体样式,设置字体为 微软雅黑,单下划线,颜色为蓝色
        self.yahei_u = Font(name=u'微软雅黑', underline='single', color='0000FF')

        # 设置背景颜色,设置充满方式为充满,颜色为黄色
        self.yellow_fill = PatternFill(fill_type='solid', fgColor='FFD700')

        # 设置字体在表格中的位置,设置字体为上下区中,字符长度超过表格宽度时自动换行
        self.alignment_wrap = Alignment(wrap_text=True, horizontal='center', vertical='center')

    #设置表格样式,根据传入的样式设置传入的单元格对象的样式
    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
        #标题单元格样式
        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):
        #创建一个工作簿,选用Sheet这张表
        workbook = Workbook()
        sheet = workbook['Sheet']

        #设置标题的名称
        cell1 = sheet['A1']
        cell2 = sheet['B1']
        cell1.value = '名称'
        cell2.value = '地址'

        #设置列框
        sheet.column_dimensions['A'].width = 20.0
        sheet.column_dimensions['B'].width = 100.0

        #设置标题样式
        self.make_cell_style(cell1, 'title')
        self.make_cell_style(cell2, 'title')

        #设置游戏和地址的样式
        cur_row = 2
        for key in self.dict.keys():

            #设置名称和地址的值
            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]
            #设置地址超链接
            temp_cell_B.hyperlink = self.dict[key]
            #设置名称和地址的样式
            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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容