Python读取电子表格方法

本文所使用电子表格的目标是读取、解析来自Excel编制的数据报表,或者软件界面导出的数据报表,这类电子表格报表显著特点是有一定的格式,且数据位置不连续,而非标准二维数据表。

关于电子表格,比较常见的有微软Office Excel、WPS Office、Open Office、LibreOffice、永中Office等等,这些软件关于电子表格定义相近,文件格式兼容MS Excel标准。

  • 一个电子表格文档(Excel)称为一个工作簿
  • 一个工作簿保存在一个扩展名为XLS(.xlsx)的文件中
  • 一个工作簿可以包含多个表(sheet)
  • 在特定行和列的方格称为单元格、格子

对于文件格式XLS、XLSX,简单来说:

  • XLS是excel2003及以前版本所生成的文件格式
  • XLSX是excel2007及以后版本所生成的文件格式

Python对excel文件的读写功能的模块有以下三种:

  • xlwt:对 xls 格式的 Excel 文件进行写入;
  • xlrd:对 xls 格式的 Excel 文件进行读取;
  • OpenpPyXL 实现了对 xlsm 、xlsx 开放电子表格格式的读写。

另外,Pandas也能实现了对Excel读写,例如read_excel()和to_excel(),直接读取数据到DataFrame中。

首先,安装第三方包xlrd和xlwt(如果已经安装,则略过):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlwt

原始数据

原始数据是来自接口方提供XLS格式数据,内容如下图所示,由程序生成而导出的数据(为什么会这样,历史原因不予分析),虽然行、列对应不清晰,但是总体上还是有规律的,日报表的每日内容格式基本一致,针对数据行数变化需要特殊解析处理。

没有好办法,标记上顺序数字,逐个查数定位!

定义数据字典:

data_dict = {'油品规格名称':{'colname':'oilname','id':1},'期初库存':{'colname':'openinginventory','id':7},'本期进货':{'colname':'currentpurchase','id':10},'加油机发出量':{'colname':'sendout','id':13},'数量':{'colname':'values','id':16},......

数据解析过程框图

实践代码示例

代码中关键API函数解释:

  • 打开XLS工作薄:
    workbook = xlrd.open_workbook(filename)

  • 三种方式获取工作表
    table = workbook.sheet_by_index(0),按索引顺序
    table = workbook.sheets()[0]
    table = workbook.sheet_by_name(‘日报表202110-202210’),按sheet名称

  • 读取单元格数据:
    value = table.cell_value(rowx=2, colx=0),rowx,colx分别是行、列索引数(注意:从0开始)

解析XLS代码示例:

import xlrd# filename是文件的路径名称,如果路径或者文件名有中文给前面加一个r拜师原生字符。
workbook = xlrd.open_workbook(filename=r'日报表202110-202210.XLS')
#workbook = xlrd.open_workbook(filename=r'2日报表202110-202210.XLS',encoding_override='utf-8')# 获取第一个sheet表格
table = workbook.sheets()[0]
# 初始化,按行定义list
dat_row = []
# 数据单元格,列的索引位置
cols_index = [1,7,10,13,16,20,23,30,...,83,87]
# 批发油的情况,价格不一致(猜测)
cols_index_0 = [16,20,23,30,...]
cols_len = len(cols_index)
cols_len_0 = len(cols_index_0)# 获取sheet中有效行数
rows = table.nrows
# 表头与首行数据间隔函数
irow_bank = 5
irow = 0
icol = cols_index[0]
while irow < rows:if table.cell_value(rowx=irow, colx=0) == '编制单位:':cell_vd = table.cell_value(rowx=irow, colx=39)   # 日报时间索引位置39 cell_v = table.cell_value(rowx=irow, colx=icol)if cell_v == '名称':#irow = irow + irow_bank# 跨过空行irow = irow + 1while len(table.cell_value(rowx=irow, colx=icol)) == 0:irow = irow + 1while table.cell_value(rowx=irow, colx=icol) != '合计':dat_col = []for j in range(cols_len):dat_col.append(table.cell_value(rowx=irow, colx=cols_index[j]))# 批发油的情况,价格不一致if len(table.cell_value(rowx=irow+1, colx=icol)) == 0:irow = irow + 1            for j in range(cols_len_0):dat_col.insert(4+j,table.cell_value(rowx=irow, colx=cols_index_0[j]))else:for j in range(cols_len_0):dat_col.append(0)dat_col.append(cell_vd)print(dat_col)                dat_row.append(dat_col)irow = irow + 1# 逐行扫描irow = irow + 1irow

保持解析结果到文件中:

import pandas as pddf.to_excel('dd.xls',encoding='utf_8_sig',index=False)

结果如下:

总结

Python按单元格读取复杂电子表格(Excel)数据技术上比较成熟,易操作。需要注意事项:

  • 由于数据文件来自第三方,可能存在编码问题(中文乱码),最好拿到手后,在文件处理的系统上,再另存新文件(本次工作,就是遇到类似问题,花费变天时间也没有解决编码转换或者加密问题,简单的另存解决。
  • 数据处理过程,还是使用pandas更加专业。

参考:

华仔仔coding. 利用Python第三方库xlrd读取Excel中数据实例代码. 脚本之家. 2022.07
lainwith. python实现——处理Excel表格(超详细). CSDN博客. 2021.10
肖永威. Pandas高级数据分析快速入门之二——基础篇. CSDN博客. 2021.08

Python按单元格读取复杂电子表格(Excel)数据实践相关推荐

  1. python设置单元格宽度_python – 在Excel中调整单元格宽度

    我正在使用xlsxwriter写入Excel工作表.我面临的问题是:当文本超过单元格大小时,它会被隐藏. import xlsxwriter workbook = xlsxwriter.Workboo ...

  2. python合并单元格居中_Python基于xlrd模块处理合并单元格

    目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式. 总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我们实际 ...

  3. python合并单元格处理_Python基于xlrd模块处理合并单元格

    目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式. 总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我们实际 ...

  4. 【Excel】统计不重复数据的个数,设置单元格不允许出现重复数据

    前篇文章我们介绍了一下Excel中如何设置数据有效性以及COUNTIF函数的用法,这篇文章主要介绍有重复数据时如何统计不重复数据的个数以及通过数据有效性去设置单元格不允许出现重复数据. 统计单列不重复 ...

  5. 用计算机公式计算优良,『excel怎样合并单元格』如何在EXCEL中如何用公式计算全年级各班各科平均分、优秀率、合格率的方法...

    EXCEL中算优秀率用什么函数,例子 举例: 数据表-- A B C 姓名 001 张三 92 002 李四 80 003 赵丰 85 004 王二 95 005 钱宽 75 006 郑东 55 参考 ...

  6. python html网页合并单元格,python合并单元格解决办法

    python合并单元格 我要在excle中我要合并(0,0),(1,0)这两个单元格应该怎么写? 下面的写法不对吗? ws.write_merge(0, 1, 0, 0, u"序号" ...

  7. excel单元格内加空格_Excel表格数据里面快速插入空格

    在"Sheet1"的代码框里面输入以下程序代码: Sub KongGe() Dim i1, i2, i3, i4, str1 On Error Resume Next  '忽略运行 ...

  8. 【pandas】将单元格中的多个数据拆分为多行数据(explode),以csv文件为源文件进行处理

    [pandas]将单元格中的多个数据拆分为多行数据(explode) 1.原始数据(test.csv) 2.需求 将"别名"."科目"这两列中带有多个数据的单元 ...

  9. Java读取和解析Excel数据:基于Apache POI(二)

    Java读取和解析Excel数据:基于Apache POI(二) 假设附录1文章中的test.xls是对员工的考勤记录表.需要根据这张excel表统计员工的加班时间,那么需要重点关注第五列的下班时候的 ...

最新文章

  1. 在Kubernetes v1.8中使用RBAC
  2. 这篇文章,或许可以改善你的不快乐。
  3. OSChina 周五乱弹 —— 静静的思考下人生
  4. 处理文件和文件夹的模块---os
  5. RPC框架系列——Protocol Buffers
  6. CSDN创作的markdown语法
  7. Python自动单元测试框架
  8. Java知识点详解 6 注解
  9. 基于文本和语音的双模态情感分析
  10. 计算机多媒体故障,多媒体教室设备常见故障及处理方法
  11. entsel约束条件lisp_autocad-plugin
  12. php 开启 ziparchive,php ZipArchive类使用实例详解
  13. 高等数学张宇18讲 第七讲 一元函数积分学的概念与计算
  14. 对计算机系统进行软件攻击,win10系统预防电脑被系统漏洞攻击的操作方法
  15. 社区新闻舆情报道收集工作怎么做好的方法
  16. Java常用对象总结
  17. mysql服务器存储视频文件,把视频文件直接存储到mysql数据库的方法
  18. 鸿蒙系统怎么刷emui11教程
  19. 原子性操作atomic_t
  20. 双屏 3840 * 1080 如何装逼?不同的屏幕显示不同的壁纸。php 定时脚本下载必应每日壁纸。

热门文章

  1. 字节跳动裁员不发年终奖致员工与HR薅头发互殴?字节回应来了
  2. 前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
  3. 饱和气压与温度的关系_饱和蒸汽温度与压力关系对照表
  4. 多目标应用:多目标蜣螂优化算法求解多旅行商问题(Multiple Traveling Salesman Problem, MTSP)
  5. java from space to space_快速定位Java 内存OOM的问题
  6. XXL-JOB(2)-使用
  7. VC组合框的使用示例
  8. 人脑是量子计算机科学实验,你的大脑可能是一台量子计算机
  9. RAID磁盘冗余阵列
  10. Elasticsearch教程---高亮搜索(十二)