文章Plus 刷题 知乎圈子

用Python读Excel文件

陈锋 2020-05-24 08:36:38 阅读 79

在IC设计、验证、后端中经常会用Excel来做配置文件、寄存器表、定义后端SDC参数等,不管Excel好不好用,但学习成本低啊。

Excel文件的结构

Excel文件主要由工作簿(book)、工作表(sheet)、单元格(cell)组成。一个Excel文件就是一个工作簿。一个工作簿可以有N个工作表。每个工作表由N行xM列个单元格组成,行通常用阿拉伯数字编号,列用英文字母编号。

Excel文件还包括其它辅助信息,如格式、合并、宏、VBA等。

用xlrd读Excel的基本操作

xlrd是读Excel应用最广泛的第三方库之一,安装方法:

pip3 install xlrd

以下图的Excel文件为例,介绍读取的方法:

excel文件:center:

Step 1

读Excel文件的第一步是打开工作簿:

import xlrd

book = xlrd.open_workbook('test.xls')

Step 2

第二步是打开工作表,'Sheet1'。

sheets = book.sheet_name()
 # ['Sheet1', 'Sheet2']
sheets_num = len(book.sheet_name())
 # 2
sheet0 = book.sheet_by_index(0)
 # <xlrd.sheet.Sheet object at 0x7f7543b44cc0>
sheet0 = book.sheet_by_name('Sheet1')
 # <xlrd.sheet.Sheet object at 0x7f7543b44cc0>

Step 3

从单元格里读数据。先来看看一共有多少行、多少列。

max_rows = sheet0.nrows # 5
max_cols = sheet0.ncols # 5

打印出所有单元格的数据:

for row in range(max_rows):
    for col in range(max_cols):
        print(' ', end='')
        print(sheet0.cell(row, col).value, end=' ')
    print('')
 #   11.0    12.0    13.0    14.0    15.0 
 #   21.0            23.0    24.0    25.0 
 #                   33.0    34.0
 #   41.0    42.0    43.0
 #   51.0    52.0            54.0    55.0 

读取内容与预期一致。

注意:

  1. 索引从0开始
  2. 合并单元格,只能从左上角的单元格里读出,其余单元格读出的是空字符''
  3. 空单元格(没值的),读取的也是空字符串''

我们可以进一步通过判断单元格值的类型来确认:

for row in range(max_rows):
    for col in range(max_cols):
        print(' ', end='')
        print(sheet0.cell(row, col).ctype, end=' ')
    print('')
 #  2   2   2   2   2
 #  2   0   2   2   2 
 #  0   0   2   2   0 
 #  2   2   2   0   0 
 #  2   2   0   2   2 

ctype的值与含义:

可以看出,单元格数据的类型确实与打印的数值一致。

但有一个问题,无法区分是空值和合并单元格。

读取合并单元格

在实际项目中,有时候我们希望能够

  1. 判断是否是合并单元格,
  2. 跳过合并单元格(得到合并单元格的边界)。

其实,在xlrd的sheet里,已经读取了合并单元格的信息。只需要在open_workbook()时打开选项:

book = xlrd.open_workbook('test.xls', formatting_info=True)
sheet0 = book.sheet_by_index(0)
merged_cells = sheet0.merged_cells
print(merged_cells)
 # [(1, 3, 0, 2), (2, 4, 3, 5)]

返回了两个元组,就是两个合并单元格。含义:
(start_row, end_row, start_col, end_col)

注意:与python语法一致,不包括end行或列。

那么我们可以写两个函数来把这个列表封装一下:

def isMergedCell(row, col):
    for r in merged_cells:
        if row >= r[0] and row < r[1] and col >= r[2] and col < r[3]:
            return True
    return False

print(isMergedCell(1, 0)) # True
print(isMergedCell(2, 1)) # True
print(isMergedCell(4, 2)) # False

def getMargin(row, col):
    if(isMergedCell(row, col)):
        for r in merged_cells:
            if row >= r[0] and row < r[1] and col >= r[2] and col < r[3]:
                return (r[1]-1, r[3]-1)
    else:
        return (row, col)

print(getMargin(1, 0)) #(2, 1)
print(getMargin(2 ,3)) #(3, 4)

是不是很方便?通过这段代码,我们知道cell(4,2)只是空值,不是合并单元格。也轻松获取了合并单元格的边界。

总结

在理解了Excel的存储结构后,xlrd的使用就显得非常方便。另外,xlrd不仅可以读取xls,也可以读取xlsx(就是说xlrd可以兼容新老版本的Excel)

本文作者:陈锋

公众号:ExASIC

分享让工作更轻松!

我的 文章合集

点赞0 阅读79 收藏0 分享0
解惑专区
(支持markdown插入源代码)
热读榜单
【数字IC实验】实验1. 实现8-3编码器与3-8译码器
2020-06-30 13:15:07 阅读 467
IC技术圈期刊目录(2020年8月更新)
2020-06-20 12:37:44 阅读 434
【数字IC实验】实验3. 实现16bit乘以16bit的无符号乘法器
2020-07-16 17:23:01 阅读 377
【数字IC实验】实验2. 实现SPI协议的串转并功能
2020-07-02 10:30:18 阅读 277
IC验证导学(图书推荐、导读,带思维导图)
2020-05-30 13:48:22 阅读 135
文章广场
IC技术圈期刊目录(2020年8月更新)
陈锋 2020-06-20 12:37:44 阅读 434
python的数字与字符串相互转换
陈锋 2020-05-27 23:35:45 阅读 64
Cracking Digital VLSI Verification Interview 第一章
空白的贝塔 2020-05-24 09:36:55 阅读 94
Cracking Digital VLSI Verification Interview 第三章
空白的贝塔 2020-05-30 14:41:37 阅读 31
【数字IC实验】实验2. 实现SPI协议的串转并功能
陈锋 2020-07-02 10:30:18 阅读 277

更多精彩...

AD 广告位