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

news2025/2/28 3:28:43

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 + 1

        while len(table.cell_value(rowx=irow, colx=icol)) == 0:
            irow = irow + 1

        while 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 + 1
    
irow

保持解析结果到文件中:

import pandas as pd

df.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于粒子群算法的配电网重构研究matlab程序

基于粒子群算法的配电网重构研究matlab程序 参考文献&#xff1a;基于改进灰狼算法的含分布式电源配电网重构研究 &#xff08;本文未考虑分布式电源&#xff09; 摘要&#xff1a;使用基本环矩阵编码的智能优化算法在处理配电网重构问题中&#xff0c;通常使用无序的解空间&a…

机械硬盘,Win10系统,磁盘100%

问题描述 使用机械硬盘&#xff0c;装了Win10系统&#xff0c;打开文件夹或程序&#xff0c;非常的慢&#xff0c;通过任务管理器查看性能&#xff0c;显示磁盘一直处于100%的状态。电脑概览如下&#xff1a; 电脑型号 技嘉 B460MAORUSPRO 操作系统 Microsoft Windows 10 专业…

PyQt5学习笔记--多线程处理、数据交互

目录 1--引入多线程的原因 2--PyQt多线程的基本知识 3--多线程登录程序的实例 4--参考 1--引入多线程的原因 ① 如果Qt只采用单线程任务的方式&#xff0c;当遇到数据处理慢的情形时&#xff0c;会出现GUI卡死的情况。 ② 使用下述例子展示单线程任务的缺陷&#xff1a; …

Java学习之继承的本质(重要)

目录 目录 一、一个继承的代码案例 二、子类创建的内存布局 三、查找顺序 一、son.name的输出结果 二、son.age的输出结果 三、son.hobby的输出结果 一、一个继承的代码案例 package com.hspedu.entends_;/*** 讲解继承的本质*/ public class ExtendsTheory {public sta…

Spring Boot 项目的创建和简单使用

目录 1. 什么是 Spring Boot, Spring Boot 框架有什么优点 2. Spring Boot 项目的创建 2.1 在 IDEA 下安装 Spring Boot Helper 插件: 2.2 创建 Spring Boot 项目: 2.3 网页版创建 Spring Boot 项目 3. Spring Boot 通过路由映射到本地程序 1. 什么是 Spring Boot, Spring …

MFC编辑框控件属性和用法

目录 一、编辑框的属性 1.want return 2.Multiline 3.滚动条 4.添加完效果 二、初始化编辑框内容 三、复制与退出 四、edit control的值类型 五、思维拓展 一、编辑框的属性 默认情况下编辑框edit control 是可以横向无限输入的 1.want return 支持换行&#xff0c;…

dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

Private Execution on Blockchain

1.Alan Szepieniec: Ghost-Queen Chess——复杂金融合约 Alan Szepieniec为Neptune合伙人。 为何需关注decentralized Finance&#xff1f; 1&#xff09;从学术角度来看&#xff1a;是 密码学 ∩\cap∩ 分布式系统 ∩\cap∩ 经济学 ∩\cap∩ …的集合。2&#xff09;从工程…

基于蚁群算法的多配送中心的车辆调度问题的研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

BUUCTF Misc ningen1 小明的保险箱1 爱因斯坦1 easycap1

ningen1 下载文件 使用kali中的binwalk查看 binwalk xxx.jpg 分离文件 打开 压缩包加密了&#xff0c;爆破 爆破成功&#xff0c;密码&#xff1a;8368 得到flag flag{b025fc9ca797a67d2103bfbc407a6d5f} 小明的保险箱1 下载文件 用010 editor打开 可以看到图…

Java初识泛型

什么是泛型 泛型是jdk1.5引入的新语法&#xff0c;泛型就是适用于许多许多类型&#xff0c;就是对类型实现了参数化。实现一个类&#xff0c;类中包含一个数据成员&#xff0c;使得数组中可以存放任何类型的数据&#xff0c;也可以根据成员方法返回数组中某个下标的值 class M…

linux-免费ssl证书

title: linux-免费ssl证书 categories: Linux tags: [linux, xshell] date: 2022-09-10 19:29:55 comments: false mathjax: true toc: true linux-免费ssl证书 前篇 33种免费获取SSL证书的方式 - https://zhuanlan.zhihu.com/p/174755007 HTTPS 证书文件格式转换 HTTPS证书文…

基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

acm退役小记

本人大学是接近一本线的二本大学&#xff0c;目前能打的区域赛场基本打完了&#xff0c;桂林rank105和沈阳rank140是有两个区域赛铜。如果我是强校的话&#xff0c;也会说下只能拿废物铜耻辱退役 这里简单记下我的acm生涯 其实我一直觉得对于我们这种弱校&#xff0c;虽然打a…

delete删除后怎么恢复文件?四种方法进行找回

演示机型&#xff1a;技嘉 H310M HD22.0 系统版本&#xff1a;Windows 10 专业版 很多小伙伴在日常工作或生活中&#xff0c;喜欢通过delete键进行删除文件&#xff0c;虽然这种删除方式快捷方便&#xff0c;但是也容易出现误删的情况&#xff0c;那么用delete键删除的文件可以…

【语音识别】高斯混合模型(GMM)说话人识别【含Matlab源码 574期】

⛄一、高斯混合模型简介 GMM基本框架 类似的还有GMM-UBM(Universal background model)算法&#xff0c;其与GMM的区别在于&#xff1a;对L类整体样本训练一个大的GMM&#xff0c;而不像GMM对每一类训练一个GMM模型。SVM的话MFCC作为特征&#xff0c;每一帧作为一个样本&#…

golang的new和make

golang 变量定义的方式 可以通过 var变量名称变量类型 进行声明变量&#xff0c;当我们没有给它赋值的时候&#xff0c;它们的结果是变量类型的零值&#xff0c;例如&#xff1a; string 的零值是"",int 的零值是0&#xff0c;引用类型的零值是nil。 前面两种类型…

Android加载第三方so库

本篇文章使用的android studio版本是:Android Studio Bumblebee | 2021.1.1 Patch 2 上一篇文章&#xff1a;Android开发java调用C简单示例 演示了java调C&#xff0c;那么so文件能否复用到别的项目了&#xff1f; 这次我们尝试用上一篇文章生成的so库&#xff0c;调用里面的…

APK 签名 v1 v2 步骤

APK 签名 v1 v2 步骤 需要工具 **apksigner.jar jarsinger.exe keytool.exe zipalign.exe ** 1.生成 keystore keytool -genkey -v -keystore my.keystore -alias liuhan -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -dname "cnTest,ouTest,cCA" -validity …

【机器学习入门项目10例】(六):KMeans聚类

💥 项目专栏:【机器学习入门项目10例】 文章目录 一、KMeans聚类二、数据集介绍三、KMeans聚类算法介绍四、定义KMeans模型4.1 kmeans算法入口4.2 初始化簇4.3 计算DBI优化指标4.4 计算每个样本到簇中心的距离4.5 更新每个样本所属的簇分类4.6 更新每个簇的中心4.7 官方实现…