【Python】xlrd模块使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Python】xlrd模块使用相关的知识,希望对你有一定的参考价值。

参考技术A python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库

安装:pip install xlrd

导入:import xlrd

打开excel文件:xlrd.open_workbook(filename)

如果路径或者文件名中有中文的话,加上r即可: xlrd.open_workbook(r"filename")

获取所有sheet名:sheet_names( )。将所有的sheet名存放到数组中输出

根据sheet索引或者名称获取每张sheet表里的数据内容:sheet_by_index( 索引值 )、sheet_by_name("sheetname")。

excel里的索引值都从0开始

这俩输出结果是一致的

获取指定sheet页的名称、行数、列数

获取整行的值:row_values( 索引值 )      获取整列的值:col_values( 索引值 )  ——> 都以数组形式返回数据

此处注意,我们输出结果里面数字是保留了一位小数的,那如果我们想直接输出整数如何处理呢?百度了好久都需要自己写个函数转一下,能更改excel里的数据格式直接读出来就是int型吗?而且我发现,如果直接读取那个数据其实是int型,但是写入数组里就变成浮点型了,谁能告知一下

获取单元格对象:cell( 行的索引值,列的索引值 )

获取单元格值的数据类型:cell( 行的索引值,列的索引值 ).ctype

ctype返回值对应的数据类型是: 0 - empty, 1 - string, 2 - number, 3 - date, 4 - boolean, 5 - error

获取某个单元格的值:cell_value( 行的索引值,列的索引值 )/cell( 行的索引值,列的索引值 ).value/row( 行的索引值 )[ 列的索引值 ].value

python 读 excel 模块: xlrd

主要来自:[ python中使用xlrd、xlwt操作excel表格详解 ]

为了方便阅读, 我将原文两个模块拆分为两篇博文:

[ python 读 excel 模块: xlrd ]

[ python 写 excel 模块: xlwt ]


xlrd 基本操作

这个过程有几个比较麻烦的问题,比如读取日期、读合并单元格内容。

读一个有2个 sheet 的 excel 文件, 读入sheet2的内容, 内容如下:

技术分享图片


使用 python 读入

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# - read_excel.py
#

import xlrd
import xlwt
from datetime import date,datetime

def read_excel():
  # 打开文件
  workbook = xlrd.open_workbook(r‘/tmp/demo.xlsx‘)
  # 获取所有sheet
  print workbook.sheet_names() # [u‘sheet1‘, u‘sheet2‘]
  sheet2_name = workbook.sheet_names()[1]

  # 根据sheet索引或者名称获取sheet内容
  sheet2 = workbook.sheet_by_index(1) # sheet索引从0开始
  sheet2 = workbook.sheet_by_name(‘sheet2‘)

  # sheet的名称,行数,列数
  print sheet2.name,sheet2.nrows,sheet2.ncols

  # 获取整行和整列的值(数组)
  rows = sheet2.row_values(3) # 获取第四行内容
  cols = sheet2.col_values(2) # 获取第三列内容
  print rows
  print cols

  # 获取单元格内容
  print sheet2.cell(1,0).value.encode(‘utf-8‘)
  print sheet2.cell_value(1,0).encode(‘utf-8‘)
  print sheet2.row(1)[0].value.encode(‘utf-8‘)
  
  # 获取单元格内容的数据类型
  print sheet2.cell(1,0).ctype

if __name__ == ‘__main__‘:
  read_excel()


运行结果如下:
技术分享图片

可以看到, 红框中的内容本应该是生日, 但是现实的浮点数. 接下来解决日期的问题.


xlrd 读取单元格日期内容

python读取excel中单元格的内容返回的有5种类型,即上面例子中的ctype:

0 empty
1 string
2 number
3 date
4 boolean
5 error


所以, 对于日期的处理,可以先判断其 ctype, 如果为 date, 则需要使用 xlrd 的 xldate_as_tuple 来处理.

>>> sheet2.cell(2,2).value #1990/2/22
33656.0
>>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
>>> date_value
(1992, 2, 22, 0, 0, 0)


if (sheet.cell(row,col).ctype == 3):
    date_value = xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)
    date_tmp = date(*date_value[:3]).strftime(‘%Y/%m/%d)



xlrd 处理合并单元的值问题

对于合并单元格的数据, xlrd 的处理结果是, 只有第一个单元格的有值,其它的为空.

获取单元格值得思路是: 获取合并的单元格 --> 获取合并单元格的内容.

获取合并的单元格

读取文件的时候需要将formatting_info参数设置为True,默认是False.

>>> workbook = xlrd.open_workbook(r‘/tmp/demo.xlsx‘,formatting_info=True)
>>> sheet2 = workbook.sheet_by_name(‘sheet2‘)
>>> sheet2.merged_cells
[(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)] 


merged_cells返回的这四个参数的含义是:(row,row_range,col,col_range). 取值范围和 list 切换相同, 包含 start, 不包含 stop.

利用这个,可以分别获取合并的三个单元格的内容:

>>> print sheet2.cell_value(1,4)  #(1, 3, 4, 5)
好朋友
>>> print sheet2.cell_value(3,4)  #(3, 6, 4, 5)
同学
>>> print sheet2.cell_value(7,2)  #(7, 8, 2, 5)
暂无 


可以看到, 获取 merge_cells 返回的 row 和 col 低位的索引即可.

>>> merge = []
>>> for (rlow,rhigh,clow,chigh) in sheet2.merged_cells:
  merge.append([rlow,clow])
  
>>> merge
[[7, 2], [1, 4], [3, 4]]
>>> for index in merge:
  print sheet2.cell_value(index[0],index[1])
  
暂无
好朋友
同学























以上是关于【Python】xlrd模块使用的主要内容,如果未能解决你的问题,请参考以下文章

python里面的xlrd模块详解

python里面的xlrd模块详解

python读写Excel文件--使用xlrd模块读取,xlwt模块写入

python里面的xlrd模块

python使用xlrd模块读取Excel

python xlrd xlwt