Python 3.X 模块openpyxl学习和使用—安装和基本使用

前言

openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.

It was born from lack of existing library to read/write natively from Python the Office Open XML format.

All kudos to the PHPExcel team as openpyxl was initially based on PHPExcel.

这是一个第三方库,可以处理xlsx格式的Excel文件。pip install openpyxl安装。或者在官网直接下载源码进行安装。注意该模块支持的excel文件版本,如果是老版本文件可以使用其他的模块,或者将文件转换成新版本。

另注:本次操作环境都是在Windows Server 2012 系统下进行的,所有命令都使用了绝对路径,如果是在linux环境下执行的话,由于有环境变量所以不用绝对路径也可以执行。
使用python版本:3.7

安装

pip 安装方式

pip安装直接使用对应版本的pip进行安装即可,pip install openpyxl 安装即可。比较简单这里不再赘述。

pip 卸载:

源码安装

python 官网直接下载对应的源码安装包,不过源码安装时,首次安装是会存在报错的,需要先安装依赖,也是使用源码安装就可以了。

源码下载地址:

https://pypi.org/project/openpyxl/#files

下载软件到本地,解压到当前目录,进入目录中可看到setup.py文件:

使用 python setup.py install 进行安装,
另注:本次操作环境都是在Windows Server 2012 系统下进行的,所有命令都使用了绝对路径,如果是在linux环境下执行的话,由于有环境变量所以不用绝对路径也可以执行。

由于之前安装过所以已经安装了相关依赖,所以本次源码安装直接成功:

如果安装失败的话,检查是否有安装依赖,依赖包是:et_xmlfile 、jdcal
源码安装方式和上面操作是一样的。

官网下载链接:
https://pypi.org/project/jdcal/
https://pypi.org/project/et_xmlfile/

IDE内直接安装(PyCharm)

其他软件也可以参照此方法

注:其他Python模块也都可以参照该方法。

模块openpyxl的基本使用

直接上代码:

import openpyxl
import datetime

# 实例化对象excel对象
excel_obj = openpyxl.Workbook()

# excel 内当前活跃的sheet工作表
excel_obj_sheet = excel_obj.active
# 给单元格赋值
excel_obj_sheet['A1'] = 4
excel_obj_sheet.append([1, 2, 3])
excel_obj_sheet['A3'] = datetime.datetime.now()

# 文件保存
excel_obj.save('sample.xlsx')


运行后,文件内容:

由于模块和python都在不断更新,往往在新版本中会抛弃一些老版本的方法:

#coding=utf-8

import openpyxl
from openpyxl import Workbook

# 默认可读写,若有需要可以指定write_only和read_only为True
# 新建Excel表格
wb = Workbook('new_excel.xlsx')
# 加载本地已有文件
wb2 = openpyxl.load_workbook('excel.xlsx')

# 获取所有sheet的名称
# 老版openpyxl支持方法,新版建议直接使用属性sheetnames
# print(wb.get_sheet_names())
# print(wb2.get_sheet_names())
print('sheetnames')
print(wb.sheetnames)
print(wb2.sheetnames)

# 根据sheet名字获得sheet
# 老版办法,建议使用新版本方法
# a_sheet = wb2.get_sheet_by_name('Sheet1')
a_sheet = wb2['Sheet1']
# 获取sheet的标题
print(a_sheet.title)

# 获取当前显示的sheet页,两种方式都可以
sheet = wb2.active
# sheet = wb2.get_active_sheet

# 获取单元格
a4 = sheet['A4']
print('(%s,%s) is %s.' % (a4.column, a4.row, a4.value))

# 获得最大列和最大行
print('获得最大列和最大行')
print(sheet.max_column)
print(sheet.max_row)

# 获取行和列
# sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
# sheet.columns类似,不过里面是每个tuple是每一列的单元格。

# 因为按行,所以返回A1, B1, C1这样的顺序
for row in sheet.rows:
    for cell in row:
        print('(%s,%s) is %s.' % (cell.column, cell.row, cell.value))

print('================')
# A1, A2, A3这样的顺序
for column in sheet.columns:
    for cell in column:
        print('(%s,%s) is %s.' % (cell.column, cell.row, cell.value))

# 上面的代码就可以获得所有单元格的数据。如果要获得某行的数据呢?给其一个索引就行了,因为sheet.rows是生成器类型,不能使用索引,转换成list之后再使用索引,list(sheet.rows)[2]这样就获取到第三行的tuple对象。
print('================')
for cell in list(sheet.rows)[2]:
    print('(%s,%s) is %s.' % (cell.column, cell.row, cell.value))

# 如何获得任意区间的单元格?
#
# 可以使用range函数,下面的写法,获得了以A1为左上角,B3为右下角矩形区域的所有单元格。注意range从1开始的,因为在openpyxl中为了和Excel中的表达方式一致,并不和编程语言的习惯以0表示第一个值。

for i in range(1, 4):
    for j in range(1, 3):
        print(sheet.cell(row=i, column=j))

# 还可以像使用切片那样使用。sheet['A1':'B3']
# 返回一个tuple,该元组内部还是元组,由每行的单元格构成一个元组。

for row_cell in sheet['A1':'B3']:
    for cell in row_cell:
        print(cell)

for cell in sheet['A1':'B3']:
    print(cell)

# 根据字母获得列号,根据列号返回字母
# 需要导入, 这两个函数存在于openpyxl.utils

from openpyxl.utils import get_column_letter, column_index_from_string

# 根据列的数字返回字母
print(get_column_letter(2))  # B
# 根据字母返回列的数字
print(column_index_from_string('D'))  # 4

本代码的执行结果就不贴出来,由于太多了,大家可以自己找几个文件随便进行测试。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐