python 读 excel 模块: xlrd

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

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

[ python 读 excel 模块: xlrd ]

[ python 写 excel 模块: xlwt ]


xlrd 基本操作

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

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

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()


运行结果如下:
result

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


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])
  
暂无
好朋友
同学

转载于:https://www.cnblogs.com/tiantiandas/p/python_xlrd.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值