• 用Python操作excel文档


    使用Python第三方库

    这一节我们学习如何使用Python去操作Excel文档。如果大家有人不知道Excel的话,那么建议先学一学office办公基础。这里想要操作Excel,必须安装一个Python第三方库。

    有人可能会疑问,第三方库是什么?其实第三方库就是非Python官方提供的库,也就是民间好心人开发出来的开源库,供大家免费使用。那这里肯定又有人会疑问,库是什么呢?我们前面已经知道了Python模块,其实库就是一个或多个相关连的Python模块合在一起,这样说很容易理解吧。通常Python中的所谓库,其实就是一个文件夹,这个文件夹中放了几个Python模块,而一个Python源代码文件就是一个模块。

    安装

    第三方库和Python的标准库不同,它需要我们手动去安装,不安装是没法使用的。这里简要说一下如何安装Python第三方库。通常一些书籍或网络博客中,推荐使用pip命令去自动下载安装第三方库,但是前提是需要我们将pip配置到环境变量中。这样去使用存在一些问题,当我们电脑装了多个Python版本时,极容易造成pip环境混乱。我在这里介绍一个小技巧,不需要去配置pip到环境变量中,且不会造成环境混乱。当我们需要使用pip命令时,在它前面加上python -m去使用,如下

    1python -m pip install 第三方库名称

    好了,今天我们要使用的第三方库叫做openpyxl,大家一定要记住这个库名字哦,按照我们上面学习的公式,打开WIndows上面的cmd命令行,输入如下命令安装

    1python -m pip install openpyxl

    如果大家的网络不好,就需要耐心等待,安装完成之后,命令行中会看到如下内容

    1Successfully installed et-xmlfile-1.0.1 jdcal-1.4 openpyxl-2.6.0

    如果大家的命令行中出现以下内容
    You should consider upgrading via the 'python -m pip install --upgrade pip' command

    则按照英文提示,先输入python -m pip install --upgrade pip执行一下,这个命令是升级我们的pip版本的,升级成功后,再去执行python -m pip install openpyxl

    使用

    实际上Excel文档也是一个文件,它虽然不是我们之前学的纯文本文件,但它也是文件,脱离不了文件的读与写两种操作。

    先让我们认识一下Excel的一些概念,有助于我们理解代码,这里主要是三个概念,行、列和Sheet表。如下图


    当我们选中第一行的第A列小格子时,可以看到上面的显示框中显示的是A1,再次选中第二行的第A列小格子时,则会显示A2,由此我们即可掌握规律,Excel中的行列坐标,是使用列号+行号的方式定位。

    写Excel文档

     1import openpyxl as exl
    2
    3# 创建一个工作簿对象
    4wb = exl.Workbook()
    5
    6# 获取一个激活的sheet表,相当于获取第一个Sheet表
    7sheet = wb.active
    8# 给sheet表取一个名字
    9sheet.title = '一班'
    10
    11sheet['A1'] = '学号'
    12sheet['B1'] = '姓名'
    13sheet['C1'] = '语文'
    14sheet['D1'] = '数学'
    15sheet['E1'] = '英语'
    16
    17sheet['A2'] = '201901'
    18sheet['B2'] = '王五'
    19sheet['C2'] = 81.5
    20sheet['D2'] = 90
    21sheet['E2'] = 85
    22
    23wb.save('test.xlsx')

    运行如上代码后,我们可以看到代码当前目录下生成了一个test.xlsx的Excel文档。

    可以看到,我们通过几行简单代码就创建了一个Excel文档。当然,上述代码中,我们是纯手动的去填表的,如果我们的表有1000行,我们不可能这样手写代码填入信息,因此我们应当借助循环去完成这种枯燥的事情,还记得我们前面学过的章节吗,循环是重复的艺术。

     1# 导入我们已安装的第三方库openpyxl
    2import openpyxl as exl
    3
    4# 创建一个存放数据的列表,该列表中元素也是一个列表,每一个元素代码一行数据
    5data = [
    6    ['学号', '姓名', '语文', '数学', '英语'],
    7    ['201901', '张三', 90, 68.5, 95],
    8    ['201902', '李四', 50, 71, 83],
    9    ['201903', '王五', 73, 91, 69],
    10    ['201904', '赵六', 85.6, 36, 77],
    11]
    12
    13
    14# 定义一个函数,用于写入一行数据,参数i用于Excel中的行号,参数row是一个列表,存放的是一行数据
    15def write_row(i, row):
    16    # 获取全局变量sheet
    17    global sheet
    18    # 字符串使用 “+”连接符进行拼接。这里变量i必须是字符串,只有字符串才能和字符串拼接
    19    sheet['A' + i] = row[0]
    20    sheet['B' + i] = row[1]
    21    sheet['C' + i] = row[2]
    22    sheet['D' + i] = row[3]
    23    sheet['E' + i] = row[4]
    24
    25
    26# 创建一个工作簿对象
    27wb = exl.Workbook()
    28
    29# 创建一个激活的sheet表
    30sheet = wb.active
    31# 给sheet表取一个名字
    32sheet.title = '一班'
    33
    34for index, line in enumerate(data):
    35    print(index, line)
    36    # Excel中行号从1开始,而列表的序号是从0开始,因此要加1,并将该整数转换为字符串变量
    37    write_row(str(index + 1), line)
    38
    39wb.save('test.xlsx')

    特别注意
    大家在用Python操作Excel时,请务必将相应的文档关闭。如果你操作的文档已经被打开了,那么代码运行是会报错退出的。如遇报错,请检查是否关闭了Excel文档 。

    以上代码比较简单,只有一个新知识点需要说明一下,我们以前也使用for循环去遍历列表,这里和以往不同的地方在于我们在in之后调用了一个enumerate函数,该函数的作用是可以返回两个参数,第一个参数是返回元素在列表中的索引,即序号,第二个参数才是元素的内容,即元素的值。
    大家如果对这个用法不熟悉,可以稍加练习一下

    1infos = ["Python", "Java", "C", "C++", "Go"]
    2for i, item in enumerate(infos):
    3    print(i, item)

    输出结果

    10 Python
    21 Java
    32 C
    43 C++
    54 Go

    美化

    这里简单说一下关于美化的问题,我们的Excel表格没有加边框,看起来没有主次感觉,我们可以添加一点代码美化一下

     1import openpyxl as exl
    2# 导入openpyxl库的styles模块
    3import openpyxl.styles as sl
    4
    5# 创建一个存放数据的列表,该列表中元素也是一个列表,每一个元素代码一行数据
    6data = [
    7    ['学号', '姓名', '语文', '数学', '英语'],
    8    ['201901', '张三', 90, 68.5, 95],
    9    ['201902', '李四', 50, 71, 83],
    10    ['201903', '王五', 73, 91, 69],
    11    ['201904', '赵六', 85.6, 36, 77],
    12]
    13
    14
    15# 定义一个函数,用于写入一行数据
    16def write_row(i, row):
    17    # 获取全局变量sheet, align, side, border
    18    global sheet, align, side, border
    19    sheet['A' + i] = row[0]
    20    sheet['A' + i].border = border
    21    sheet['A' + i].alignment = align
    22
    23    sheet['B' + i] = row[1]
    24    sheet['B' + i].border = border
    25    sheet['B' + i].alignment = align
    26
    27    sheet['C' + i] = row[2]
    28    sheet['C' + i].border = border
    29    sheet['C' + i].alignment = align
    30
    31    sheet['D' + i] = row[3]
    32    sheet['D' + i].border = border
    33    sheet['D' + i].alignment = align
    34
    35    sheet['E' + i] = row[4]
    36    sheet['E' + i].border = border
    37    sheet['E' + i].alignment = align
    38
    39
    40# 创建一个工作簿对象
    41wb = exl.Workbook()
    42
    43# 创建一个激活的sheet表
    44sheet = wb.active
    45# 给sheet表取一个名字
    46sheet.title = '一班'
    47
    48# 设置单元格文本对齐方式,这里设置横向和水平都居中
    49align = sl.Alignment(horizontal='center', vertical='center', wrap_text=True)
    50
    51# 设置边框线的样式和颜色
    52side = sl.Side(border_style='thin', color='FF000000')
    53
    54# 设置单元格的上下左右四个方向都加边框线
    55border = sl.Border(left=side, right=side, top=side, bottom=side)
    56
    57for index, line in enumerate(data):
    58    print(index, line)
    59    write_row(str(index + 1), line)
    60
    61wb.save('test.xlsx')


    更多的样式设置方式,请大家查询openpyxl库的文档进行学习 openpyxl  文档https://openpyxl.readthedocs.io/en/stable/tutorial.htm

    读Excel文档

    我们上面已经学会了写,现在来学习一下怎么去读取Excel文档。

     1import openpyxl as exl
    2
    3# 根据文件名打开一个Excel工作簿,并返回工作簿对象
    4wb = exl.load_workbook('test.xlsx')
    5
    6# 根据sheet表的名字,获取到指定的sheet表
    7sheet = wb['一班']
    8
    9# sheet.rows返回当前sheet表的所有行,我们将其转换为一个列表方便操作
    10# 列表中的每一个元素就是一行数据
    11all_row = list(sheet.rows)
    12
    13# 取第二行第一列单元格中的值
    14print(all_row[1][0].value)

    输出结果:

    1201901

    以上代码中,大家可能看不习惯一种写法,这里多写多看就会习惯,这种语法正是Python简洁的特性。

     1# 简洁表达
    2print(all_row[1][0].value)
    3
    4# 相当于以下写法
    5# 取全部行列表中的第二个元素,即第二行
    6line = all_row[1]
    7
    8# 该行也是列表,取第一个元素,则相当于第二行第一列。
    9# 由于这个列表中的元素是单元格对象,并不是字符串,因此需要调用其value属性获取单元格的值
    10print(line[0].value)

    以上代码是纯手工取值的,接下来我们通过循环去自动遍历全部值

     1import openpyxl as exl
    2
    3# 根据文件名打开一个Excel工作簿,并返回工作簿对象
    4wb = exl.load_workbook('test.xlsx')
    5
    6# 根据sheet表的名字,获取到指定的sheet表
    7sheet = wb['一班']
    8
    9# sheet.rows返回当前sheet表的所有行,并将其转换为一个列表,列表中的每一个元素就是一行数据
    10all_row = list(sheet.rows)
    11
    12for cell in all_row:
    13    print(cell[0].value, cell[1].value, cell[2].value, cell[3].value, cell[4].value)

    输出结果:

    1学号 姓名 语文 数学 英语
    2201901 张三 90 68.5 95
    3201902 李四 50 71 83
    4201903 王五 73 91 69
    5201904 赵六 85.6 36 77

    现在让我们利用代码,做一点实际应用

     1import openpyxl as exl
    2
    3# 根据文件名打开一个Excel工作簿,并返回工作簿对象
    4wb = exl.load_workbook('test.xlsx')
    5
    6# 根据sheet表的名字,获取到指定的sheet表
    7sheet = wb['一班']
    8
    9# sheet.rows返回当前sheet表的所有行,并将其转换为一个列表,列表中的每一个元素就是一行数据
    10all_row = list(sheet.rows)
    11
    12for i, cell in enumerate(all_row):
    13    # 跳过第一行表头(i等于0时,是表头)
    14    if i != 0:
    15        # 给每个人算一下三门课总分
    16        count = cell[2].value + cell[3].value + cell[4].value
    17        print(cell[1].value, count)
    18
    19sum = 0
    20# 计算一班所有人的语文平均分。
    21for i, cell in enumerate(all_row):
    22    # 跳过第一行表头(i等于0时,是表头)
    23    if i != 0:
    24        # 使用累加法,求得所有人的语文成绩总和
    25        sum += cell[2].value
    26
    27# 使用内置函数len 获取列表中的元素个数,即总行数
    28lenght = len(all_row)
    29
    30# 求平均分,除以总人数。总行数要减去表头那行
    31print("语文平均分", sum / (lenght - 1))

    输出结果:

    1张三 253.5
    2李四 204
    3王五 233
    4赵六 198.6
    5语文平均分 74.65

    我们今天学习的内容是很有实用性的,特别有用的一种情景是,当100个人每人填完了一份Excel文档发给你汇总时,你只需要简单的几行Python代码,就能将提交的这一百份Excel文档合并成一份总的Excel文档。

  • 相关阅读:
    聊聊es6中的解构
    JavaScript 中的面向对象编程
    TypeScript 中的类型保护
    7个你应该知道的 JavaScript 原生错误类型
    使用JavaScript策略模式校验表单
    nodejs如何解决高并发?
    nodejs核心模块有哪些?
    Dungeon Master
    Gold Balanced Lineup
    poj 2513Colored Sticks
  • 原文地址:https://www.cnblogs.com/valorchang/p/11460190.html
Copyright © 2020-2023  润新知