主要来自:[ python中使用xlrd、xlwt操作excel表格详解 ]
为了方便阅读, 我将原文两个模块拆分为两篇博文:
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])
暂无
好朋友
同学