python处理Excel

相关说明:
1、Python自带的csv模块可以处理.csv文件。

2、xlrd和xlwt两个模块分别用来读Excel和写Excel,只支持.xls和.xlsx格式
,xlutils模块可以同时读写一个已存在的Excel文件,依赖于xlrd和xlwt。

3、openpyxl(可读写excel表)
专门处理Excel2007及以上版本产生的xlsx文件;2007一下的版本为xls结尾的文件,需要使用xlrd(读)和xlwt(写)库进行操作

4、excel表的文字编码如果是“gb2312” 读取后就会显示乱码,请先转成Unicode

5、workbook: 工作簿,一个excel文件包含多个sheet。

6、sheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。

7、cell: 单元格,存储数据对象

8、常用单元格中的数据类型empty(空的),string(text),number, date, boolean, error,blank(空白表格)

使用xlrd读Excel

xlrd提供的接口比较多,常用的方法如下:

方法       说明
open_workbook()

 打开指定的Excel文件,返回一个Book对象:通过Book对象可以得到各个Sheet对象(一个Excel文件可以有多个Sheet,每个Sheet就是一张表格)

Book.nsheets    返回Sheet的数目
Book.sheets()返回所有Sheet对象的list
Book.sheet_by_index(index)  返回指定索引处的Sheet。相当于Book.sheets()[index]
Book.sheet_names() 返回所有Sheet对象名字的list(为一个str类型的列表)
Book.sheet_by_name(name)根据指定Sheet对象名字返回She
通过Sheet对象可以获取各个单元格,每个单元格是一个Cell对象

方法说明
Sheet.name  返回表格的名称
Sheet.nrows 返回表格的行数
Sheet.ncols    返回表格的列数
Sheet.row(r) 获取指定行,返回Cell对象的list
Sheet.col(c) 获取指定列,返回Cell对象的list
Sheet.row_values(r)  获取指定行的值,返回list
Sheet.col_values(c) 获取指定列的值,返回list
Sheet.cell(r, c)  根据位置获取Cell对象
Sheet.cell_value(r, c) 根据位置获取Cell对象的值
Cell.value返回单元格的值
注:
总的来说在处理Excel时的步骤是:
先获取需要处理的Excel文件对象(Book对象,open_workbook()),再获得工作簿中的sheet对象(Book.sheet_by_index(index)等方法),在sheet对象中进行处理

 

此次的测试Excel文件

 

获取工作表对象

我们知道一个工作簿里面可以含有多个工作表,当我们获取“工作簿对象”后,可以接着来获取工作表对象,可以通过“索引”的方式获得,也可以通过“表名”的方式获得。

例1:
通过Book.sheets( )方法获得sheet对象
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #返回所有Sheet对象的list
all_sheet = excel.sheets()#Book(工作簿)对象方法 print(all_sheet) #遍历返回的Sheet对象的list
for each_sheet in all_sheet:     print(each_sheet)    
print("sheet名称为:",each_sheet.name)#sheet对象方法 """ [<xlrd.sheet.Sheet object at
0x0000021983B380F0>, <xlrd.sheet.Sheet object at 0x0000021983B38208>,
<xlrd.sheet.Sheet object at 0x0000021983B382B0>] <xlrd.sheet.Sheet object at
0x0000021983B380F0> sheet名称为: Sheet1 <xlrd.sheet.Sheet object at
0x0000021983B38208> sheet名称为: Sheet2 <xlrd.sheet.Sheet object at
0x0000021983B382B0> sheet名称为: Sheet3 """
例1_1:
通过Book.sheet_by_index(index)方法获得sheet对象
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #返回所有Sheet对象的list
all_sheet = excel.sheets() print(all_sheet) for i in range(len(all_sheet)):    
each_sheet_by_index = excel.sheet_by_index(i)#通过sheet索引获得sheet对象    
print("表名称为:{0},类型为:{1}".format(each_sheet_by_index,
type(each_sheet_by_index)))     print("sheet名称为:", each_sheet_by_index.name)  #
sheet对象方法 """ [<xlrd.sheet.Sheet object at 0x0000023D55D89128>,
<xlrd.sheet.Sheet object at 0x0000023D55D89240>, <xlrd.sheet.Sheet object at
0x0000023D55D892E8>] 表名称为:<xlrd.sheet.Sheet object at
0x0000023D55D89128>,类型为:<class 'xlrd.sheet.Sheet'> sheet名称为: Sheet1
表名称为:<xlrd.sheet.Sheet object at 0x0000023D55D89240>,类型为:<class
'xlrd.sheet.Sheet'> sheet名称为: Sheet2 表名称为:<xlrd.sheet.Sheet object at
0x0000023D55D892E8>,类型为:<class 'xlrd.sheet.Sheet'> sheet名称为: Sheet3 """
注:
从上面的代码可以看出,这种用法(excel.sheet_by_index(i))其实就是Book.sheets()[index]相同,只是说例1中的用法比较简便

例1_2:
Book.sheet_names() :这种获得的不是sheet对象,只是一个str类型的列表(sheet对象名字的列表)
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #返回所有Sheet对象名字的list
all_sheet = excel.sheet_names() print(all_sheet) #遍历返回的Sheet对象名字的list for
each_sheet_by_name in all_sheet:    
print("表名称为:{0},类型为:{1}".format(each_sheet_by_name ,type(each_sheet_by_name )))
    #print(each_sheet_by_name.ncols)      """ ['Sheet1', 'Sheet2', 'Sheet3']
表名称为:Sheet1,类型为:<class 'str'> 表名称为:Sheet2,类型为:<class 'str'>
表名称为:Sheet3,类型为:<class 'str'> """
注:
从上面例子中可以看出遍历出来的只是一个字符串类型的对象('Sheet1', 'Sheet2',
'Sheet3'),而不是sheet对象,因此不能使用seet对象方法(Sheet.name等)

例1_2:
通过表名称索引来获得:Book.sheet_by_name(name)
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #返回所有Sheet对象名字的list
all_sheet = excel.sheet_names() #workbook.sheet_names()
返回一个list对象,可以对这个list对象进行操作 print(all_sheet) for i in all_sheet:    
each_sheet_by_name = excel.sheet_by_name(i)#通过sheet索引获得sheet对象    
print("表名称为:{0},类型为:{1}".format(each_sheet_by_name, type(each_sheet_by_name)))
    print("sheet名称为:", each_sheet_by_name.name)  # sheet对象方法 """ ['Sheet1',
'Sheet2', 'Sheet3'] 表名称为:<xlrd.sheet.Sheet object at
0x00000202BF748080>,类型为:<class 'xlrd.sheet.Sheet'> sheet名称为: Sheet1
表名称为:<xlrd.sheet.Sheet object at 0x00000202BF748198>,类型为:<class
'xlrd.sheet.Sheet'> sheet名称为: Sheet2 表名称为:<xlrd.sheet.Sheet object at
0x00000202BF748240>,类型为:<class 'xlrd.sheet.Sheet'> sheet名称为: Sheet3 """
例1_4:
除了以上方法,还有一种获得sheet对象的方法
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #返回Sheet的数目
all_sheet_count = excel.nsheets print(all_sheet_count) for i in
range(all_sheet_count):     sheet =
excel.sheet_by_index(i)#通过索引sheet数目来获得,与第二种方法类似    
print("表名称为:{0},类型为:{1}".format(sheet , type(sheet ))) """ 3
表名称为:<xlrd.sheet.Sheet object at 0x000001EA57F39048>,类型为:<class
'xlrd.sheet.Sheet'> 表名称为:<xlrd.sheet.Sheet object at
0x000001EA57F39160>,类型为:<class 'xlrd.sheet.Sheet'> 表名称为:<xlrd.sheet.Sheet
object at 0x000001EA57F39208>,类型为:<class 'xlrd.sheet.Sheet'> """
 

获取工作表的基本信息

在获得“表对象”之后,我们可以获取关于工作表的基本信息。包括表名、行数与列数等
例2:获取sheet对象的名称、行数、列数
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 all_sheet =
excel.sheets() #循环遍历每个sheet对象 sheet_name = [] sheet_row = [] sheet_col = [] for
sheet in all_sheet:     sheet_name.append(sheet.name)    
print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"          
.format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))    
sheet_row.append(sheet.nrows)     sheet_col.append(sheet.ncols)
print(sheet_name)#获取sheet的名称 print(sheet_row )#获取sheet对象的行数
print(sheet_col)#获取sheet对象的列数 """
该Excel共有3个sheet,当前sheet名称为Sheet1,该sheet共有13行,9列
该Excel共有3个sheet,当前sheet名称为Sheet2,该sheet共有9行,10列
该Excel共有3个sheet,当前sheet名称为Sheet3,该sheet共有18行,8列 ['Sheet1', 'Sheet2', 'Sheet3']
[13, 9, 18] [9, 10, 8] """

例3:按行或列方式获得工作表的数据
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 all_sheet =
excel.sheets() #循环遍历每个sheet对象 sheet_name = [] sheet_row = [] sheet_col = [] for
sheet in all_sheet:     sheet_name.append(sheet.name)    
print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"          
.format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))     for each_row in
range(sheet.nrows):#循环打印每一行         print("当前为%s行:"% each_row,type(each_row))  
      print(sheet.row_values(each_row),type(sheet.row_values(each_row)))
first_row_value = sheet.row_values(0)#打印指定的某一行 print("第一行的数据为:%s" %
first_row_value) """ 该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列 当前为0行:
<class 'int'> ['地区', '单位名称', '职位代码', '职位名称', '招录人数', '报考人数'] <class 'list'>
当前为1行: <class 'int'> ['省级单位', '浙江警官职业学院', '13312004000000001', '司法警务专业教学', 1.0,
'0'] <class 'list'> 当前为2行: <class 'int'> ['省级单位', '浙江警官职业学院',
'13312004000000002', '法学教学', 1.0, '1'] <class 'list'> 当前为3行: <class 'int'>
....... 第一行的数据为:['地区', '单位名称', '职位代码', '职位名称', '招录人数', '报考人数'] """
注:
1、从上面例子中可以看出,在获得sheet对象的行数后,可以使用循环遍历的方法(for each_row in
range(sheet.nrows),再通过sheet.row_values(each_row)方法获得出每一行的数据

2、可以通过索引的方法可以获得指定的某一行的数据的(sheet.row_values(0)):其实这种跟上面1中的实际上是一致的

3、通过输出的结果可以看出:获得的每一行的数据类型为一个列表,每一个单元格的数据为列表中的一个元素,一行中的所有数据组成一个列表
 

例3_1:
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 all_sheet =
excel.sheets() #循环遍历每个sheet对象 sheet_name = [] sheet_row = [] sheet_col = [] for
sheet in all_sheet:     sheet_name.append(sheet.name)    
print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"          
.format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))    
print(sheet.col_values(0))#获取指定列的数据     for each_col in
range(sheet.ncols):#依次获得每一列的数据         print("当前为%s列:"% each_col )        
print(sheet.col_values(each_col ),type(sheet.col_values(each_col ))) """
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列 ['地区', '省级单位', '省级单位', '省级单位']
当前为0列: ['地区', '省级单位', '省级单位', '省级单位'] <class 'list'> 当前为1列: ['单位名称',
'浙江警官职业学院', '浙江警官职业学院', '浙江警官职业学院'] <class 'list'> 当前为2列: ['职位代码',
'13312004000000001', '13312004000000002', '13312004000000003'] <class 'list'>
当前为3列: ['职位名称', '司法警务专业教学', '法学教学', '民航空中安保教学'] <class 'list'> 当前为4列: ..... """
注:
1、从上面的例子可以看出:可以通过遍历全部列数(for each_col in
range(sheet.ncols))的方法获得全部列的数据,也可以通过索引获得指定列的数据

2、返回的数据依旧是列表:一列中每个单元格的数据为列表中的一个元素

 

获取行或列对象

通过sheet对象中的Sheet.row(r)或Sheet.col(c)可以获得指定行或列,返回Cell对象的list
例4:
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 all_sheet =
excel.sheets() #循环遍历每个sheet对象 for sheet in all_sheet:    
print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"          
.format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))    
sheet_cell_first_row = sheet.row(0)#获取指定行对象     print(sheet_cell_first_row)    
for i in range(sheet.nrows):#依次遍历获得每一行对象         each_cell_value_row =
sheet.row(i)         print(each_cell_value_row,type(each_cell_value_row)) """
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列 [text:'地区', text:'单位名称',
text:'职位代码', text:'职位名称', text:'招录人数', text:'报考人数'] [text:'地区', text:'单位名称',
text:'职位代码', text:'职位名称', text:'招录人数', text:'报考人数'] <class 'list'>
[text:'省级单位', text:'浙江警官职业学院', text:'13312004000000001', text:'司法警务专业教学',
number:1.0, text:'0'] <class 'list'> [text:'省级单位', text:'浙江警官职业学院',
text:'13312004000000002', text:'法学教学', number:1.0, text:'1'] <class 'list'>
[text:'省级单位', text:'浙江警官职业学院', text:'13312004000000003', text:'民航空中安保教学',
number:1.0, text:'1'] <class 'list'>
该Excel共有3个sheet,当前sheet名称为大于一比八十的职位,该sheet共有11行,6列 """
注:
从上面的输出结果可以看出:返回的结果的类型为一个嵌套了字典的列表,字典的键为默认值(test),字典的值为每个单元格的值(数据)

例4_1:
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 all_sheet =
excel.sheets() #循环遍历每个sheet对象 for sheet in all_sheet:    
print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"          
.format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))    
sheet_cell_first_col = sheet.col(0)#获取指定列对象     print(sheet_cell_first_col)    
for i in range(sheet.ncols):#依次遍历获得每一列对象         each_cell_value_col =
sheet.col(i)         print(each_cell_value_col,type(each_cell_value_col)) """
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列 [text:'地区', text:'省级单位',
text:'省级单位', text:'省级单位'] [text:'地区', text:'省级单位', text:'省级单位', text:'省级单位']
<class 'list'> [text:'单位名称', text:'浙江警官职业学院', text:'浙江警官职业学院', text:'浙江警官职业学院']
<class 'list'> [text:'职位代码', text:'13312004000000001',
text:'13312004000000002', text:'13312004000000003'] <class 'list'>
[text:'职位名称', text:'司法警务专业教学', text:'法学教学', text:'民航空中安保教学'] <class 'list'>
[text:'招录人数', number:1.0, number:1.0, number:1.0] <class 'list'> [text:'报考人数',
text:'0', text:'1', text:'1'] <class 'list'>
该Excel共有3个sheet,当前sheet名称为大于一比八十的职位,该sheet共有11行,6列 """
 

获取某一个单元格的数据

1、我们还可以将查询精确地定位到某一个单元格。在xlrd模块中,工作表的行和列都是从0开始计数的

2、单元格:单元格是表格中行与列的交叉部分,它是组成表格的最小单位,可拆分或者合并。单个数据的输入和修改都是在单元格中进行的
例5:
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 all_sheet =
excel.sheets() #循环遍历每个sheet对象 for sheet in all_sheet:
print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
.format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols)) sheet_cell =
sheet.cell(0,0)#根据位置获取Cell对象 print(sheet_cell) sheet_cell_value =
sheet_cell.value#返回单元格的值 print(sheet_cell_value) sheet_cell_value_1 =
sheet.cell_value(0,0)#根据位置获取Cell对象的值 print(sheet_cell_value_1) """
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列 text:'地区' 地区 地区
该Excel共有3个sheet,当前sheet名称为大于一比八十的职位,该sheet共有11行,6列 text:'地区' 地区 地区
该Excel共有3个sheet,当前sheet名称为Sheet1,该sheet共有22行,6列 text:'地区' 地区 地区 """
 

拓展:

获取每一个单元格的值(数据)
例6:
import xlrd excel_path = "F:\\Excel_demo\\demo.xls"
#打开文件,获取excel文件的workbook(工作簿)对象 excel =
xlrd.open_workbook(excel_path,encoding_override="utf-8") #获取sheet对象 sheet =
excel.sheets()[0] sheet_row_mount = sheet.nrows#4行 sheet_col_mount =
sheet.ncols#6列 print(sheet_row_mount,sheet_col_mount) for x in
range(sheet_row_mount):#4     y = 0     while y < sheet_col_mount:#6        
print(sheet.cell_value(x,y))         y += 1 """ 4 6 地区 单位名称 职位代码 职位名称 招录人数 报考人数
省级单位 浙江警官职业学院 13312004000000001 司法警务专业教学 1.0 0 省级单位 ...... """
注:
Excel文件中行和列的索引是从0开始的(且文件返回的是一个列表),所以如果上面例子中判断条件为while y <=
sheet_col_mount时就会报错 :IndexError: list index out of range

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信