1. 简介与安装

2.具体示例

2.1 获取workbook与sheet对象

2.2 访问单元格及其值

2.3 写数据

2.4 设置样式

1. 简介与安装

openpyxl 简介

openpyxl 是一款比较综合的工具,不仅能够同时读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持图表插入、打印设置等内容。使用openpyxl可以读写xltm、xltx、xlsm、xlsx等类型的文件,且可以处理数据量较大的Excel文件,跨平台处理大量数据是其它模块没法相比的。因此,openpyxl成为处理Excel复杂问题的首选库函数。

openpyxl 与 xlrd/xlwt 的比较

两者都是对于excel文件操作的模块,其主要区别在于:

  • 写操作:

    • xlwt:针对Ecxec2007之前的版本(.xls),无法生成xlsx文件。
    • openpyxl:主要针对Excel2007之后的版本(.xlsx)。
  • 读写速度:
    • xlrd/xlwt在读写方面的速度都要优于openpyxl。
  • 文件大小:
    • xlrd/xlwt:对单个sheet不超过65535行。
    • openpyxl:对文件大小没有限制。

所以想要尽量提高效率又不影响结果时,可以考虑用 xlrd 读取,用 openpyxl 写入。

 

2.具体示例

具体的使用流程如下:

  1. 导入openpyxl模块;
  2. 调用 openpyxl.load_workbook() 函数或 openpyxl.Workbook(),取得Workbook对象;
  3. 调用 get_active_sheet() 或 get_sheet_by_name() 工作簿方法,取得Worksheet对象;
  4. 使用索引或工作表的 cell() 方法,带上row和column关键字参数,取得Cell对象,读取或编辑Cell对象的value属性。

2.1 获取workbook与sheet对象

创建新文件

 1 from openpyxl import Workbook
2
3 # 创建工作簿对象
4 wb = Workbook()
5
6 # 激活sheet;拿到当前文件对象中默认操作的一个sheet,如上次关闭文件时所打开的sheet
7 ws = wb.active
8 # 表格在被创建的时候会自动的有一个名字。它们被命名在一个队列中(sheet, ...),可以使用title属性在任何时候来改变它们的名字。
9 ws.title = "tmp"
10
11 # 删除sheet
12 wb.remove(ws)
13
14 # 创建sheet
15 ws1 = wb.create_sheet("tmp1") # 默认在最后插入新sheet
16 ws2 = wb.create_sheet("tmp2", 0) # 在索引为0的位置插入
17
18 # 保存文件(覆盖同名文件的全部内容)
19 wb.save("文件名称.xlsx")

打开已有文件

 1 # 打开已有文件
2 from openpyxl import load_workbook
3
4 # 打开指定文件
5 wb = load_workbook("e:\\test.xlsx")
6
7 # 查看所有sheet名
8 print(wb.sheetnames) # 返回列表
9 # 遍历所有sheet名
10 for sheet in wb.sheetnames:
11 print(sheet.title())
12
13 # 选择sheet
14 ws3 = wb["tmp3"] # 方法1:名称可以作为key进行查找
15 ws4 = wb.get_sheet_by_name("tmp4") # 方法2
16 print(ws3 is ws4) # True
17
18 # 在原有内容上进行修改并保存
19 wb.save("e:\\test.xlsx")

2.2 访问单元格及其值

注意:当一个工作表在内存中被创建时,它里面默认是没有表格对象的,它们只有在第一次被访问的时候才会被创建,从而减少内存占用。因为这个特性,我们要循环表格而不是直接访问它们,这样会将所有的表格对象在内存中创建,就算你没有访问它们中的任何一个值。

openpyxl 读写单元格时,单元格的坐标位置起始值是(1,1),即下标最小值为1。

访问单个单元格

 1 # 获取最大行列(返回数值)
2 print(ws3.max_row)
3 print(ws3.max_column)
4
5 # 方法1:指定行列
6 print(ws3["A2"].value)
7
8 # 方法2:指定行列
9 print(ws3.cell(row=2, column=2).value) # 行号和列号从1开始
10
11 # 方法3:只要访问就会创建对应单元格对象
12 for i in range(1, 10):
13 for j in range(1, 10):
14 print(ws4.cell(i, j).value)

行列序号转换

1 from openpyxl.utils import get_column_letter, column_index_from_string
2
3 # 根据列的数字返回字母
4 print(get_column_letter(2)) # B
5 # 根据字母返回列的数字
6 print(column_index_from_string('D')) # 4

访问多个单元格

 1 # 访问指定行数据
2
3 print(ws3[1]) # 方法1:索引从1开始
4 print(ws3[1:3]) # 切片方式,返回二维元组
5 print(tuple(ws3.rows)[1]) # 方法2:索引从0开始,sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹
6 # 遍历获取每个单元格的值
7 for cell in ws3[1]:
8 print(cell.value)
9
10
11 # 访问指定列数据
12
13 print(ws3["A"])
14 print(tuple(ws3.columns)[1]) # 访问第2列单元格
15 print(ws3["A:C"]) # 返回二维元组
16
17
18 # 指定范围
19
20 # 方法1
21 print(ws3["A1:B4"])
22 # 方法2:最多访问两行两列的单元格
23 for row in ws3.iter_rows(min_row=1, max_row=2, max_col=2): # 行号和列号从1开始
24 for cell in row:
25 print(cell)
26 '''执行结果:
27 <Cell 'tmp3'.A1>
28 <Cell 'tmp3'.B1>
29 <Cell 'tmp3'.A2>
30 <Cell 'tmp3'.B2>
31 '''
32
33 for row in ws3.iter_cols(min_row=1, max_row=2, max_col=2): # 行号和列号从1开始
34 for cell in row:
35 print(cell)
36 '''注意与上述iter_rows的获取顺序不同
37 <Cell 'tmp3'.A1>
38 <Cell 'tmp3'.A2>
39 <Cell 'tmp3'.B1>
40 <Cell 'tmp3'.B2>
41 '''

矩阵置换

 1 rows = [
2 ['Number', 'data1', 'data2'],
3 [2, 40, 30],
4 [3, 40, 25],
5 [4, 50, 30],
6 [5, 30, 10],
7 [6, 25, 5],
8 [7, 50, 10]]
9 print(list(zip(*rows))) # 传入二维序列时需要解包
10 '''执行结果:
11 [('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50), ('data2', 30, 25, 30, 10, 5, 10)]
12 '''
13
14 # 注意:该方法会舍弃缺少数据的列(行)
15 a1 = [1, 2]
16 a2 = [4, 5, 6]
17 print(list(zip(a1, a2)))
18 '''执行结果:
19 [(1, 4), (2, 5)]
20 '''

2.3 写数据

写入单元格值

 1 # 写入常规值
2
3 # 方法1
4 ws3["A1"] = 1
5 # 方法2:行号和列号从1开始
6 ws3.cell(row=2, column=2, value="A2")
7 # 方法3:追加一行数据(即最下方空白处的最左第一个单元格开始)
8 ws3.append([1, 2, 3])
9
10
11 # 写时间
12 import time
13
14 # 方法1
15 now_time_1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
16 ws3.cell(row=1, column=1, value=now_time_1)
17
18 # 方法2
19 import locale
20 locale.setlocale(locale.LC_ALL, 'en')
21 locale.setlocale(locale.LC_CTYPE, 'chinese')
22 now_time_2 = time.strftime("%Y年%m月%d日 %H:%M:%S") # 自动传入当前时间
23 ws3.cell(row=1, column=2, value=now_time_2)

合并单元格

合并单元格以合并区域的左上角的那个单元格为基准,覆盖其他单元格,使之称为一个大的单元格。

相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。

1 ws3.merge_cells('A1:B1')  # 合并一行中的几个单元格
2 ws3.merge_cells('B2:C11') # 合并一个矩形区域中的单元格

合并后只可以往左上角写入数据,也就是区间中最左上角的坐标。

如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。换句话说若合并前不是在左上角写入数据,那么合并后的单元格则不会有数据。

拆分单元格

1 ws3.unmerge_cells('A1:B1')  # 拆分后,值回写到A1位置
2 ws3.unmerge_cells('B2:C11') # 拆分后,值回写到B2位置

2.4 设置样式

sheet标签颜色

1 ws3.sheet_properties.tabColor = "1072BA"

效果:

行高与列宽

1 # 第2行行高
2 ws3.row_dimensions[2].height = 40
3 # C列列宽
4 ws3.column_dimensions['C'].width = 30

单元格样式

1 '''字体'''
2 # 等线24号,加粗斜体,字体颜色红色
3 bold_italic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True)
4 # 直接使用cell的font属性,将Font对象赋值给它
5 ws3['A1'].font = bold_italic_24_font
6
7 '''对齐方式'''
8 # 设置B1中的数据垂直居中和水平居中(除了center,还可以使用right、left等参数)
9 ws3['B1'].alignment = Alignment(horizontal='center', vertical='center')

openpyxl 库的更多相关文章

  1. pyinstaller打包程序包含openpyxl库问题解决

    带有openpyxl库时,直接打包,总会失败: 原因:看本地文件...Anaconda3\Lib\site-packages\PyInstaller\hooks\hook-openpyxl.py 发现 ...

  2. openpyxl库实现对excel文档进行编辑(追加写入)

    首先,这个库只支持xlsx格式的excel文件 预期,对”excel_test.xlsx“的A1单元格写入”hello word“ 1.安装”openpyxl“库,pip install openpy ...

  3. 20201207-2 openpyxl 库与模块导入

    1-1 import openpyxl # 通过文件路径,打开工作簿 wb1 = openpyxl.load_workbook('./demo_excel.xlsx') # 用 Workbook() ...

  4. 爬虫入门【9】Python链接Excel操作详解-openpyxl库

    Openpyx是一个用于读写Excel2010各种xlsx/xlsm/xltx/xltm文件的python库. 现在大多数用的都是office2010了,如果之前之前版本的可以使用xlrd读,xlwt ...

  5. python3 使用openpyxl库读写excel(续)

    官网:https://openpyxl.readthedocs.io/en/stable/

  6. python关于openpyxl库的常用使用介绍

    from openpyxl import load_workbook #只能加载已存在的表格 wb=load_workbook("D:\zhijing_work\测试数据\测试文件\yeta ...

  7. 女朋友汇总表格弄了大半天,我实在看不下去了,用40行代码解决问题 | Python使用openpyxl库读写表格Excel(xlsx)

    1.openpyxl基本操作 python程序从excel文件中读数据基本遵循以下步骤: 1.import openpyxl 2.调用openpyxl模块下的load_workbook('你的文件名. ...

  8. 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

    现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法 ...

  9. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

随机推荐

  1. 解决bs4在python中出现“ImportError: cannot import name ‘HTMLParseError‘”错误

    在使用BeautifulSoup4时候出现了ImportError: cannot import name 'HTMLParseError'的错误. 根本原因是BeautifulSoup在4.4.0以 ...

  2. Fastdfs数据迁移方案

    1.     方案背景描述 环境迁移,需要迁移旧环境的fastdfs集群的数据到新环境,由于之前数据迁移仅仅是针对mysql和mongodb,对fastdfs数据的迁移了解甚少,本文档主要是针对fas ...

  3. 异常控制流(csapp)

    [前言]程序按照一定顺序执行称为控制转移.最简单的是平滑流,跳转.调用和返回等指令会造成平滑流的突变.系统也需要能够对系统状态的变化做出反应,这些系统状态不能被内部程序变量捕获但是,操作系统通过使控制 ...

  4. API版本管理中的沟通问题

    转: API版本管理中的沟通问题 产品升级会涉及API的更改,当API改动较大时,最大的问题是如何通知API的使用者(内部人员与使用OPENAPI 的用户),我们不能强迫所有用户立即对API的更改做出 ...

  5. 前端学习 node 快速入门 系列 —— 初步认识 node

    其他章节请看: 前端学习 node 快速入门 系列 初步认识 node node 是什么 node(或者称node.js)是 javaScript(以下简称js) 运行时的一个环境.不是一门语言. 以 ...

  6. 什么是内存对齐,go中内存对齐分析

    内存对齐 什么是内存对齐 为什么需要内存对齐 减少次数 保障原子性 对齐系数 对齐规则 总结 参考 内存对齐 什么是内存对齐 弄明白什么是内存对齐的时候,先来看一个demo type s struct ...

  7. 靶场练习-Sqli-labs通关记录(盲注)

              0x00 实验环境 本地:Win 10 靶场:sqli-labs(共65关,每日一关) 0x02 通关记录 简介:一天一关! (5)第五关: 由于此处与前四关有明显的差别,故在此我 ...

  8. rest framework ViewSet

    ViewSets 路由选择确定要用于一个请求哪个控制器之后,控制器负责做出请求的感并产生相应的输出. - Ruby on Rails的文档 Django的REST框架允许你的逻辑一组在一个类中的相关意 ...

  9. 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  10. PTE准备的时候,用英式英语还是美式英语

    我自己是按照英式英语准备的,因为PTE的题目都是英式拼写,考生在做SWT题目的时候往往会抄原文中的句子或者关键词,不自觉地就将第一个区分点写成英式的,所以后面再用美式的就会被判错. PTE写作的小分中 ...