利用Python读取和修改Excel文件(包括xls文件和xlsx文件)——基于xlrd、xlwt和openpyxl模块

 

本文介绍一下使用Python对Excel文件的基本操作,包括使用xlrd模块读取excel文件,使用xlwt模块将数据写入excel文件,使用openpyxl模块读取写入和修改excel文件。

【最近一些朋友反映个别代码无法调试(但是在我这里没问题),这里代码我都是调试过的,之前一年也没有朋友反馈过这些问题,所以大概率是版本问题。

我的版本如下: xlrd 1.1.0 、xlwt 1.3.0 、openpyxl 2.5.4 】

 

目录

1、使用xlrd模块对xls文件进行读操作

1.1 获取工作簿对象

1.2 获取工作表对象

1.3 获取工作表的基本信息

1.4 按行或列方式获得工作表的数据

1.5 获取某一个单元格的数据

2、使用xlwt模块对xls文件进行写操作

2.1 创建工作簿

2.2 创建工作表

2.3 按单元格的方式向工作表中添加数据

2.4 按行或列方式向工作表中添加数据

2.5 保存创建的文件

 3、使用openpyxl模块对xlsx文件进行读操作

3.1 获取工作簿对象

3.2 获取所有工作表名

3.3 获取工作表对象

3.4 根据索引方式获取工作表对象

3.5 获取工作表的属性

3.6 按行或列方式获取表中的数据

3.7 获取特定行或特定列的数据

3.8 获取某一块的数据

3.9 获取某一单元格的数据

4、使用openpyxl模块对xlsx文件进行写操作

4.1 创建工作簿和获取工作表

4.2 创建新的工作表

4.3 将数据写入工作表

4.4 保存工作簿

5、修改已经存在的工作簿(表)

5.1 插入一列数据

5.2 修改特定单元格

5.3 批量修改数据


1、使用xlrd模块对xls文件进行读操作

假设我们的表如下,是一个“农村居民家庭人均纯收入和农村居民家庭人均消费情况”的表格。后缀为.xls。里面包含两个工作表,“各省市”和“测试表”。

提一下,一个Excel文件,就相当于一个“工作簿”(workbook),一个“工作簿”里面可以包含多个“工作表(sheet)”

 

1.1 获取工作簿对象

引入模块,获得工作簿对象。


import xlrd  #引入模块

#打开文件,获取excel文件的workbook(工作簿)对象
workbook=xlrd.open_workbook("DataSource/Economics.xls")  #文件路径


1.2 获取工作表对象

我们知道一个工作簿里面可以含有多个工作表,当我们获取“工作簿对象”后,可以接着来获取工作表对象,可以通过“索引”的方式获得,也可以通过“表名”的方式获得。

'''对workbook对象进行操作'''

#获取所有sheet的名字
names=workbook.sheet_names()
print(names) #['各省市', '测试表']  输出所有的表名,以列表的形式

#通过sheet索引获得sheet对象
worksheet=workbook.sheet_by_index(0)
print(worksheet)  #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0>

#通过sheet名获得sheet对象
worksheet=workbook.sheet_by_name("各省市")
print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0>

#由上可知,workbook.sheet_names() 返回一个list对象,可以对这个list对象进行操作
sheet0_name=workbook.sheet_names()[0]  #通过sheet索引获取sheet名称
print(sheet0_name)  #各省市

1.3 获取工作表的基本信息

在获得“表对象”之后,我们可以获取关于工作表的基本信息。包括表名、行数与列数。

'''对sheet对象进行操作'''
name=worksheet.name  #获取表的姓名
print(name) #各省市

nrows=worksheet.nrows  #获取该表总行数
print(nrows)  #32

ncols=worksheet.ncols  #获取该表总列数
print(ncols) #13

1.4 按行或列方式获得工作表的数据

有了行数和列数,循环打印出表的全部内容也变得轻而易举。

for i in range(nrows): #循环打印每一行
    print(worksheet.row_values(i))  #以列表形式读出,列表中的每一项是str类型
#['各省市', '工资性收入', '家庭经营纯收入', '财产性收入', ………………]
#['北京市', '5047.4', '1957.1', '678.8', '592.2', '1879.0,…………]

col_data=worksheet.col_values(0)  #获取第一列的内容
print(col_data)

1.5 获取某一个单元格的数据

 我们还可以将查询精确地定位到某一个单元格。

在xlrd模块中,工作表的行和列都是从0开始计数的。

#通过坐标读取表格中的数据
cell_value1=sheet0.cell_value(0,0)
cell_value2=sheet0.cell_value(1,0)
print(cell_value1)  #各省市
print(cell_value2)   #北京市

cell_value1=sheet0.cell(0,0).value
print(cell_value1) #各省市
cell_value1=sheet0.row(0)[0].value
print(cell_value1)  #各省市

 

 

2、使用xlwt模块对xls文件进行写操作

2.1 创建工作簿


# 导入xlwt模块
import xlwt

#创建一个Workbook对象,相当于创建了一个Excel文件
book=xlwt.Workbook(encoding="utf-8",style_compression=0)

'''
Workbook类初始化时有encoding和style_compression参数
encoding:设置字符编码,一般要这样设置:w = Workbook(encoding='utf-8'),就可以在excel中输出中文了。默认是ascii。
style_compression:表示是否压缩,不常用。
'''

2.2 创建工作表

创建完工作簿之后,可以在相应的工作簿中,创建工作表。


# 创建一个sheet对象,一个sheet对象对应Excel文件中的一张表格。
sheet = book.add_sheet('test01', cell_overwrite_ok=True)
# 其中的test是这张表的名字,cell_overwrite_ok,表示是否可以覆盖单元格,其实是Worksheet实例化的一个参数,默认值是False

2.3 按单元格的方式向工作表中添加数据


# 向表test中添加数据
sheet.write(0, 0, '各省市')  # 其中的'0-行, 0-列'指定表中的单元,'各省市'是向该单元写入的内容
sheet.write(0, 1, '工资性收入')

#也可以这样添加数据
txt1 = '北京市'
sheet.write(1,0, txt1)  
txt2 = 5047.4
sheet.write(1, 1, txt2)

 最后被文件被保存之后,上文语句形成的“工作表”如下所示:

<think>我们使用openpyxl库来操作Excel文件。要获取特定单元格的数据,首先需要加载工作簿,然后选择工作表,最后通过指定单元格的坐标(如'A1')或行列索引(如行=1,列=1)来访问单元格。 步骤: 1. 安装openpyxl(如果尚未安装):`pip install openpyxl` 2. 加载工作簿 3. 选择工作表(默认使用活动工作表,或者通过名称指定) 4. 获取单元格数据 注意:单元格的坐标可以是字符串形式(如'A1')或行列数字(行列从1开始)。 此外,用户可能想要获取单元格的值(value)或者公式(如果单元格包含公式,则通过`cell.value`获取的是公式计算后的结果,要获取公式本身,需要使用`cell.data_type`判断并获取公式字符串,但注意openpyxl读取文件时默认不读取公式,需要指定`data_only=False`)。 根据引用[1][2],我们可以这样操作: 引用[1]提到:使用openpyxl获取Excel文件中的单元格公式。在加载工作簿时,需要设置`data_only=False`(默认就是False,所以可以不设置)来保留公式信息。然后,通过`cell.value`可以获取公式字符串(如果单元格包含公式)。 引用[2]提到:使用openpyxl操作excel包括读取工作簿,以及按单元格写入。 因此,我们可以分两种情况: 情况一:获取单元格的值(计算后的结果) 在加载工作簿时,设置`data_only=True`,这样`cell.value`返回的是公式计算后的值。 情况二:获取单元格的公式(即公式字符串) 在加载工作簿时,使用默认的`data_only=False`(或者显式设置),然后通过`cell.value`获取公式字符串(如果单元格包含公式),否则获取值。 具体步骤: 1. 加载工作簿: - 对于值:`wb = load_workbook('example.xlsx', data_only=True)` - 对于公式:`wb = load_workbook('example.xlsx')` 或 `wb = load_workbook('example.xlsx', data_only=False)` 2. 选择工作表:`sheet = wb['Sheet1']` 或 `sheet = wb.active` 3. 获取单元格: - 方法1:通过坐标(字符串)`cell = sheet['A1']` - 方法2:通过行列索引(索引从1开始)`cell = sheet.cell(row=1, column=1)` 4. 获取内容: - 值或公式:`content = cell.value` 注意:如果单元格包含公式且`data_only=True`,那么`cell.value`是公式最后一次计算的结果(注意:如果Excel文件是在没有重新计算的情况下保存的,或者是由程序生成的,那么可能得到`None`)。如果`data_only=False`,那么对于包含公式的单元格,`cell.value`返回的是公式字符串(以等号开头,如`'=SUM(A2:A10)'`)。 示例代码: 获取单元格的值(计算后的结果): ```python from openpyxl import load_workbook # 加载工作簿,设置data_only=True以获取值 wb = load_workbook('example.xlsx', data_only=True) sheet = wb['Sheet1'] # 或使用 wb.active 获取活动工作表 # 获取单元格A1的值 cell = sheet['A1'] print(f"单元格A1的值是: {cell.value}") # 通过行列索引获取B2单元格的值 cell = sheet.cell(row=2, column=2) print(f"单元格B2的值是: {cell.value}") wb.close() ``` 获取单元格的公式: ```python from openpyxl import load_workbook # 加载工作簿,不设置data_only或设置为False以获取公式 wb = load_workbook('example.xlsx') # 默认data_only=False sheet = wb['Sheet1'] # 获取单元格A1的公式 cell = sheet['A1'] if cell.data_type == 'f': # 'f'表示公式 print(f"单元格A1的公式是: {cell.value}") else: print(f"单元格A1的值是: {cell.value}") # 通过行列索引获取B2单元格的公式 cell = sheet.cell(row=2, column=2) if cell.data_type == 'f': print(f"单元格B2的公式是: {cell.value}") else: print(f"单元格B2的值是: {cell.value}") wb.close() ``` 注意:`cell.data_type`的可能值包括:'s'(字符串)、'n'(数字)、'b'(布尔)、'd'(日期)、'f'(公式)等。 另外,引用[3]中展示了如何从单元格中下载图片,但用户的问题是关于获取单元格数据,因此我们不需要处理图片。 综上所述,用户可以根据需求选择加载模式(data_only为True或False)来获取单元格的值或公式。 最后,生成相关问题:</think>### 使用 Openpyxl 获取 Excel 特定单元格数据的方法 在 Python 中,使用 openpyxl 库可以高效地访问操作 Excel 文件的单元格数据。以下是详细的操作步骤: --- #### 1. **安装 openpyxl** ```bash pip install openpyxl ``` #### 2. **基本操作流程** ```python from openpyxl import load_workbook # 加载工作簿 workbook = load_workbook('your_file.xlsx') # 替换为你的文件路径[^2] # 选择工作表 sheet = workbook['Sheet1'] # 或 workbook.active 获取活动工作表 # 获取特定单元格数据 cell_value = sheet['A1'].value # 通过坐标获取 cell_value = sheet.cell(row=1, column=1).value # 通过行列索引获取 print(f"单元格 A1 的值: {cell_value}") ``` --- #### 3. **常用访问方法** | **方法** | **示例** | **说明** | |----------|----------|----------| | 坐标访问 | `sheet['B3'].value` | 直接使用 Excel 坐标 (如 B3) | | 行列索引 | `sheet.cell(row=3, column=2).value` | 行列从 1 开始计数 | | 公式获取 | `sheet['C1'].value` | 直接返回公式字符串 `=SUM(A1:B1)` | | 批量访问 | `for row in sheet.iter_rows(): ...` | 遍历行/列数据 | --- #### 4. **完整示例:读取单元格公式** ```python def get_cell_formula(file_path, sheet_name, cell_ref): """获取指定单元格的公式""" wb = load_workbook(file_path, data_only=False) # data_only=False 保留公式[^1] sheet = wb[sheet_name] # 验证是否为公式单元格 if sheet[cell_ref].data_type == 'f': # 'f' 表示公式 return sheet[cell_ref].value # 返回公式字符串 return None # 使用示例 formula = get_cell_formula('data.xlsx', 'Sheet1', 'C5') print(f"单元格 C5 的公式: {formula}") # 输出: =SUM(A1:B10) ``` --- #### 5. **高级技巧** - **动态范围访问**: ```python # 获取 A 列所有数据 column_data = [cell.value for cell in sheet['A'] if cell.value is not None] # 获取第 2 行所有数据 row_data = [cell.value for cell in sheet[2]] ``` - **带类型的值获取**: ```python cell = sheet['D4'] print(f"值: {cell.value}, 数据类型: {cell.data_type}") # 可能输出: 值: 42.5, 数据类型: n (数字) ``` - **写入数据**: ```python sheet['E1'] = "新数据" # 直接赋值 sheet.cell(row=2, column=5).value = 100 # 行列索引赋值 workbook.save('updated_file.xlsx') # 保存修改[^2] ``` --- #### 注意事项: 1. 行列索引从 **1 开始**(不是 0) 2. 使用 `data_only=True` 参数获取公式计算结果(而非公式本身) 3. 操作后必须调用 `workbook.save()` 保存更改 4. 对于大型文件,使用 `read_only=True` 模式提高性能 > 通过 openpyxl 的灵活 API,您可以精确控制 Excel 文件中的每个单元格,实现数据的读取修改分析[^1][^2]。
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值