当前位置: 首页 > 工具软件 > xlutils > 使用案例 >

xlrd、xlwt、xlutils 方法汇总,自动化处理 .xls 文件

危璞
2023-12-01

目录

文前

xlrd

一、导入xlrd

二、打开文件

三、获取 sheet 属性

四、获取指定 sheet 内容

对行、列进行操作

对单元格进行操作

单元格表达法转换

xlwt

一、导入 xlwt

二、处理流程

xlutils

一、导入 xlutils 的 .copy.copy 模块

二、copy 模块的用法

实战


文前

温馨提示:此方法写入的excel,单元格中无法保留公式。若想保留公式,可使用openpyxl,读取excel时则不能使用data_only=True

  • xlrd 只能用于读取文件,不能用于写入文件;
  • xlwt 只能用于写入文件,不能用于读取文件;
  • xlutils 通过 .copy.copy 方法,将 xlrd 读取的文件复制之后给 xlwt 处理;相当于在 xlrdxlwt 之间架起来了一座桥梁;
  • xlrd 版本1.2.0 是可以同时读取 .xls 文件和 .xlsx 文件;
  • xlrd 版本2.0.0 以后,只能用于读取 .xls 文件,不再支持 .xlsx 文件;
  • 比较复杂的是 xlrd,其次是 xlwt,内容最少的是 xlutils,只用 .copy.copy 方法就可以;
处理 .xls 文件的基本流程是:xlrd读取——xlutils复制——xlwt写入——.save()保存

xlrd

一、导入xlrd

import xlrd

二、打开文件

wb = xlrd.open_workbook('文件路径')
    # 此处的文件路径可以是绝对路径,也可以是相对路径;
    # 找不到文件会报错

三、获取 sheet 属性

这部分记录 sheet 属性获取的方式,包括对象、工作表名、获取指定工作表、以及判断是否加载。属性的作用多用于 sheet 之间的关系循环。

objects = wb.sheets()
    # 获取文件内所有 sheet 的对象

names = wb.sheet_names()
    # 获取文件内所有 sheet 的名称,返回名称列表

ws = wb.sheet_by_index(索引值)
ws = wb.sheet_by_name(文件名)
    # 获取对应索引值的 sheet 对象
    # 获取对应文件名的 sheet 对象

name = ws.name
    # 获取指定工作表的表名

n = wb.nsheets
    # 获取一个工作簿中有几个

i = wb.sheet_loaded(文件名)
i = wb.sheet_loaded(索引值)
    # 检查文件中对应的文件是否导入,返回值是布尔类型

四、获取指定 sheet 内容

这部分主要是对应 sheet 内部的进行操作,从行、列、单元格的角度进行操作。主要用于当前操作工作表内的值进行操作。

对行、列进行操作

nrows = ws.nrows
ncols = ws.ncols
    # 获取工作表已经使用的行数
    # 获取工作表已经使用的行数

lst = ws.row(索引值)
lst = ws.col(索引值)
    # 获取工作表对应行的单元格组成的列表
    # 获取工作表对应列的单元格组成的列表
    # 元素格式是: 数值类型:对应数据

lst = ws.row_values(索引值,start_colx=0, end_colx=None)
lst = ws.col_values(索引值,start_rowx=0, end_rowx=None)
    # 获取工作表对应行的值组成的列表
    # 获取工作表对应行的值组成的列表

lst = ws.row_slice(索引值, start_colx=0, end_colx=None)
lst = ws.col_slice(索引值, start_rowx=0, end_rowx=None)
    # 根据索引值,对该行进行切片,后可选开始列与结束列
    # 根据索引值,对该列进行切片,后可选开始行与结束行

lst = ws.row_types(索引值,start_colx=0, end_colx=None)
lst = ws.col_types(索引值, start_rowx=0, end_rowx=None)
    # 根据索引值,输出行数据类型
    # 根据索引值,输出列数据类型

i = ws.row_len(索引值)
    # 根据索引值,返回该行的长度
    # 列没有对应的操作

对单元格进行操作

n = ws.cell(行索引, 列索引)
    # 根据行列索引,返回单元格数据:数据类型:对应数据

n = ws.cell_value(行索引, 列索引)
n = ws.cell(行索引,列索引).value
n = ws.row(行索引)[列索引].value

    # 根据行列索引,返回单元格数据:对应数据

n = ws.cell_type(行索引, 列索引)
n = ws.cell(行索引,列索引).ctype
n = ws.row(行索引)[列索引].ctype
    # 根据行列索引,返回单元格数据:数据类型
    # 数据类型:0.空,1.字符串,2.数字,3.日期,4.布尔,5.error

单元格表达法转换

xlrd.cellname(行索引,列索引)
    # A1表达法

xlrd.cellnameabs(行索引,列索引)
    # R1C1表达法

xlrd.colname(列索引)
    # 将数字转换为字母表达

xlwt

一、导入 xlwt

import xlwt

二、处理流程

xlwt 的处理流程很简单:新建工作簿——新建工作表——写入数据——保存

nwb = xlwt.Workbook('utf-8')
    # 通过 .Workbook 方法新建工作簿

nws = nwb.add_sheet('名称', cell_overwrite_ok=True)
    # 通过 .add_sheet() 方法在 工作簿nwb 中添加一个工作表
    # 如果不添加会报错

nws.write(行索引,列索引,写入内容)
    # 通过 .write 的方式写入想要写入的内容

nwb.save('文件名.xls')
    # 通过 .save 的方式保存新建的工作簿
    # 注意要带上 .xls 的文件后缀

xlutils

一、导入 xlutils 的 .copy.copy 模块

from xlutils.copy import copy

二、copy 模块的用法

wb = xlrd.open_workbook('文件名')
    # 通过 xlrd 读取需要处理的工作簿
nwb = copy(wb)
    # 通过 copy 的方法复制一份需要处理的工作簿,这样 xlwt 就能处理了

实战

实现excel自动化,一般是先编写好一份模板的excel文件。后基于这份模板excel文件填上相应数据后保存生存新的一份excel文件

async def write_excel_data(data, save_path="/Users/Desktop/变更操作单"):
    # data: 二维数组,表示插入excel的数据
    # save_path: 工作簿的路径
    # formatting_info=True:保留Excel的原格式
    workbook = xlrd.open_workbook('/Users/Desktop/变更操作单/变更操作单模板.xls', formatting_info=True)

    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象

    print(workbook.sheets())

    # 写入表格信息
    # 第一次建立工作簿时候调用
    write_sheet = new_workbook.get_sheet(0)

    index = len(data)  # 获取需要写入数据的行数
    # workbook = xlwt.Workbook()  # 新建一个工作簿
    for i in range(0, index):
        for j in range(0, len(data[i])):
            write_sheet.write(i, j, data[i][j])  # 向表格中写入数据(对应的行和列)

    # now_date_str = time.strftime("%Y%m%d", time.localtime())
    now_date_str = '20230129'
    save_path = os.path.join(save_path, "{}变更操作单.xls".format(now_date_str))
    new_workbook.save(save_path)  # 保存工作簿

更多操作excel的模板库可参考:全网最全Python操作Excel教程

 类似资料: