openpyxl快速摸鱼手册

发布于 / 技术 / 0 条评论

最近在工作中一些地方需要生成Excel表格,虽然很简单就查到了这个Python使用的表格库,但是后续使用中还是有很多地方需要单独查找。现在简单记录一下写程序时用到的部分,以便以后查询。

在使用这个模块时,首先要引入模块。我进行了如下方法的引用:

# 引入基础的工作表
from openpyxl import Workbook 
# 引入增强的修改功能
from openpyxl.styles import Font,Alignment,Border,Side,PatternFill,colors
# import openpyxl

在需要用到的地方,首先需要创建一个基本的工作表作为基础,使用下列代码会创建一个名为example.xlsx的空白工作簿,并把这个工作簿保存到Python程序的运行目录:

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    /* TO DO */
    # 保存到设定的addr
    work_book.save(addr)

上述的方法可以创建一个空白的文件,但是每次执行的时候都会覆盖同名文件。接下来,为了生成表格,可以直接对cell对象进行赋值,也可以使用append方法直接添加一个list到新的行中:

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加一整行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    # 保存到设定的addr
    work_book.save(addr)

现在,打开文件你会看见类似下表的数据:

Hello World!
I select this cell
The quick brown foxjumps overa lazy dog.

需要注意的是,append方法会默认选择一条最新的,没有修改过的轨道。我个人认为如果你合并了单元格可能也算在这个范围内。所以为了避免这种烦恼,我比较推荐预留一个空白格并在文档填写完毕后更新格式。下边来合并一个单元格说明为什么需要预留空格:

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加两行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    work_sheet.append(['The quick brown fox',' ',' jumps over ','a lazy dog.'])
    # 合并两个单元格作为示范
    work_sheet.merge_cells('A3:B3')
    work_sheet.merge_cells('A4:B4')
    # 保存到设定的addr
    work_book.save(addr)

现在,我们新建了两行文本,并且合并了单元格作为测试,你打开文档后应该能看到这样的表格:

Hello World!
I select this cell
The quick brown foxa lazy dog.
The quick brown foxjumps overa lazy dog.

使用merge_cells()可以合并单元格,但是相应的,合并单元格后所有的单元格仅保留左上角数据,如果不预留空间的话就会发现表格中的内容直接消失了。

到这一步为止,我们已经可以约略的操作表格的格式了,接下来将要开始修改表格的外观,为了方便后续的理解,首先我们遍历一下现在的表格。可以使用下面的办法来获取表格中的每一个元素:

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加两行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    work_sheet.append(['The quick brown fox',' ',' jumps over ','a lazy dog.'])
    # 合并两个单元格作为示范
    work_sheet.merge_cells('A3:B3')
    work_sheet.merge_cells('A4:B4')
    # 遍历表格,读取表格中的数据
    for row in work_sheet['A1:D4']:
        for cell in row:
            print(cell.value)
    # 保存到设定的addr
    work_book.save(addr)

执行上边的程序,会将表格中每一个cell的数值都打印出来。在此基础上,我们先修改表格的字体,将他修改为“宋体,12号,加粗

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加两行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    work_sheet.append(['The quick brown fox',' ',' jumps over ','a lazy dog.'])
    # 合并两个单元格作为示范
    work_sheet.merge_cells('A3:B3')
    work_sheet.merge_cells('A4:B4')
    # 初始化字体
    SIMSUN_20_BOLD = Font(name='宋体',size=12,bold=True)
    # 遍历表格,读取表格中的数据
    for row in work_sheet['A1:D4']:
        for cell in row:
            cell.font = SIMSUN_20_BOLD
            # print(cell.value)
    # 保存到设定的addr
    work_book.save(addr)

这样就可以设置字体了,之后我们将每个表格的内容都设置为上下居中并给每个表格添加外边框:

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加两行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    work_sheet.append(['The quick brown fox',' ',' jumps over ','a lazy dog.'])
    # 合并两个单元格作为示范
    work_sheet.merge_cells('A3:B3')
    work_sheet.merge_cells('A4:B4')
    # 遍历表格,读取表格中的数据
    # 初始化字体
    SIMSUN_20_BOLD = Font(name='宋体',size=12,bold=True)
    # 初始化表格对齐模板
    CENTER_ALIGN = Alignment(horizontal='center',vertical='center')
    # 初始化表格边框样式
    LE,RI,TO,BO = [Side(style='thin',color='000000')]*4
    THIN_BORDER = Border(left=LE,right=RI,top=TO,bottom=BO)
    # 遍历表格,读取表格中的数据
    for row in work_sheet['A1:D4']:
        for cell in row:
            # 把样式赋值给表格
            cell.font = SIMSUN_20_BOLD
            cell.alignment = CENTER_ALIGN
            cell.border = THIN_BORDER
            # print(cell.value)
    # 保存到设定的addr
    work_book.save(addr)

现在,我们再次输出表格,就能看到表格中所有的数据都被设置成了居中对齐,宋体,12号,加粗,带边框的样式了。

接下来,我们来配置行高和列宽,在这里需要提一下Excel的概念:在Excel中的宽高单位不是采用像素规定的,而是和显示器、字体等有关,所以这个宽高是一个相对概念,而不是绝对概念。在案例中,我们会给AB两列设置为20,C设置为17,D设置为25。1行高15,2行高20,3,4行设为17

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加两行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    work_sheet.append(['The quick brown fox',' ',' jumps over ','a lazy dog.'])
    # 合并两个单元格作为示范
    work_sheet.merge_cells('A3:B3')
    work_sheet.merge_cells('A4:B4')
    # 遍历表格,读取表格中的数据
    # 初始化字体
    SIMSUN_20_BOLD = Font(name='宋体',size=12,bold=True)
    # 初始化表格对齐模板
    CENTER_ALIGN = Alignment(horizontal='center',vertical='center')
    # 初始化表格边框样式
    LE,RI,TO,BO = [Side(style='thin',color='000000')]*4
    THIN_BORDER = Border(left=LE,right=RI,top=TO,bottom=BO)
    # 遍历表格,读取表格中的数据
    for row in work_sheet['A1:D4']:
        for cell in row:
            # 把样式赋值给表格
            cell.font = SIMSUN_20_BOLD
            cell.alignment = CENTER_ALIGN
            cell.border = THIN_BORDER
            # print(cell.value)
    # 设置行高
    work_sheet.row_dimensions[1].height=15
    work_sheet.row_dimensions[2].height=20
    for row_letter in range(3,5,1):
        work_sheet.row_dimensions[row_letter].height=17
    # 设置列宽
    for col_letter in ['A','B']:
        work_sheet.column_dimensions[col_letter].width=20
    work_sheet.column_dimensions['C'].width=17
    work_sheet.column_dimensions['D'].width=25
    # 保存到设定的addr
    work_book.save(addr)

最后,我们给HelloWorld(A1)文字设置为黄色,背景设置为黑色:

def make_example():
    # 设定文件目录
    addr = './example.xlsx'
    # 初始化文件,切换到活动的工作表
    work_book = Workbook()
    # 读取文件采用
    # work_book = openpyxl.load_workbook(addr)
    work_sheet = work_book.active
    # 直接对表格对象赋值
    work_sheet['A1'] = 'Hello World!'
    # 采用指定行列的方法赋值(第2行,第二列)
    select_cell = work_sheet.cell(row=2,column=2,value='I select this cell')
    # 添加两行数据到表格
    work_sheet.append(['The quick brown fox',' jumps over ','a lazy dog.'])
    work_sheet.append(['The quick brown fox',' ',' jumps over ','a lazy dog.'])
    # 合并两个单元格作为示范
    work_sheet.merge_cells('A3:B3')
    work_sheet.merge_cells('A4:B4')
    # 遍历表格,读取表格中的数据
    # 初始化字体
    SIMSUN_20_BOLD = Font(name='宋体',size=12,bold=True)
    # 初始化表格对齐模板
    CENTER_ALIGN = Alignment(horizontal='center',vertical='center')
    # 初始化表格边框样式
    LE,RI,TO,BO = [Side(style='thin',color='000000')]*4
    THIN_BORDER = Border(left=LE,right=RI,top=TO,bottom=BO)
    # 遍历表格,读取表格中的数据
    for row in work_sheet['A1:D4']:
        for cell in row:
            # 把样式赋值给表格
            cell.font = SIMSUN_20_BOLD
            cell.alignment = CENTER_ALIGN
            cell.border = THIN_BORDER
            # print(cell.value)
    # 设置行高
    work_sheet.row_dimensions[1].height=15
    work_sheet.row_dimensions[2].height=20
    for row_letter in range(3,5,1):
        work_sheet.row_dimensions[row_letter].height=17
    # 设置列宽
    for col_letter in ['A','B']:
        work_sheet.column_dimensions[col_letter].width=20
    work_sheet.column_dimensions['C'].width=17
    work_sheet.column_dimensions['D'].width=25
    # 设置颜色
    COLOR_MAP = ['ff9900','000000']
    COLOR_SIMSUN_20_BOLD = Font(name='宋体',size=12,bold=True,color=COLOR_MAP[0])
    BG_FILL = PatternFill('solid', fgColor=COLOR_MAP[1]) 
    work_sheet['A1'].font = COLOR_SIMSUN_20_BOLD
    work_sheet['A1'].fill = BG_FILL
    # 保存到设定的addr
    work_book.save(addr)

当然,如果你完全按照教程复制粘贴的话,现在程序并不能运行,为了让程序可以运行,我们还需要一个很重要的东西。在你的代码下方添加一个主函数:

if __name__ == "__main__":
    make_example()

至此,这个教程就完全结束了,如果您全程按照教程进行的话,最后的文档应该和下边的截图一样:

就是这样!

玩的开心,祝你使用它在工作中更多摸鱼,更多快乐。

记得给我star

本网站在未特殊说明的情况下采用知识共享署名-非商业性使用-相同方式共享 3.0 协议进行许可。
<-数据丢失->