当前位置: 首页 > article >正文

【使用xlrd、xlutils读写excel】

使用xlrd、xlutils读写excel

    • 1、环境和版本
    • 2、相关使用方法封装
      • 2.1 根据行下标返回对应行数据
      • 2.2 根据列下标返回对应列数据
      • 2.3 读取指定单元格数据
      • 2.4 通过表单名读取全部数据
      • 2.5 通过表索引读取全部数据
      • 2.6 向已存在sheet中追加数据
      • 2.7 原文件基础上新建的sheet并写入数据
    • 3、其他踩坑

1、环境和版本

  • 电脑:win
  • excel文件格式.xls
  • xlrd 版本 1.2.0(高版本存在部分属性不兼容),安装指定版本pip install xlrd == 1.2.0
  • xlutils 版本:2.0.0

2、相关使用方法封装

2.1 根据行下标返回对应行数据

def read_excel_by_row(file_path, sheet_index, row_index):
    """读取指定行数据"""
    data = xlrd.open_workbook(file_path)
    sheet = data.sheet_by_index(sheet_index)
    nrows = sheet.nrows  # 行数
    ncols = sheet.ncols  # 列数
    try:
        table_list = sheet.row_values(rowx=row_index, start_colx=0, end_colx=None)  # start_colx:开始列,end_colx:结束列
        return table_list
    except Exception as e:
        print("当前表单行数%s行%s列" % (nrows, ncols), e)

2.2 根据列下标返回对应列数据

def read_excel_by_col(file_path, sheet_index, col_index):
    """读取指定列数据"""
    data = xlrd.open_workbook(file_path)
    sheet = data.sheet_by_index(sheet_index)
    nrows = sheet.nrows  # 行数
    ncols = sheet.ncols  # 列数
    try:
        table_list = sheet.col_values(colx=col_index, start_rowx=0, end_rowx=None)  # start_rowx:开始行,end_colx:结束行
        return table_list
    except Exception as e:
        print("当前表单行数%s行%s列" % (nrows, ncols), e)

2.3 读取指定单元格数据

def read_excel_by_cell(file_path, sheet_index,row_index,col_index):
    """
    读取指定单元格数据
    :param file_path: 文件路径. .xls格式的文件
    :param sheet_index: sheet表索引
    :param row_index: 行下标
    :param col_index: 列下标
    :return: 第row_index行col_index数据
    """
    wb = xlrd.open_workbook(file_path)
    sheet = wb.sheet_by_index(sheet_index)
    value = sheet.cell_value(row_index, col_index)
    # value_type = sheet.cell_type(row_index, col_index) # 单元格类型  0->empty,1->string,2->number,3->date,4->boolean,5->error
    return value

2.4 通过表单名读取全部数据

def red_excel_by_sheet_name(file_path, sheet_name):
    """
    读取excel数据并返回
    :param file_path: 文件路径 .xls文件
    :param sheet_index: sheet表单所以
    :return: 表单List
    """
    data = xlrd.open_workbook(file_path)
    # table = data.sheet_by_index(sheet_index)
    table = data.sheet_by_name(sheet_name)
    # 表格行数
    nrows = table.nrows #行数
    ncols = table.ncols
    # print(nrows, ncols)
    table_list = []
    for row_index in range(0, nrows):
        temp_list = table.row_values(rowx=row_index, start_colx=0, end_colx=None)  # start_colx:开始列,end_colx:结束列
        table_list.append(temp_list)
    return table_list

2.5 通过表索引读取全部数据

def red_excel_by_sheet_index(file_path, sheet_index):
    """
    通过表单索引读取excel数据并返回
    :param file_path: 文件路径
    :param sheet_index: 表单索引
    :return:对应表单的数据
    """
    data = xlrd.open_workbook(file_path)
    table = data.sheet_by_index(sheet_index)
    # table = data.sheet_by_name(sheet_index)
    # 表格行数
    nrows = table.nrows
    ncols = table.ncols
    # print(nrows, ncols)
    table_list = []
    for row_index in range(0, nrows):
        temp_list = table.row_values(rowx=row_index, start_colx=0, end_colx=None)  # start_colx:开始列,end_colx:结束列
        table_list.append(temp_list)
    return table_list

2.6 向已存在sheet中追加数据

def append_to_sheet(file_path, sheet_tag, data):
    """向已存在的表中追加数据
    :param file_path: 文件路径(sheet已经存在的情况)
    :param sheet_tag: sheet表标识 sheet_name or sheet_index
    :param data: 要追加的数据
    :return: None
    """
    try:
        # 打开文件
        openFile = xlrd.open_workbook(file_path)
        # 读取文件,准备写入信息
        if isinstance(sheet_tag, int): #如果参数是int根据索引查找表单
            max_row = openFile.sheet_by_index(sheet_tag).nrows
        else: #如果参数是str根据名称查找表单
            max_row = openFile.sheet_by_name(sheet_tag).nrows
        print("当前最大行=", max_row)
        write = copy(openFile)
        write_sheet = write.get_sheet(sheet_tag)
        start_row = max_row  # 从表格的第5行开始写入数据
        # 一行一行的写,一行对应的所有列
        for d in data:  # 控制行
            col = 0
            for value in d:  # 控制每一列
                write_sheet.write(start_row, col, value)  # rou代表列,col代表行,value写入值
                col += 1
            start_row += 1
        # 保存
        write.save(file_path)
    except FileNotFoundError:
        print(f"文件 {file_path} 未找到。")
    except xlrd.XLRDError:
        print("无法读取Excel文件,请检查文件格式或内容。")
    except Exception as e:
        print(f"发生未知错误:{e}")

2.7 原文件基础上新建的sheet并写入数据

def append_date_to_new_sheet(file_path, sheet_name,data):
    """
    原文件基础上新建的sheet并写入数据
    :param file_path:
    :param sheet_name:
    :param data:list数据,例:data = [[1,2],[3,4]]
    :return:None
    """
    openFile = xlrd.open_workbook(file_path)
    write = copy(openFile)
    write.add_sheet(sheet_name)
    write_sheet = write.get_sheet(sheet_name) # 已存在的表单,实际需要新建
    row = 0  # 从表格的第二行开始写入数据
    # 一行一行的写,一行对应的所有列
    for d in data:  # 控制行
        col = 0
        for one in d:  # 控制每一列
            write_sheet.write(row, col, one)  # rou代表列,col代表行,one写入值
            col += 1
        row += 1
    write.save(file_path)

3、其他踩坑

xlrd 仅1.2.0 版本支持.xls 文件,更高版本不支持,没有删除sheet功能
openpyxl 支持.xlsx 读取的时候一直显示文件被损坏, 不支持.xls格式,有remove功能,但是使用过程中也有问题,后续研究明白再做补充吧


http://www.kler.cn/a/274782.html

相关文章:

  • 【D3.js in Action 3 精译_046】DIY 实战:在 Observable 平台利用饼图布局函数实现 D3 多个环形图的绘制
  • ViEW生命周期
  • 题海拾贝:力扣 86.分隔链表
  • 梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语
  • ChatGPT重大更新:新增实时搜索和高级语音
  • 力扣438-找到字符串中所有字母异位词
  • Devops-01-devops 是什么?
  • 自动化单元测试 Automatic Test Generation
  • 漫谈微服务网关
  • 性能优化(CPU优化技术)-NEON指令详解
  • 服务器版本命令查看
  • Http的缓存有哪些
  • 前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】
  • k8s详细教程
  • QT 驾校系统界面布局编写
  • ES集群和分片以及脑裂
  • 竞争优势:大型语言模型 (LLM) 如何重新定义业务策略
  • DOM节点操作
  • LVGL:拓展部件——键盘 lv_keyboard
  • Spring MVC入门(4)
  • WPF —— 控件模版和数据模版
  • K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)
  • 基于Lealfet.js展示Turf.js生成的平滑曲线实践
  • 详细教---用Django封装写好的模型
  • 如何本地部署1Panel面板
  • 【2024年5月备考新增】《软考真题分章练习 - 6 项目成本管理(高项)》