● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享。
○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可。 ____Ⓙ即刻@王昭没有君
本文仅为笔者摸索总结-欢迎订正补充交流讨论-
❤python识别excel文件格式 ——(专栏:基于python编写简单office阅卷程序②)
————————
一、整体思路:
🍒1. 使用python第三方库Openpyxl识别尽可能多的excel格式;(更简单方便)
- openpyxl库不支持读取.xls格式文件,支持.xlsx格式文件,请提醒学生上交.xlsx文件
- 若文件格式为.xls格式考虑改用xlrd库读取,语法与Openpyxl大同小异,请读者自行探索吧~
- 使用 dir() 查看当级存在的属性或下级对象(不含双下划线__的)
- 使用 (.属性)试图调用查看属性,或(.对象)进入下级对象
🍒2. 将.xlsx转为.xml格式文件,读取标签,补充识别Openpyxl库无法识别的格式;
- 解压excel.xlsx文件为xml文件(不止一个,有好几个文件夹)
- 找到相应的属性在xml文件中的存储标签名和层级
- 使用(层级.tag)(层级.attrib)(层级.text) 试图取出该属性
🍒3. office有个懒惰且简洁的规则是,很多默认属性和格式,若该文档中作者未修改默认格式或属性,则在xml文件中该属性或格式的标签不存在 ,则在用python抽取该格式或属性时,返回值为None或空,有时还会提示不存在而报错。例如:
- 默认字体为等线(有的版本是宋体)
- 默认字号11(也可能因版本不同而不同或.xls和.xlsx差异)
- 默认无边框等
而在修改了这些格式后,该属性标签会存储在.xlsx和.xml文件中。又不像是完全的日志文件。
————————
二、使用python库情况
此处均为笔者编写阅卷程序用到的,若只识别excel格式,并不需要以下全部:
import xlrd # 读取excel文件,主要是获取名单和创建地址用
import openpyxl # 读取excel试卷,因为相比与xlrd的语法我更喜欢
#想用xlrd读取试卷.xlsx也可以,如果是试卷.xls文件则只能用xlrd库读
import os # 使用文件路径等
import xml.etree.ElementTree as ET # 读取xml文件
除此之外,在解压转为xml文件时还用到以下库:
import os # 因笔者分开写的解压程序,解压也用到os库
import xlrd # 因笔者分开写的解压程序,解压也用到xlrd库,主要是获取名单和创建地址用
import shutil # 删除配置文件
import zipfile
# 解压word(.docx)、excel(.xlsx)、ppt(.pptx)文件成为.xml格式文件
————————
三、openpyxl库识别表格文件结构:
-
workbook:
-
worksheets:
- rows:
- cells:
- columns:
- cells:
- cells:
- rows:
-
-
worksheet可.调用行列也可直接调用单元格,行列也可调用行列内的单元格
-
图表和文本框游离于行列和单元格
🍍1.读取工作簿:openpyxl.load_workbook ( ’ 文件地址 ’ )
workbook = openpyxl.load_workbook(r"F:\测试\csdn.xlsx") # 默认data_only = True 仅取值
workbook2 = openpyxl.load_workbook(r"F:\测试\csdn.xlsx", data_only = False ) # 取公式
(1)data_only参数默认为True,读取时仅读取值,data_only =False时则读取公式。
(2)使用 dir(workbook) 查看当级存在的属性或下级对象(不含双下划线__的);
🍍2.读取工作表:workbook.worksheets[序号]
print(workbook.sheetnames) # 输出所有sheet表名 (列表形式)
worksheet = workbook.worksheets[0] # 按照顺序读取工作表,这个最好用,有的学生乱改名
worksheet = workbook['Sheet1'] # 按照工作表名读取工作表
worksheet = workbook.get_sheet_by_name("New Title")
# 按照工作表名读取工作表的另一种写法,不如workbook['Sheet1']好用,后续有些属性读不出来或报错提醒
worksheet = workbook.create_sheet("表名") # 创建新工作表,写在这里但阅卷用不到
(1)使用 dir(worksheet) 查看当级存在的属性或下级对象(不含双下划线__的);
(2)有关工作表的属性基本都在worksheet部分里;很遗憾行高列宽不在;
(