Python xlrd 读取 Excel 表格基础(二):获取单元格内超链接信息、格式信息、字体格式信息等
阅读原文时间:2021年04月21日阅读:1

前言:

在上一篇的博客里,介绍了如何读取Excel表格中的数据。

其实一个Excel表格不仅具有文本数据信息,其还包含了大量的表格、字体格式信息。因为这些信息一般用处不大,所以在这里就简单的介绍一下了。

本篇主要内容:

1、获取单元格内超文本信息、合并单元格信息等;
2、获取单元格格式信息;
3、获取字体格式信息;
4、获取行、列格式信息。

1、获取超文本信息等

用于测试的表格文件为test02.xls,文件截图:

获取单元格内超文本信息:

# 导入模块
import xlrd

# 获取工作簿对象
work_book = xlrd.open_workbook('test02.xls',formatting_info = True)
# 按索引获取sheet对象
sheet_1 = work_book.sheet_by_index(0)
# 获取sheet表内超链接文本对象
print(sheet_1.hyperlink_list)
# ------运行结果------
# [<xlrd.sheet.Hyperlink object at 0x0000019B5A064358>]
# ------运行结果------

注:打开Excel文件时默认是不读取文件格式的,也就是 formatting_info 默认值为 False
想要获取 Excel 文件格式信息,需把 formatting_info 值改为 True,这样主要是为了降低内存消耗。

获取超文本对象内容,单元格信息:

# 获取sheet表内超链接对象单元格位置、对象
print(sheet_1.hyperlink_map)
# ------运行结果------
# {(11, 2): <xlrd.sheet.Hyperlink object at 0x000001E5824B4EF0>}
# ------运行结果------

# 获取超链接文件url信息
hyperlink_obj = sheet_1.hyperlink_list[0]
print(hyperlink_obj.url_or_path)
# ------运行结果------
# https://www.sogou.com/
# ------运行结果------

获取合并单元格信息:

# 获取合并单元格信息
print(sheet_1.merged_cells)
# ------运行结果------
# [(12, 13, 2, 6), (1, 2, 1, 6)]
# ------运行结果------

注:这个获得的单元格合并信息有点奇怪:
如 (1, 2, 1, 6) 信息:第一个 1 应该是第1行(从0开始计数),2 就不是指合并到第 2 行,而是2-1 还是合并行数为:1;
同理,第三个 1 指的是 第 1 列,第四个6指的是 6-1 合并列数为 5 列。
大概是这么理解的吧…

一种简单的按行读取sheet表内所有数据方法:

上一篇博客里介绍了按行、按列读取Excel文件sheet表内数据的方法,其实这里还有一种非常简单的按行读取sheet表内数据的方法:

# 简单按行获取sheet表对象所有值
print(sheet_1._cell_values)
# ------运行结果------
# [['', '', '', '', '', ''], ['', 'CSDN 博客数据', '', '', '', ''], 
# ['', '日期', '访问量', '评论数', '收藏数', '粉丝数'], ['', 43974.0, 17.0, 0.0, 0.0, 0.0], 
# ['', 43975.0, 36.0, 0.0, 0.0, 0.0], ['', 43976.0, 22.0, 0.0, 0.0, 0.0], 
# ['', 43977.0, 20.0, 0.0, 0.0, 0.0], ['', 43978.0, 18.0, 0.0, 0.0, 0.0], 
# ['', 43979.0, 223.0, 0.0, 0.0, 0.0], ['', 43980.0, 1187.0, 0.0, 0.0, 0.0], 
# ['', 43981.0, 854.0, 0.0, 0.0, 1.0], ['', '总计:', 2377.0, 0.0, 0.0, 1.0], 
# ['', '数据来源:', 'https://www.sogou.com/', '', '', '']]
# ------运行结果------

大家可以和上篇博客里的按行读取sheet表内数据方法比较一下。

2、获取单元格格式信息

想要获取sheet表内单元格信息,需先获取Excel文件所有的单元格格式列表

# 获取Excel表格所有单元格格式对象列表
xf_list = work_book.xf_list

即:在读取Excel文件的时候,当ormatting_info 值设置为 True 时,xlrd 模块已经为我们将Excel文件里所有单元格信息保存在 xf_list 列表中了。

再在sheet对象里获取单元格格式索引,按索引获取单元格格式对象:

# 获取单元格格式对象索引
cell_xf_index = sheet_1.cell_xf_index(2,1)
print(cell_xf_index)  # 打印结果:69
# 按索引值获取单元格格式对象
cell_xf = xf_list[cell_xf_index]
print(cell_xf)
# ------运行结果------
# <xlrd.formatting.XF object at 0x000001BAF6C646A0>
# ------运行结果------

这里选取的单元格是:

xlrd 里的单元格格式对象 XF(),和xlwt 模块中单元格格式对象类似,包含了大量的格式信息。(这里大家也可以回顾一下,前面关于 xlwt 将数据写入Excel表格 :单元格格式、字体格式、对齐方式、边框及填充设置等 的文章。)
xlrd 和 xlwt模块在许多Excel表格处理方式上比较类似,只不过一个是读,一个是写。

XF() 类中包含了单元格格式的四个信息:

1、protection:单元格保护信息; 2、background:单元格背景颜色信息; 3、alignment:单元格对齐信息; 4、border:单元格边框信息。

protection:单元格保护信息,对应xlrd中formatting里的XFProtection类。

# 有两个属性:cell_locked(单元格锁定),formula_hidden(公式隐藏)
protection = cell_xf.protection
print(protection.cell_locked,',',protection.formula_hidden,)
# ------运行结果------
# 1 , 0
# ------运行结果------

background:背景颜色信息 XFBackground 类

background = cell_xf.background
# 有三个属性:fill_pattern,background_colour_index,pattern_colour_index
print(background.fill_pattern,
      ',',background.background_colour_index,
      ',',background.pattern_colour_index)
# ------运行结果------
# 1 , 64 , 13
# ------运行结果------

注:相应属性对应 xlwt 模块里单元格格式设置时的一些参数,这里就不重复介绍了。

alignment:对齐信息,XFAlignment 类

# 有七个属性:hor_align,vert_align,rotation,text_wrapped,indent_level
# shrink_to_fit,text_direction
alignment = cell_xf.alignment
print(alignment.hor_align,',',
      alignment.vert_align,',',
      alignment.rotation,',',
      alignment.text_wrapped,',',
      alignment.indent_level,',',
      alignment.shrink_to_fit,',',
      alignment.text_direction)

# ------运行结果------
# 2 , 1 , 0 , 0 , 0 , 0 , 0
# ------运行结果------

border:边框信息,XFBorder类

# border 边框信息 XFBorder类
# 有十二个属性:top_colour_index,bottom_colour_index,left_colour_index
# right_colour_index,diag_colour_index,top_line_style,bottom_line_style,
# left_line_style,right_line_style,diag_line_style,diag_down,diag_up
border = cell_xf.border
print(border.top_colour_index,',',border.bottom_colour_index,',',
      border.left_colour_index,',',border.right_colour_index,',',
      border.diag_colour_index,',',border.top_line_style,',',
      border.bottom_line_style,',',border.left_line_style,',',
      border.right_line_style,',',border.diag_line_style,',',
      border.diag_down,',',border.diag_up)
# ------运行结果------
# 64 , 64 , 64 , 64 , 0 , 1 , 1 , 2 , 1 , 0 , 0 , 0
# ------运行结果------

3、获取单元格字体信息

这里和单元格格式类似,也需先获取 Excel 文件里所有的字体对象列表。

# 先获取Excel对象所有的字体对象列表
font_list = work_book.font_list

注意:获取单元格字体对象索引的方式,和前面不一样,其索引是在单元格格式对象属性里:

# 字体的font对象索引从xf对象里获取
font_index = cell_xf.font_index
print(font_index) # 打印结果 24
# 在Excel文件所有字体对象列表中获取字体对象
font = font_list[font_index]

字体对象信息在xlrd模块里formatting.py 文件中的 Font() 类中。
有以下属性可获取:bold,character_set,colour_index,escapement,
family,font_index,height,italic,name,struck_out,underline_type,underlined,weight,outline,shadow。

注:在 xlwt 字体格式设置的介绍里,也讲到了上面的大部分属性的意思…

print(font.bold,',',font.character_set,',',font.colour_index,',',
      font.escapement,',',font.family,',',font.font_index,',',
      font.height,',',font.italic,',',font.name,',',
      font.struck_out,',',font.underline_type,',',font.underlined,',',
      font.weight,',',font.outline,',',font.shadow)

# ------运行结果------
# 1 , 134 , 8 , 0 , 3 , 24 , 220 , 0 , 楷体 , 0 , 0 , 0 , 700 , 0 , 0
# ------运行结果------

4、获取行、列对象格式信息:

获取行对象格式信息,先获取sheet表行格式信息对象映射:

# 获取sheet表对象行信息映射
print(sheet_1.rowinfo_map)
# ------运行结果------
# {0: <xlrd.sheet.Rowinfo object at 0x00000172E7C69EA0>,
# 1: <xlrd.sheet.Rowinfo object at 0x00000172E7C72158>,
# 2: <xlrd.sheet.Rowinfo object at 0x00000172E7C721E0>,
# 3: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 4: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 5: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 6: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 7: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 8: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 9: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 10: <xlrd.sheet.Rowinfo object at 0x00000172E7C72268>,
# 11: <xlrd.sheet.Rowinfo object at 0x00000172E7C69EA0>}
# ------运行结果------

可获取的行格式信息有:

'''
"height",
"has_default_height",
"outline_level",
"outline_group_starts_ends",
"hidden",
"height_mismatch",
"has_default_xf_index",
"xf_index",
"additional_space_above",
"additional_space_below"
'''

获取第 1 行格式信息:

print(row_0_info.height,',',row_0_info.has_default_height,',',
row_0_info.outline_level,',',row_0_info.outline_group_starts_ends,',',
row_0_info.hidden,',',row_0_info.height_mismatch,',',
row_0_info.has_default_xf_index,',',row_0_info.xf_index,',',
row_0_info.additional_space_above,',',row_0_info.additional_space_below)

# ------运行结果------
# 399 , 0 , 0 , 0 , 0 , 1 , 0 , -1 , 0 , 0
# ------运行结果------

获取列格式对象信息:

注:xlrd模块获取列信息接口,好像也有问题…,结果只有一列…

print(sheet_1.colinfo_map)
# 打印结果
# {1: <xlrd.sheet.Colinfo object at 0x000002806C8D4C18>}

结尾:

以上就是本篇博客的全部内容了,感谢阅读。

到这里关于 Python 第三方模块 xlwt(写)、xlrd(读)对Excel表格的操作讲解基础内容,基本上算是讲完了。后面准备结合三到五个实例来综合讲解一下,大家在实际使用Python操作Excel表格时,有什么问题或想法的话,可留言或私信我,一起讨论交流一下。

【Python与Office】专栏

该专栏会对 Python 的第三方模块,如:xlwt,xlrd,python-docx等,操作 Office 办公软件(Word Excel PPT)的方法进行详细讲解。同时也会搭配一些实例演练,一方面强化知识点的理解与运用,另一方面也希望能起到,引导读者进行思考:如何用 python 提高 offic 办公软件办公效率的作用。

感兴趣的朋友,可以点个 关注收藏 。如在博客中遇到任何问题或想法,可留言或私信。

创作不易,你的支持是我最大的动力,感谢 !

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器