最全总结 | 聊聊 Python 办公自动化之 Excel(上)

聊聊 Python 数据处理全家桶(Memca 篇)

点击上方“AirPython”,选择“加为星标web

第一时间关注 Python 技术干货!sql


1. 前言

在咱们平常工做中,常常会使用 Word、Excel、PPT、PDF 等办公软件微信

可是,常常会遇到一些重复繁琐的事情,这时候手工操做显得效率极其低下;经过 Python 实现办公自动化变的颇有必要app

接下来的 一系列 文章,我将带你们对 Python 办公自动化作一个全面的总结,绝对的干货!函数

2. 准备

使用 Python 操做 Excel 文件,常见的方式以下:字体

  • xlrd / xlwt ui

  • openpyxlspa

  • Pandas.net

  • xlsxwriter3d

  • xlwings

  • pywin32

xlrd 和 xlwt 是操做 Excel 文件最多的两个依赖库

其中,

xlrd 负责读取 Excel 文件,xlwt 能够写入数据到 Excel 文件

咱们安装这两个依赖库

# 安装依赖库
pip3 install xlrd 
pip3 install xlwt 

3. xlrd 读取 Excel

使用 xlrd 中的 open_workbook(filepath) 打开本地一个 Excel 文件

import xlrd

# 打开文件,返回一个工做簿对象
wb = xlrd.open_workbook(file_path)

工做簿对象的 nsheets 属性获取 Sheet 数目,sheet_names() 方法返回全部 Sheet 名称的列表

# 统计sheet数量
sheets_num, sheets_names = wb.nsheets, wb.sheet_names()
print('sheet数量一共有:', sheets_num)
print('sheet名称分别为:', sheets_names)

筛选出工做簿中的某一个 Sheet 有 2 种方式,分别是:

  • 经过 Sheet 名称

  • 使用位置索引,从 0 开始

# 获取某一个sheet
# 经过名称或者索引获取
sheet = wb.sheet_by_index(0)

# sheet = wb.sheet_by_name('第一个Sheet')
print(sheet)

每个 sheet 对象均可以利用 name、nrows、ncols 获取 Sheet 名称、行数量、列数量

另外

row_values(index)、col_values(index) 分别用于获取某一行或某一列的数据列表

# 获取某一个sheet中,包含的行数量、列数量
sheet_name, sheet_row_count, sheet_column_count = sheet.name, sheet.nrows, sheet.ncols
print('当前sheet名称为:', sheet_name, ",一共有:", sheet_row_count, "行;有:", sheet_column_count, "列")

# 单独获取某一行数据,索引从0开始
# 好比:获取第2行数据
row_datas = sheet.row_values(1)
print('第2行数据为:', row_datas)

# 单独获取某一列数据,索引从0开始
# 好比:获取第二列数据
column_datas = sheet.col_values(1)
print('第2列数据为:', column_datas)

单元格能够经过行索引、列索引,调用 cell(row_index,column_index) 函数获取

须要注意的是,行索引和列索引都是从 0 开始,即:0 表明第一行

在 xlrd 中,单元格的数据类型包含 6 种,用 ctype 属性对应关系以下:

  • 0  --  空(empty)

  • 1  --  字符串(string)

  • 2  --  数字(number)

  • 3  --  date(日期)

  • 4  --  boolean(布尔值)

  • 5  --  error(错误)

# 获取某一个单元格的数据
# 好比:获取第2行第1列的单元格的数据
one_cell = sheet.cell(1, 0)
# 单元格的值
cell_value = one_cell.value
print("单元格的值为:", cell_value)
# 单元格数据类型
cell_type = one_cell.
print("单元格数据类型为:", cell_type)

最后,若是要获取当前 Sheet 全部单元格中的数据,能够经过遍历全部行、列来操做

# 获取全部单元格的值
print('表格中全部数据以下:')
for r in range(sheet.nrows):
    for i in range(sheet.ncols):
        print(sheet.cell(r, i).value)

4. xlwt 写入 Excel

若是想实现将数据写入到 Excel 中,xlwt 就很方便了

首先,使用 xlwt 的 Workbook() 方法建立一个工做簿对象

而后,使用工做簿对象的 add_sheet(sheetname) 方法新增 Sheet

import xlwt

sheetname = '第一个Sheet'

# 建立一个工做簿对象
wb = xlwt.Workbook()

# 添加Sheet,经过sheet名称
sheet = wb.add_sheet(sheetname)

接着,经过 sheet 对象的 write() 方法,按照行索引和列索引,将数据写入到对应单元格中去

# 将数据写入到Sheet中
# 3个参数分别是:行索引(从0开始)、列索引(从0开始)、单元格的值
# 第一行第一列,写入一个数据
# 写入标题
for index, title in enumerate(self.titles):
    sheet.write(0, index, title)

# 写入值
for index_row, row_values in enumerate(self.values):
    for index_column, column_value in enumerate(row_values):
        sheet.write(index_row + 1, index_column, column_value)

须要注意的是,最后必须调用工做簿的 save(filepath),才能在本地生成 Excel 文件

# 保存文件
# 最后保存文件便可
wb.save(filepath)

5. 进阶用法

接下来,聊聊几个经常使用的进阶用法

一、获取全部可见的 Sheet

在读取 Sheet 数据时,常常须要过滤隐藏的 Sheet

当 sheet 对象的 visibility 属性值为 0 时,表明此 Sheet 在工做簿中是显示的;不然被隐藏了

def get_all_visiable_sheets(self, wb):
    """
    获取全部可见的sheet
    :param wb:
    :return:
    """

    return list(filter(lambda item: item.visibility == 0, wb.sheets()))

# 一、获取全部可看见的sheet
sheet_visiable = self.get_all_visiable_sheets(wb)
print('全部可见的sheet包含:', sheet_visiable)

二、获取 Sheet 可见行或列

某一个 Sheet 中,可能存在部分行、列被隐藏了

def get_all_visiable_rows(self, sheet):
    """
    获取某一个sheet中,可见的行
    :param sheet:
    :return:
    """

    result = [index for index in range(sheet.nrows) if sheet.rowinfo_map[index].hidden == 0]
    return result

def get_all_visiable_columns(self, sheet):
    """
    获取某一个sheet中,可见的列
    :param sheet:
    :return:
    """

    result = [index for index in range(sheet.ncols) if sheet.colinfo_map[index].hidden == 0]
    return result

三、获取单元格的样式

以获取单元格字体颜色和背景为例

def get_cell_bg_color(self, wb, sheet, row_index, col_index):
    """
    获取某一个单元格的背景颜色
    :param wb:
    :param sheet:
    :param row_index:
    :param col_index:
    :return:
    """

    xfx = sheet.cell_xf_index(row_index, col_index)
    xf = wb.xf_list[xfx]

    # 字体颜色
    font_color = wb.font_list[xf.font_index].colour_index
    # 背景颜色
    bg_color = xf.background.pattern_colour_index

    return font_color, bg_color

须要注意的是,使用 xlrd 读取单元格的样式,打开工做簿的时候须要显式定义 formatting_info = True,不然会抛出异常

# 注意:必须设置formatting_info=True,才能正常获取属性
wb = xlrd.open_workbook(file_path, formatting_info=True)
sheet = wb.sheet_by_index(0

6. 最后

搭配使用 xlrd、xlwt,基本上能完成大部分的工做,对于一些复杂的功能,好比:复制、分割、筛选等功能,能够用上 xlutils 这个依赖库

须要指出的是,这个组合对 xlsx 的兼容性不太好;若是须要操做 xlsx 文件,须要先转为 xls,而后再进行

我已经将文中所有源码上传到后台,关注公众号后回复「 excel 」便可得到所有源码

若是你以为文章还不错,请你们 点赞、分享、留言 下,由于这将是我持续输出更多优质文章的最强动力!



推荐阅读


聊聊 Python 数据处理全家桶(Mysql 篇)

聊聊 Python 数据处理全家桶(Sqlite 篇)

聊聊 Python 数据处理全家桶(Redis 篇)

聊聊 Python 数据处理全家桶(Memc 篇)

聊聊 Python 数据处理全家桶(Mongo 篇)

聊聊 Python 数据处理全家桶( 配置篇 )



本文分享自微信公众号 - 看那个码农(gh_31e9c1ac7ce4)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索