目录
7.2.1 逐级获得wb的下级对象数组,sheets对象数组
7.2.2 直接获得wb的下级sheets对象的一些属性,用特定方法
7.2.5 获取某个具体的sheet 里的单元格,范围内容呢?
1 什么是xlrd 和 xlwt
- 一般来说
- xlrd是用来读取excel的模块
- xlwt是用来写入excel的模块
2 导入xlwt
import xlwt
3 xlwt相关语法
3.1 创建新的workbook
wb = xlwt.Workbook(encoding='utf-8')
3.2 创建新的sheet
sh = wb.add_sheet("test")
3.3 保存workbook
一定要保存后才能看到修改的结果
savePath = r'C:\Users\Administrator\Desktop\1002.xls'
wb.save(savePath)
4 python里表格的形式
4.1 矩阵
先回忆下数学里的矩阵 Ai*j
4.2 EXCEL的数据形式== 完全等于矩阵的数字结构
行=矩阵的行
列=矩阵的列
4.3 python里矩阵
矩阵的保存形式是这样的
列表:一般是指矩阵里的1行,
因此列表的长度:一般是指矩阵的行数
列表的某1个元素的长度:一般是指矩阵的列数
head = ['列1','列2','列3']
data = [['a11','a12','a13'],['a22','a22','a23']]
5 xlwt相关的具体代码
5.1 代码
import xlwt
wb = xlwt.Workbook(encoding='utf-8')
sh = wb.add_sheet("test")
head = ['列1','列2','列3']
data = [['a11','a12','a13'],['a22','a22','a23']]
for i in head:
sh.write(0,head.index(i),i)
for i in range(len(data)):
for j in range(len(data[i])):
sh.write(i+1,j,data[i][j])
savePath = r'C:\Users\Administrator\Desktop\1002.xls'
wb.save(savePath)
5.2 结果
5.3 要注意的问题
5.3.1 不能是已有的表,会报错:权限拒绝
5.3.2 保存的格式
- 只能是xls
- 不能是xlsx
- 不能是xlsm
- 后面2种保存后会打不开
5.3.3 路径的方式
- savePath = r'C:\Users\Administrator\Desktop\1002.xls'
- savePath = 'C:\\Users\\Administrator\\Desktop\\1002.xls'
6 导入xlrd
- import xlrd
6.1 可能的问题
- 这里可能会有问题,比如我用的anaconda,默认只安装了xlwt,但是没有安装xlrd
- import xlrd 会报错,找不到 xlrd模块
- 然后呢
- 你需要在anaconda里用cmd或者powershell,去运行命令行
- 输入 conda list 或者 pip show xlrd 可以发现没有xlrd
- 安装:pip install xlrd 即可
6.2 安装xlrd后,可以查看安装的版本号
import xlrd
print(xlrd.__version__)
7 xlrd的相关语法
7.1 获取现有的EXCEL文件workbook
- xlrd.open_workbook(path) 返回的就是对应的wb文件的对象
import xlrd
print(xlrd.__version__)##创建wb对象,打开对应的wb表对象
wb=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\2001.xls')
7.2 获取wb下的sheets表的信息
7.2.1 逐级获得wb的下级对象数组,sheets对象数组
- 首先,和EXCEL本身的结构一样
- workbook的下级对象是sheets 对象
- sheets=wb.sheets() 返回的是一个对象数组 [Sheet 0:<sheet101>, Sheet 1:<sheet102>, Sheet 2:<sheet103>]
- 取得数组长度, len(sheets) ,而不是sheets.count
#获取wb对象下的,sheet对象,且是个对象数组
sheets=wb.sheets()
print(sheets)
print(len(sheets))
print(sheets.count) #错误sheets.count <built-in method count of list object at 0x00000205AD7AE5C0>
- 取得sheets对象后,也可以取得其中sheet对象的属性,比如sheet.name等
#直接获取sheet对象的.属性呢?可以么?可以,但只能是 sheet.name 没有 sheets.name
sheets=wb.sheets()
for sh in sheets:
print(sh.name)
7.2.2 直接获得wb的下级sheets对象的一些属性,用特定方法
- 也可以直接去获取wb对象下的sheets对象的名字数组,这不是对象数组,而是字符串数组
- sheetnames=wb.sheet_names()
- 直接获得是字符串数组 ['sheet101', 'sheet102', 'sheet103']
#也可以直接去获取wb对象下的sheets对象的名字数组,这不是对象数组,而是字符串数组
sheetnames=wb.sheet_names()
print(sheetnames)
7.2.3 获取某个具体的sheet
获取某个具体的sheet有3种方法
- 方法1#取wb得sheet对象数组里得某一个
- sh1=wb.sheets()[0]
- 方法2#根据sheet的次序去取
- sh2=wb.sheet_by_index(1)
- 方法3 #根据具体的sheet显示名去取
- EXCEL里sheet的显示名不同于程序内部的真实name或者index
- sh3=wb.sheet_by_name("sheet101")
- 报错处理
- 但是要注意,按照这些方法查找,需要确实有对应的sheet否则报错
- #sh4=wb.sheet_by_name("sheet1001") #错误sheet名会引起报错
- 返回内容
- #要注意一般取得都是sheet对象,取得对象属性还需要用 sh1.name等
7.2.4 获取某个具体的sheet 里的行数列数等
- rows=sh1.nrows
- columns=sh1.ncols #写sh1.ncolumns报错...
rows=sh1.nrows
columns=sh1.ncols #写sh1.ncolumns报错...
print(rows)
print(columns)print("{0}这个表有{1}行{2}列".format(sh1.name,rows,columns))
print(sh1.name,"这个表有",rows,"行",columns,"列")
print(f"sh1.name这个表有rows行columns列")
print("%s这个表有%d行%d列" %(sh1,rows,columns))
7.2.5 获取某个具体的sheet 里的单元格,范围内容呢?
8 xlrd相关的具体代码
8.1 一段试验代码
- 打开EXCEL的workbook
- 找到sheets, sheet_names(),或者具体的sheet
- 取得sheet内的内容
import xlrd
print(xlrd.__version__)
##创建wb对象,打开对应的wb表对象
wb=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\2001.xls')
#获取wb对象下的,sheet对象,且是个对象数组
sheets=wb.sheets()
print(sheets)
print(len(sheets))
print(sheets.count) #错误sheets.count <built-in method count of list object at 0x00000205AD7AE5C0>
#也可以直接去获取wb对象下的sheets对象的名字数组,这不是对象数组,而是字符串数组
sheetnames=wb.sheet_names()
print(sheetnames)
#直接获取sheet对象的.属性呢?可以么?可以,但只能是 sheet.name 没有 sheets.name
sheets=wb.sheets()
for sh in sheets:
print(sh.name)
print()
##获取某个具体的sheet
#取wb得sheet对象数组里得某一个
sh1=wb.sheets()[0]
#根据sheet的次序去取
sh2=wb.sheet_by_index(1)
#根据具体的sheet显示名去取(EXCEL里sheet的显示名不同于程序内部的真实name或者index)
sh3=wb.sheet_by_name("sheet101")
#sh4=wb.sheet_by_name("sheet1001") #错误sheet名会引起报错
#从wb的sheet数组里取得是对象,取得对象属性还需要用 sh1.name等
print(sh1)
print(sh1.name)
print(sh2)
print(sh3)
print()
##获取sheet里的内容
rows=sh1.nrows
columns=sh1.ncols #写sh1.ncolumns报错...
print(rows)
print(columns)
print("{0}这个表有{1}行{2}列".format(sh1.name,rows,columns))
print(sh1.name,"这个表有",rows,"行",columns,"列")
print(f"sh1.name这个表有rows行columns列")
print("%s这个表有%d行%d列" %(sh1,rows,columns))
#sheet1=sheetname[0]
#print(sheet1)
#获得sheet内的内容
#sheet1_data=sheet1.sheet_by_name("sheet101")
#print(sheet1.data.name)
#print(f"表:{sheet1_data.name} \n 行数:" sheet1_data.nrows \n 列数:" sheet1_data.ncolumns)
#关于xlrd,xlwt的格式设置,我觉得并不重要,需要用的时候再查把