常用的读取Excel文件数据的Python库有3种:
(1)xlrd
(2)openpyxl
(3)pandas
读取xlsx或者xlsm文件,选择openpyxl和pandas提供的接口;如果是xls文件,可以选择xlrd。
这里记录一下我在读取.xlsm文件过程中遇到的问题、以及验证通过的代码。
准备工作:
通过PyCharm的[File - Settings]分别下载了xlrd、openpyxl、pandas的最新版本。
用xlrd的方法来读取.xlsm文件:
Workbook = xlrd.open_workbook("D:\\Test\\src1.xlsm")
报错:xlrd.biffh.XLRDError: Excel xlsx file; not supported
下面这篇文章里提到:“xlrd包的版本过高(2.0.1),不支持xlsx格式,只支持xls格式。”
https://blog.csdn.net/qq_45975931/article/details/128379809
里面提供了2种解决方法:
一、调低xlrd版本
二、调低excel版本
方法1我不想尝试,因为不知道低版本会不会引来其他问题。
方法2就是把xlsm文件另存为.xls格式,读取.xls文件的数据。结果是可行的。
下面是运行OK的代码:
import xlrd
def read_data():
# 指定xls文件路径
workbook = xlrd.open_workbook("D:\\Test\\src1.xls")
# 指定sheet名称
sheet = workbook.sheet_by_name('SampleSheet')
# 从0开始计数,5行3列,相当于'D6'单元格
row = 5
col = 3
value = sheet.cell_value(row,col)
print(value)
但是这样做代码逻辑就变成了①先把xlsm转存为xls,②读取数据,③删除临时文件。我觉得太多余了,所以试了另外两个库。
用openpyxl的load_workbook方法读取.xlsm文件,结果可行。
代码如下:
from openpyxl import load_workbook
def read_data():
# 指定文件路径,data_only属性作用是取值,不取公式
workbook = load_workbook(filename="D:\\Test\\src1.xlsm", data_only=True)
# 指定sheet页
sheet = workbook["SampleSheet"]
# 取D6单元格的值
result = sheet["D6"].value
print('Result:'+result)
workbook.close()
用pandas的read_excel方法读取.xlsm文件,结果可行。
代码如下:
import pandas as pd
def read_data():
# 指定文件路径和sheet名称,不设置header
df = pd.read_excel("D:\\Test\\src1.xlsm",sheet_name='SampleSheet',header=None)
# 从0开始计数,5行3列,相当于D6单元格
result = df.iloc[5,3]
print('result:'+result)
另外,pandas还有read_csv方法用于读取csv文件,to_csv用于生成csv文件。
最后选择用pandas库来实现我需要的功能。