python_openpyxl入门教程[Excel操作]

openpyxl入门教程(一)

  1. readme
  • 本帖主要对openpyxl的使用作一入门级的简单说明;
  • 本帖的部分代码,备注等来源于openpyxl.readthedocs.io网站的tutorial;
  • 本帖针对非计算机专业的、因工作岗位需求、需要使用Python脚本处理excel文档的编程小白;
  1. reference
    python官网,可下载python的安装程序:https://www.python.org/downloads/windows/
    openpyxl文档速查:https://openpyxl.readthedocs.io/en/stable/index.html
  2. introduction
    简单介绍下Python背景知识
    2.1 python
    python因其具备上手难度低、开发周期短、代码可读性高、应用面广等优势,目前已被很多行业作为‘计算机辅助脚本语言’用于提高本行业/岗位的作业效率。
    2.2 python version
    python作为一种计算机编程语言,有两个大版本:python2和python3,这两个版本在代码开发的语法、库应用等方面存在些许不同,但大体相差不大;
    其中,python2曾经具备很高的流行度,其最后一个小版本python2.7也是python程序员们最喜欢的一个python版本,但是现在python官方已不再对python2进行维护;
    目前全球的python项目也逐渐迁移至python3,所以我们也直接从python3入手。
    2.3 openpyxl
    openpyxl是一个提供对Excel2010 xlsx/xlsm/xltx/xltm文件进行读写操作的python库,也是本帖介绍的主要对象。
  3. environment deployment
    3.1 安装python
    从官网(www.python.org/downloads/windows/)上下载对应版本的python并安装,选择Python版本的时候注意查看描述,选择适合自己操作系统以及安装方式的,推荐使用安装版(installer):

这里用安装版作示例,下载后,开始安装,注意勾选(Add Python 3.X to PATH),将python解释器等加入环境变量:

安装完成后打开CMD输入python,可返回电脑已安装的python版本:

3.2 安装pip & 利用pip安装openpyxl
pip(package installer for python) 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能;
openpyxl需要使用最新的pip来安装,python3已自带pip,但不见得是最新的,在使用的过程中会提示对pip进行升级:

python -m pip install --upgrade pip

使用pip安装openpyxl:

pip install openpyxl

装好后即可使用openpyxl库。

  1. openpyxl
    Python对于文件操作方面,可以调用自己的一套原生函数接口,但如果只是操作excel文件的话,可以直接使用openpyxl提供的接口;

4.1 create workbook & create sheet
示例代码:

from openpyxl import Workbook
#There is no need to create a file on the filesystem to get started with openpyxl.
#Just import the Workbook class and start work:
def workbook_create():
    wb = Workbook() # get the Workbook obj
    ws = wb.active  # A workbook is always created with at least one worksheet. 
    #You can get it by using the Workbook.active property, grab the active worksheet
    # Data can be assigned directly to cells
    ws['A1'] = 42
    # Rows can also be appended
    ws.append([1, 2, 3])
    # Python types will automatically be converted
    ws['A2'] = "just for test"
    # Save the file
    wb.save("sample.xlsx")
if __name__ =='__main__':
    workbook_create()

代码说明:
Workbook()函数返回了Workbook对象,可调用active属性获取默认的工作表sheet对象;
利用sheet对象,可对表中的数据直接进行修改;
利用Workbook的save函数可保存创建的excel文件。

4.2 insert multiple sheets & small tips
示例代码:

from openpyxl import Workbook
def create_sheet():
    wb = Workbook()
    ws1 = wb.create_sheet("ws1-sheet") # insert at the end (default)
    ws2 = wb.create_sheet("ws2-sheet", 0) # insert at first position
    ws3 = wb.create_sheet("ws3-sheet", -1) # insert at the penultimate position
    ws1.title = "new-ws1-sheet"
 
    ws2.sheet_properties.tabColor = "1072BA"
    ws4 = wb["new-ws1-sheet"]
    ws4['A1'] = 42
    #print
    print(wb.sheetnames)
    for sheet in wb:
        print(sheet.title)
 
    wb.save("exp4.2.xlsx")
if __name__ =='__main__':
    create_sheet()

代码说明:
create_sheet()函数允许在workbook中插入sheet,第二个参数决定插入位置;
可使用sheet的title属性直接对sheet进行重命名;
可对sheet标签的颜色进行设置;
sheet的title和对象构成了键-值对,可通过指定sheet的title返回对应的对象(代码第10行),用于选择sheet;
可通过workbook的sheetnames返回所有sheets的集合;

4.3 data manipulating & cells
示例代码:

from openpyxl import Workbook
def cells_data():
    wb = Workbook()
    ws1 = wb.create_sheet("ws1-sheet")
    wb.save("exp-4.3.xlsx")
    ws1['A1'] = 42
    cell_A1 = ws1['A1']#cell_A1.value = 42   print(cell_A1.value)
    cell_A2 = ws1['A2']
    cell_A2.value = "A2 value"#cell_A2.value = 42  print(cell_A2.value)
    cell_B4 = ws1.cell(row=4, column=2, value=10)#cell_B4.value = 10
    wb.save("exp-4.3.xlsx")
if __name__ =='__main__':
    cells_data()

代码说明:
可通过sheet索引直接返回单元格cell的对象(第7行,第8行);
可通过value属性设置或者读取单元格的值;
sheet对象可通过.cell()函数直接初始化单元格对象的值(第10行)

创建 excel 表格文件

最简单的自动化操作就是创建一个 excel 空白表格文件,暂定文件名为 test.xlsx,然后随意写点什么进去

import openpyxl

workbook = openpyxl.Workbook()
sheet = workbook.active

sheet['A1'] = 'hello pytho excel !'
workbook.save(filename="./test.xlsx")

上面的代码先是导入了库 openpyxl,然后实例化工作簿类 Workbook,通过工作簿的属性 active 获取到活跃的工作表 sheet。

基于字典的操作方式,对工作表 sheet 的 A 列 1 行写入字符串 ‘hello pytho excel !’。如果你使用过 excel 表格,会记得 excel 表格的行是从 1 开始的,列是从 A 开始的。

最后调用工作簿的 save 方法写入硬盘,自动生成文件 test.xlsx。

好了,代码写好怎么跑起来呢?

把上面写好的代码保存到文件(.py)中,我这里随意定为 main.py,然后在令行终端里输入并回车就会执行起来

python main.py

执行完毕后,打开程序创建好的 excel 文件 test.xlsx 看看

看起来效果很好。

写入

上面已经知道了怎么创建新的 excel 表格文件,那么怎么在已有的 excel 表格文件的指定单元格 cell 写入内容呢?

上面介绍的方法 Workbook() 会覆盖原有文件,为了不覆盖现有文件,可以改用方法 load_workbook() 同时传入文件名以加载现有的工作簿。

指定单元格有两种方式,通过表格 sheet 的方法 cell() 或者表格 sheet 直接引用单元格名称。

比如

a2 = sheet.cell(row = 2, column = 1)
a3 = sheet['A3']

找到了单元格 cell,又怎么写入内容呢?直接赋值还是修改属性值?答案是都可以,直接赋值就是对单元格 cell 对象赋值(要求引用单元格名称),修改属性是对单元格 cell 对象的 value 属性赋值

a2.value = "修改属性1"
a3.value = "修改属性2"
sheet['A4'] = "直接赋值"

来一段完整的代码

import openpyxl

workbook = openpyxl.load_workbook("./test.xlsx")
sheet = workbook.active

a2 = sheet.cell(row = 2, column = 1)
a3 = sheet['A3']

a2.value = "修改属性1"
a3.value = "修改属性2"
sheet['A4'] = "直接赋值"

workbook.save(filename="./test.xlsx")

看看运行效果

读取

上面介绍了怎么对 excel 表格写入内容,那么怎么读出来呢?

读取单元格内容,可以直接读取单元格 cell 的属性 value 值

print(f"{sheet['A4'].value}")
print(f"{sheet.cell(row = 4,
                    column = 1).value}")

那么如果需要一次性读取一个区域的数据呢?

方法有两种,一种通过遍历指定区域内每个单元格的方式,另一种是通过单元格名称批量读取。

先介绍第一种:需要遍历每个单元格的内容,那么就需要知道行列的最大数量用于控制单元格循环遍历的次数,分别对应表格 sheet 的属性 max_row 和属性 max_column。

下面来试一下把第一列和第二行的所有单元格内容读取并打印出来

import openpyxl

workbook = openpyxl.load_workbook("test.xlsx") 
sheet = workbook.active 
  
row = sheet.max_row
column = sheet.max_column
print(f"Total Row num: {row}")
print(f"Total Column num: {column}")

print("\nValue of first column:")
for i in range(1, row + 1):
    print(sheet.cell(row = i,
                        column = 1).value)

print("\nValue of second row")
for i in range(1, column + 1):
    print(sheet.cell(row = 2,
                        column = i).value,
            end = " ")

终端输出

接着介绍第二种:通过表格的单元格名称批量读取时,单元格名称分别对应矩形区域的左上角和右下角的单元格名称。这种方式类似对列表的切片操作。

下面来试一下批量读取单元格 A4 到单元格 C6 的矩形区域的内容,并打印出来

import openpyxl

workbook = openpyxl.load_workbook("test.xlsx") 
sheet = workbook.active 

cell_obj = sheet['A5:C6']
for cell1, cell2, cell3 in cell_obj:
    print(cell1.value,
            cell2.value,
            cell3.value)

终端输出