excel02.py

# -*- coding: utf-8 -*-
#@File :excel_oper_02.py
#@Auth : wwd
#@Time : 2020/12/7 8:16 下午
import xlrd3
workbook = xlrd3.open_workbook('test_data_02.xlsx')
sheet = workbook.sheet_by_name('Sheet1')
# 做成方法
def get_cell_merged_value(row_index,col_index):
cell_value=None #定义变量,不定义变量for循环无法返回变量的值
for (min_row, max_row, min_col, max_col) in sheet.merged_cells:
if row_index >= min_row and row_index < max_row:
if col_index >= min_col and col_index < max_col:
cell_value = sheet.cell_value(min_row, min_col) # 合并单元格的值等于合并第一个单元格的值
break;
else:
cell_value = sheet.cell_value(row_index, col_index)
else:
cell_value = sheet.cell_value(row_index, col_index)
return cell_value
print(sheet.merged_cells) #[(1, 5, 0, 1), (5, 9, 0, 1)]

# for i in range(1,9):
# cell_value = get_cell_merged_value(i,0) # 2,0
# print(cell_value)

for i in range(0,9):
for j in range(0,4):
cell_value = get_cell_merged_value(i,j) # 2,0
print( cell_value ,end=' ')
print()

# 把excel转换成 [{'事件': '学习python编程', '步骤序号': 'step_01', '步骤操作': '购买微课', '完成情况': 100.0},.....]
# 步骤一:
excel_list_data = []
row_head = sheet.row_values(0) # ==字典的key
row_dict = {}
row_dict[row_head[0]] = get_cell_merged_value(1,0)
row_dict[row_head[1]] = get_cell_merged_value(1,1)
row_dict[row_head[2]] = get_cell_merged_value(1,2)
row_dict[row_head[3]] = get_cell_merged_value(1,3)
print( row_dict )

# 步骤二:改为循环获取一行
excel_list_data = []
row_head = sheet.row_values(0) # ==字典的key
row_dict = {}
for i in range(sheet.ncols):
row_dict[row_head[i]] = get_cell_merged_value(1,i)
print( row_dict )

# 步骤三:
excel_list_data = []
row_head = sheet.row_values(0) # ==字典的key
for row_num in range(1,sheet.nrows):
row_dict = {}
for col_num in range(sheet.ncols):
row_dict[row_head[col_num]] = get_cell_merged_value(row_num,col_num)
excel_list_data.append(row_dict)
print( excel_list_data )
# for data in excel_list_data:
# print( data )

运行结果:

[{'事件': '学习python编程', '步骤序号': 'step_01', '步骤操作': '购买微课', '完成情况': 100.0}, {'事件': '学习python编程', '步骤序号': 'step_02', '步骤操作': '搭建环境', '完成情况': 100.0}, {'事件': '学习python编程', '步骤序号': 'step_03', '步骤操作': '做笔记', '完成情况': 90.0}, {'事件': '学习python编程', '步骤序号': 'step_04', '步骤操作': '应用', '完成情况': 80.0}, {'事件': '学习java编程', '步骤序号': 'step_01', '步骤操作': '购买微课', '完成情况': 100.0}, {'事件': '学习java编程', '步骤序号': 'step_02', '步骤操作': '搭建环境', '完成情况': 100.0}, {'事件': '学习java编程', '步骤序号': 'step_03', '步骤操作': '做笔记', '完成情况': 90.0}, {'事件': '学习java编程', '步骤序号': 'step_04', '步骤操作': '应用', '完成情况': 80.0}]

excel_utils.py 封装

# -*- coding: utf-8 -*-
#@File :excel_utils.py
#@Auth : wwd
#@Time : 2020/12/7 9:13 下午
import xlrd3
class ExcelUtils:
def __init__(self,excel_file_path,sheet_name):
self.excel_file_path=excel_file_path
self.sheet_name =sheet_name
self.sheet = self.get_sheet()


def get_sheet(self):
''' 根据文件路径及表格名称获取表格对象 '''
work_book =xlrd3.open_workbook(self.excel_file_path)
sheet=work_book.sheet_by_name(self.sheet_name)
return sheet

def get_row_count(self):
'''获取表格的行数'''
row_count=self.sheet.nrows
return row_count

def get_column_count(self):
'''获取表格的列数'''
column_count =self.sheet.ncols
return column_count

def get_merge_cell_value(self,row_index,col_index):
''' 获取excel单元格的数据(包含合并单元格的数据)'''
cell_value = None
for (min_row, max_row, min_col, max_col) in self.sheet.merged_cells:
if row_index >= min_row and row_index < max_row:
if col_index >= min_col and col_index < max_col:
cell_value = self.sheet.cell_value(min_row, min_col) # 合并单元格的值等于合并第一个单元格的值
break;
else:
cell_value = self.sheet.cell_value(row_index, col_index)
else:
cell_value = self.sheet.cell_value(row_index, col_index)
return cell_value

excel02.py

运行报错:

修改:

(二)数据源处理4-excel部分封装及数据转换的更多相关文章

  1. 二十四. Python基础(24)--封装

    二十四. Python基础(24)--封装 ● 知识结构   ● 类属性和__slots__属性 class Student(object):     grade = 3 # 也可以写在__slots ...

  2. python之excel的封装

    python之excel的封装 将所有excel的操作都使用面向对象的思维进行封装,即将所有操作都放入一个类中即为封装. 它将excel的处理极大程度的进行了简化操作 封装前需要先处理的操作: 1.在 ...

  3. NPOI读写Excel组件封装Excel导入导出组件

    后台管理系统多数情况会与Excel打交道,常见的就是Excel的导入导出,对于Excel的操作往往是繁琐且容易出错的,对于后台系统的导入导出交互过程往往是固定的,对于这部分操作,我们可以抽离出公共组件 ...

  4. iOS:针对固定数据源,更好的封装cell

    一.介绍 在iOS开发中,tableView非常常用,能将其展示出来,它的数据源必不可少.当然数据源有动态下发的,有固定写死的,这里我只探讨固定写死的情况.对于死数据,我们在项目中经常遇到的场景就是我 ...

  5. c# 导入导出excel方法封装

    在很多项目中,都会使用到文件的上传下载等,为了方便,封装了一个帮助类,每次直接拿过来使用就可以了,下面是封装的类和使用方法. using Common.AttributeHelper; using N ...

  6. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  7. python简说(二十)操作excel

    一.pip install xlrdpip install xlwtpip install xlutils 二.写excel import xlwtbook = xlwt.Workbook() #新建 ...

  8. mybatis二(参数处理和map封装及自定义resultMap)

    .单个参数 mybatis不会做特殊处理. #{参数名/任意名}:取出参数值. .多个参数 mybatis会做特殊处理. 多个参数会被封装成 一个map. key:param1...paramN,或者 ...

  9. libxl库的介绍,对Excel操作封装得很好的一个库,兼容2007版和多字节字符(最后有破解版下载)

    前段时间忙着毕业论文,终于有时间写博客了. 早些时候老大给我的一个任务需要对excel进行读表操作,研究了一下c++对excel的操作. 对Excel的操作基本有com,ODBC,AD等,其中ODBC ...

随机推荐

  1. OpenWrt下基于OLSR的Ad-Hoc组网实现网络摄像头多节点访问

    文章目录 Ad-Hoc组网配置 摄像头端口映射 PC连接设置 结果 Ad-Hoc组网配置 参照博客 链接: link. 摄像头端口映射 这里使用到了海康网络摄像头,先将网络摄像头的网口连接到任意一个节 ...

  2. 算法——寻找第K个最大的数

    在未排序的数组中找到第 k 个最大的元素. 链接: leetcode. 解题思路:通过快速排序的思想方法,每次随机获取指定范围内一个树的排序位置,然后根据这个位置,再重新指定范围,直到这个位置索引满足 ...

  3. 2020软件测试工程师面试题汇总(内含答案)-看完BATJ面试官对你竖起大拇指!

    测试技术面试题 1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通常说的软件的可移植性. 兼容的类型,如果细分的话 ...

  4. 我们为什么选择VUE来构建前端

    很多使用过VUE的程序员,对VUE的评价是"Vue.js 兼具angular.js和react.js的优点,并剔除了它们的缺点". 那么,他真的值得这么高的评价嘛? Vue.js的 ...

  5. #2020征文-手机#深鸿会深大小组:HarmonyOS手机游戏—数字华容道

    目录: 前言 概述 正文 创建项目 实现初始界面布局 实现数字的随机打乱 实现滑动或点击调换数字 实现游戏成功界面 结语 源码包 前言 12月16号HarmonyOS2.0手机开发者Beta版已经发布 ...

  6. redis源码学习之lua执行原理

    聊聊redis执行lua原理 从一次面试场景说起   "看你简历上写的精通redis" "额,还可以啦" "那你说说redis执行lua脚本的原理&q ...

  7. Github标星26k+!一个神奇的软件!1分钟即可打造了一个科幻风格的终端

    Github掘金计划项目分类汇总(原创不易,若有帮助,欢迎分享/点赞): 编程基础 :精选编程基础如学习路线.编程语言相关的开源项目. 计算机基础:精选计算机基础(操作系统.计算机网络.算法.数据结构 ...

  8. PHP可回调类型

    一些函数如usort和call_user_func()可以作为用户自对应函数做为回调参数,回调函数不止是简单的函数,还可以是对象的方法(类方法),包括静态方法. 用户自定义函数作为回调函数的参数,PH ...

  9. 解决uiautomator截取不到手机App界面信息

    今天在使用uiautomatorviewer进行安卓app控件定位的时候,出现以下异常,(用的是真机测试Android版本是10,据说是Android 8以后sdk自带的uiautomator直接打开 ...

  10. 强大的动态SQL

    1 动态SQL# 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.My ...