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. Java并发编程的艺术(七)——线程间的通信

    为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...

  2. nginx 静态化合集(去掉index.php目录)

    访问某域名时,去掉index.php目录时达到效果一样 如:www.test1/index.php/test2跟www.test1/test2效果一致 在vhosts.conf中加重写就可以了 loc ...

  3. IIS应用程序池配置详解及优化

    参数说明 1.常规 属性名称 属性详解 NET CLR 版本 配置应用程序池,以加载特定版本的 .NET CLR.选定的 CLR版本应与应用程序所使用的相应版本的 .NET Framework 对应. ...

  4. 07-flask-使用sqlalchemy

    代码 from flask import Flask, render_template from sqlalchemy import create_engine from sqlalchemy.ext ...

  5. web服务器专题:tomcat(三)tomcat-user.xml 配置文件

    回顾:web服务器专题:tomcat(二)模块组件与server.xml 配置文件 Tomcat管理模块 安装Tomcat后,访问127.0.0.1/8080可以看到这个首页,上图中的三个按钮即为To ...

  6. 面试 21-面试题整理 by smyhvae

    21-面试题整理 by smyhvae #JavaScript #存储相关:请描述以下cookie.localStorage.sessionStorage的区别 在H5之前,cookie一直都是本地存 ...

  7. pixi.js 简单交互事件(点击、缩放、平移)

    注意:本文代码使用的Pixi.js版本为PixiJS 5.3.3 pixi中常用的鼠标交互事件: //兼容鼠标和触摸屏的共同触发 type InteractionPointerEvents = &qu ...

  8. IQueryable的简单封装

    IQueryable的简单封装 前言 前两天在园子上看到一个问题 半年前我也考虑过这些问题,但由于这样那样的问题,没有尝试去解决. 后来公司用上了 abp vnext ,然后有一部分代码可以这样写 p ...

  9. 在C#中使用OpenCV(使用GOCW)

    在C#中使用OpenCV(使用GOCW) 1.什么是GOCW       为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCshar ...

  10. 拥抱 C/C++ : Android JNI 的使用

    编译工具 CMake 以及 Android 上 JNI 的使用介绍. 编译工具 CMake 在Android Studio 2.2 之后,工具中增加了 CMake 的支持,于是我们有两种选择来编译 c ...