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. Angular学习知识点记录

    问:版本直接跳转到Angular4? 答:为了遵循严格的版本策略.在angular2.x的时候,angular route的版本已经是版本3了.因此为了版本统一,angular直接从2跳到了4,.参考 ...

  2. 【Python】 requests 各种参数请求的方式

    Python使用requests发送post请求 1.我们使用postman进行接口测试的时候,发现POST请求方式的编码有3种,具体的编码方式如下: A:application/x-www-form ...

  3. Mysql常用函数合集

    1. 字符函数 length(获取字节数,UTF-8编码中 一个汉字占3个字节,GBK编码中一个汉字占2个字节) select length('abc'); #结果:3 select length(' ...

  4. 2、MyCat读写分离

    1.主从复制 搭建mycat的读写分离,首先我们现需要搭建mysql的主从复制 [1].Mysql主从复制原理 [2].MySQL主从复制配置 (1).主机配置 修改配置文件:vim /etc/my. ...

  5. angular8 大地老师学习笔记---第六课

    export class TodolistComponent implements OnInit { public keyword:string; public todolist:any[]=[]; ...

  6. RabbitMQException com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth

    异常1 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ...

  7. 在库中使用schematics——ng add与ng update

    起步 创建一个angular库 ng new demo --create-application=false ng g library my-lib 可见如下目录结构 ├── node_modules ...

  8. 【剑指offer】03 从尾到头打印链表

    题目地址:从尾到头打印链表 题目描述                                    输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 时间限制:C/C++ 1秒, ...

  9. vs2012新特性

    VS2012的六大技术特点: 1.VS2012和VS2010相比,最大的新特性莫过于对Windows 8Metro开发的支持.Metro天生为云端而生,简洁.数字化.内容优于形式.强调交互的设计已经成 ...

  10. Mysql Workbench查询成功但是不显示

    先来看看MysqlWorkbench的一个bug: 当执行SQL语句成后显示结果在屏幕下方,但是当你拖动结果拦边框往下移动到与Action Output时两者就会合并,再也拖不上来!!!! 回归正题: ...