时间:2020.12.02
环境:Python3
目的:使用xlrd读取Excel文件的一般操作
说明:
作者:Zhong QQ交流群:121160124 欢迎加入!
安装xlrd
pip install -i https://pypi.douban.com/simple xlrd
准备演示使用的excel文件 demo.xlsx 写入以下的测试数据
ID | 姓名 | 年龄 | 登记日期 |
---|---|---|---|
1 | 小A | 1 | 2020.12.02 |
2 | 小B | 2 | 2020.12.03 |
3 | 小C | 3 | 2020.12.04 |
4 | 小D | 4 | 2020.12.05 |
5 | 小E | 5 | 2020.12.06 |
6 | 小F | 6 | 2020.12.07 |
7 | 小G | 7 | 2020.12.08 |
8 | 小H | 8 | 2020.12.09 |
9 | 小I | 9 | 2020.12.10 |
10 | 小J | 10 | 2020.12.11 |
11 | 小K | 11 | 2020.12.12 |
12 | 小L | 12 | 2020.12.13 |
13 | 小M | 13 | 2020.12.14 |
14 | 小N | 14 | 2020.12.15 |
15 | 小O | 15 | 2020.12.16 |
16 | 小P | 16 | 2020.12.17 |
17 | 小Q | 17 | 12/18/2020 |
18 | 小R | 18 | 12/19/2020 |
19 | 小S | 19 | 2020年12月20 |
20 | 小T | 20 | 2020年12月21日 |
如图
以上写入了默认的Sheet表Sheet1表21行4列的数据 第一行为标题行 登记日期写入的数据有不同的单元格类型 以下是常用的一些基本操作
import xlrd
from xlrd import xldate_as_datetime
from pprint import pprint
def readExcel(path) -> dict:
# 打开Excel表格 文件名和表名都需要正确
ExcelFile = xlrd.open_workbook(path)
# 获取Sheet
Sheet1 = ExcelFile.sheet_by_name('Sheet1') # 通过名称获取Sheet
# Sheet1 = ExcelFile.sheet_by_index(0) # 通过索引获取Sheet
# Sheet属性 获取Shee1的名称、总行数、总列数等信息
sheet_name = Sheet1.name # 名称
sheet_nrows = Sheet1.nrows # 行数
sheet_ncols = Sheet1.ncols # 列数
print(" Sheet名称: %s\n" % sheet_name, "Sheet总行数: %s\n" % sheet_nrows, "Sheet总列数: %s\n" % sheet_ncols)
print("\n" + "* " * 100)
# Sheet单元格属性cell 对一个具体的单元格操作 如获取第2行第2列单元格数据值
cell_value1 = Sheet1.cell(1, 1).value # cell的值
cell_value2 = Sheet1.cell_value(1, 1) # cell值 等效于cell().value
cell_type = Sheet1.cell_type(1, 1)
print("一个单元格内容: \n%s" % cell_value1)
print("一个单元格内容: \n%s" % cell_value2)
print("一个单元格内容类型: \n%s" % cell_type)
print("\n" + "* " * 100)
# Sheet获取一行的数据和一列的数据及相关属性
row_value = Sheet1.row(1) # 获取第2行的数据 值的类型有标注 [number:1.0, text:'小A', number:1.0, text:'2020.12.02']
row_slice_value = Sheet1.row_slice(rowx=1, start_colx=0, end_colx=None) # row()方法的扩展 可指定范围
row_values = Sheet1.row_values(rowx=1, start_colx=0, end_colx=None) # 一行数据 rowx:第几行 start_colx:从第几列开始 end_colx:到第几列结束(None 表示到最后一列) 类似于字符串split方法的概念
row_len = Sheet1.row_len(1) # 获取第二行长度(至有数据的最后一列的长度)
row_types = Sheet1.row_types(rowx=1, start_colx=0, end_colx=None) # 获取一行数据的类型
table_header = Sheet1.row_values(rowx=0, start_colx=0, end_colx=None) # 获取标题单元格(第一行)
print("一行的值(带类型): \n%s" % row_value)
print("一行指定开始和结束范围的值(带类型): \n%s" % row_slice_value)
print("一行指定开始和结束范围的值: \n%s" % row_values)
print("一行数据的长度: \n%s" % row_len)
print("一行数据的类型: \n%s" % row_types)
print("第一行的内容为: \n%s" % table_header)
print("\n" + "* " * 100)
# 获取Sheet所有内容 格式为[[row_values], [row_values], ...... ]
ls = [] # 定义一个列表用来存储所有的行数据
for row in range(1, sheet_nrows): # 从第2行开始 第1行一般是表头 以实际情况为准
# 获取一行的值 为列表类型
values = Sheet1.row_values(rowx=row, start_colx=0, end_colx=None)
# 获取登记日期列的单元格内容类型
ctype = Sheet1.cell_type(rowx=row, colx=3)
# 处理ctype类型值为2/3的日期类型为期望类型
if ctype in [2, 3]:
# 转换为年月日格式的类型 datemode参数为时间基准标识符 0代表1900-01-01为基准,1代表1904-01-01为基准 通常选择0
_date = xldate_as_datetime(xldate=Sheet1.cell_value(rowx=row, colx=3), datemode=0).strftime("%Y-%m-%d")
values[3] = _date
# print(values)
ls.append(values)
pprint(ls)
print("\n" + "* " * 100)
return {"msg": "ok"}
# 文件的路径,如果路径或者文件名有中文前面加一个r代表原生字符。
res = readExcel(r"C:\Users\Zhong\Desktop\demo.xlsx")
print(res)
Note
- 索引是从(0, 0)开始
- 一般excel文件中获取数据的内容时内容部分是从第二行开始
- 单元格内容类型一般有0-6 7种类型 如下
Type symbol | Type number | Python value |
XL_CELL_EMPTY | 0 | empty string '' |
XL_CELL_TEXT | 1 | a Unicode string |
XL_CELL_NUMBER | 2 | float |
XL_CELL_DATE | 3 | float |
XL_CELL_BOOLEAN | 4 | int; 1 means TRUE, 0 means FALSE |
XL_CELL_ERROR | 5 | int representing internal Excel codes; for a text representation, refer to the supplied dictionary error_text_from_code |
XL_CELL_BLANK | 6 | empty string ''. Note: this type will appear only when open_workbook(..., formatting_info=True) is used |
加入qq群交流技术 关注微信公众号