在Django中使用xlrd读取excel表格数据

目录

方法一:按行读取

方法二:按表头与表数据一一对应的关系

方法三:按列的方式读取


之前有说到如何在Django中读取数据库数据写入到excel中 今天来说说如何读取excel中的数据,(读取后就可以写入到数据库中了)​​​​​​​

开始前需要安装xlrd模块

pip install -i https://pypi.douban.com/simple xlrd

 默认安装最新版,支持xls格式的excel文件,如果是xlsx文件格式可能需要安装旧版本的xlrd

方法一:按行读取
import xlrdclass ReadExcel(View):def post(self, request):excel_file = request.FILES['excel_file']  # 获取上传的Excel文件workbook = xlrd.open_workbook(file_contents=excel_file.read())  # 打开Excel文件sheet_names = workbook.sheet_names()  # 获取所有工作表的名称# 方式一:按行data = []  # 存储所有工作表的数据for sheet_name in sheet_names:sheet = workbook.sheet_by_name(sheet_name)  # 获取具体的工作表rows = []for row_num in range(sheet.nrows):  # 迭代每一行数据row_values = sheet.row_values(row_num)  # 获取当前行的值rows.append(row_values)data.append({'sheet_name': sheet_name,'rows': rows,})return JsonResponse({"res": data})

使用book_data.xls表格文件,内容如下

 输出结果:

{"res": [{"sheet_name": "图书表","rows": [["图书名","地址","年代"],["《Python+Cookbook》第三版中文v3.0.0.pdf","天津市","1999.11"],["Django 2.2 官方文档中文版.pdf","北京市东城区","1980.07"],["MySQL必知必会(文字版).pdf","南京市鼓楼区","2020.08"],["PyCharm知识手册V1.0.pdf","安徽合肥市","1987.12"],["流畅的Python.pdf","南京高淳区","2000.01"],["深入理解Python中文版高清(Dive+into+Python)@www.java1234.com.pdf","河南洛阳","2023.10 "]]},{"sheet_name": "Sheet2","rows": [["图片名","路径"],["测试","测试路径"]]},{"sheet_name": "Sheet3","rows": []}]
}

方法二:按表头与表数据一一对应的关系
import xlrdclass ReadExcel(View):def post(self, request):excel_file = request.FILES['excel_file']  # 获取上传的Excel文件workbook = xlrd.open_workbook(file_contents=excel_file.read())  # 打开Excel文件sheet_names = workbook.sheet_names()  # 获取所有工作表的名称# 方式二:按表头与表数据一一对应关系data = []  # 存储所有工作表的数据for sheet_name in sheet_names:sheet = workbook.sheet_by_name(sheet_name)  # 获取具体的工作表if sheet.nrows != 0:rows = []first_row = sheet.row_values(0)  # 原表头数据# first_row = ['name', 'address', 'year']  # 使用对应的英文字段替换上面first_row从表中获取的中文表头名for row_num in range(1, sheet.nrows):  # 迭代每一行数据row_values = sheet.row_values(row_num)  # 获取当前行的值zip_data = dict(zip(first_row, row_values))rows.append(zip_data)data.append({'sheet_name': sheet_name,'rows': rows,})return JsonResponse({"res": data})

结果如下:

{"res": [{"sheet_name": "图书表","rows": [{"图书名": "《Python+Cookbook》第三版中文v3.0.0.pdf","地址": "天津市","年代": "1999.11"},{"图书名": "Django 2.2 官方文档中文版.pdf","地址": "北京市东城区","年代": "1980.07"},{"图书名": "MySQL必知必会(文字版).pdf","地址": "南京市鼓楼区","年代": "2020.08"},{"图书名": "PyCharm知识手册V1.0.pdf","地址": "安徽合肥市","年代": "1987.12"},{"图书名": "流畅的Python.pdf","地址": "南京高淳区","年代": "2000.01"},{"图书名": "深入理解Python中文版高清(Dive+into+Python)@www.java1234.com.pdf","地址": "河南洛阳","年代": "2023.10 "}]},{"sheet_name": "Sheet2","rows": [{"图片名": "测试","路径": "测试路径"}]}]
}

方法三:按列的方式读取
import xlrdclass ReadExcel(View):def post(self, request):excel_file = request.FILES['excel_file']  # 获取上传的Excel文件workbook = xlrd.open_workbook(file_contents=excel_file.read())  # 打开Excel文件sheet_names = workbook.sheet_names()  # 获取所有工作表的名称# 方式三:按列的方式data = []  # 存储所有工作表的数据for sheet_name in sheet_names:sheet = workbook.sheet_by_name(sheet_name)  # 获取具体的工作表if sheet.nrows != 0:cols = []cols_data = {}for col_num in range(sheet.ncols):  # 迭代每一列数据first_row = sheet.col_values(col_num, 0, 1)[0]  # 获取每一列第一行的数据(也就是表头)col_values = sheet.col_values(col_num, 1)  # 从列的第二行开始获取数据cols_data.update({first_row: col_values})cols.append(cols_data)data.append({'sheet_name': sheet_name,'cols': cols,})return JsonResponse({"res": data})

结果如下:

{"res": [{"sheet_name": "图书表","cols": [{"图书名": ["《Python+Cookbook》第三版中文v3.0.0.pdf","Django 2.2 官方文档中文版.pdf","MySQL必知必会(文字版).pdf","PyCharm知识手册V1.0.pdf","流畅的Python.pdf","深入理解Python中文版高清(Dive+into+Python)@www.java1234.com.pdf"],"地址": ["天津市","北京市东城区","南京市鼓楼区","安徽合肥市","南京高淳区","河南洛阳"],"年代": ["1999.11","1980.07","2020.08","1987.12","2000.01","2023.10 "]}]},{"sheet_name": "Sheet2","cols": [{"图片名": ["测试"],"路径": ["测试路径"]}]}]
}

共列出三种方式读取

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql8安装教程与配置

添加密码 出现报错 MySQL error 1042: Unable to connect to any of the specified MySQL hosts. Failed to connect to MySQL Server 8.0.23 after 10 attempts. Ended configuration step: Starting the server 使用WinR --> 运行 “services.msc” --> 打开service服…

【通览一百个大模型】LaMDA(Google)

【通览一百个大模型】LaMDA(Google) 作者:王嘉宁,本文章内容为原创,仓库链接:https://github.com/wjn1996/LLMs-NLP-Algo 订阅专栏【大模型&NLP&算法】可获得博主多年积累的全部NLP、大模型和算法干…

NVIC的中断挂起寄存器和EXTI的中断挂起寄存器的区别

!!!!!!!!!!!!!!!!仅个人拙见,若有错误,欢迎大家指正&#xff0…

9.33UEC++、容器

1.定义: 2.TArray:快,小,高 :同质容器 :创建栈对象,不能创建堆对象 如何构建TArray: 获取方式: 实现方式:定义一个array容器数组,两种遍历方式…

E. Scuza - 二分+前缀和

分析: 暴力会超时,可以用二分,构建两个数组,一个是a[i],作为前缀和数组,一个是f[i]表示第i个台阶之前的最大高度的台阶,然后每次二分来查找k,因为尽可能地走的多,所以查找…

OpenCV库进行图像旋转、仿射变换和透视变换

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>

2023/7/8总结

Tomcat 启动&#xff1a;双击bin目录下的startup.bat文件停止&#xff1a;双击bin目录下的shutdown.bat 文件访问 &#xff1a;http://localhost:8080&#xff08;默认是8080&#xff0c;可以修改&#xff09; git的使用 打开git bash git config --global user.name "名…

11 S整数小波分解图像(matlab程序)

1.简述 学习目标&#xff1a; 非标准小波分解&#xff08;用S整数变换&#xff09; 小波分解过程&#xff1a;读取加入噪声后的图片后&#xff0c;数据即是高度*宽度个数据点。对此矩阵数据要做二维离散小波分解&#xff0c;二维小波变换和一维小波变换的区别从原理上来说就是…

分别基于红黑树、timefd、多级时间轮实现定时器

文章目录 一、定时器的应用二、定时器的触发方式2.1 网络事件和定时事件在一个线程中处理2.2 二、定时器的设计2.1 接口设计2.2 数据结构设计2.2.1 红黑树2.2.3 最小堆2.2.4 时间轮 三、利用红黑树实现定时器3.1 数据结构3.2 接口实现3.2.1 初始化定时器3.2.2 添加定时器3.2.3 …

dubbo入门

Dubbo概述 官网&#xff1a; https://dubbo.apache.org Dubbo快速入门 1 安装zk 参考 https://blog.csdn.net/qq_34914039/article/details/131614771 2 实现步骤

【Linux系统编程】20.程序、进程、CPU和MMU、PCB

目录 程序 进程 CPU和MMU PCB 程序 编译好的二进制文件&#xff0c;存在磁盘上&#xff0c;只占用磁盘资源。 进程 进程是活跃的程序&#xff0c;占用系统资源&#xff0c;在内存中执行。程序运行起来&#xff0c;产生一个进程。 程序类似于剧本&#xff0c;进程类似于一场…

Docker学习笔记16

在生产环境中使用Docker&#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行数据共享。 容器管理数据有两种方式&#xff1a; 1&#xff09;数据卷&#xff1a;容器内数据直接映射到本地主机环境&#xff1b; 2&#xff09;数据卷容器&#xff1a;…