每日10行代码67:openpyxl指定工作表(sheet)的5种方法

20210330更新了部分内容。

今天工作时,写了一小段代码,大概功能就是比对excel里的数据与数据库里的数据差异,具体实现就是根据excel里维度列(就是sql中where后的部分)到数据库查找相应的值,然后写入到excel,并且跟excel里的相关值进行比对,查看是否有差异。
因为要操作excel,所以又温习了下openpyxl. 下面是访问openpyxl指定工作表(sheet)的5种方法:

from openpyxl import *
wb = load_workbook(r'test.xlsx')
print(wb._sheets[0])
print(wb.get_active_sheet())   # 在新版本中是 wb.active
print(wb.get_sheet_by_name('Sheet1'))
print(wb['Sheet1'])
print(wb.worksheets[0])

以上方法第一个直接访问受保护的成员,是不推荐的,第二个方法只能获取当前活动的sheet,第三、四个方法是共通的,第五个方法根据索引来获取sheet,也是很不错的。
看到一个功能能这么多的实现,我觉得openpyxl的代码不太符合python之禅

There should be one-- and preferably only one --obvious way to do it.

不过我可以来自己定义一个仅有一个且最好的方法:

  1. 如果知道sheet名,那么就用wb[‘Sheet1’])
  2. 如果知道工作表索引,就用wb.worksheets[0]
  3. 如果想遍历那么用:
for sheet in wb.worksheets:
    print(sheet)

我挺认同python之禅的这一条的,有时候选择多了确实很让人困惑,不如实现的方式少一点,好一点。这就跟买东西一样:
与其你给我一堆东西给我选,不如直接告诉我哪个是好的。

<think>嗯,用户问的是如何使用编程方法或工具批量提取数值,特别是从多个Excel文件中提取数据。首先,我需要回忆一下相关的知识,比如Python中的库,比如pandas和openpyxl,或者VBA的方法。用户可能想要一个具体的步骤指南,所以得详细分步骤说明。 然后,看看用户提供的引用资料。引用1提到按或列提取数据,引用2和3讲的是批量处理Excel,使用GetOpenFilename方法或者Python循环打开文件。引用5提到批量提取多个Excel文件的指定单元格数据。这些应该整合到回答中。 接下来,我需要确定用哪种工具比较合适。Python是比较通用的选择,尤其是pandas库,处理Excel数据很方便。另外,VBA可能适合熟悉Excel的用户,但可能不如Python灵活。所以重点放在Python上,同时简要提一下VBA。 然后,分步骤说明Python的实现方法。首先安装库,比如pandas和openpyxl。然后,遍历文件夹中的Excel文件,使用pandas读取,提取指定单元格,比如B2,然后汇总到新的DataFrame中。代码示例要简单明了,用户可以直接复制使用吗?需要检查一下语法是否正确,比如使用os.listdir,正确读取文件,处理可能的异常。 另外,用户可能还需要处理更复杂的情况,比如条件筛选或者动态区域。这时候可能需要使用XPath或者其他方法,但引用4提到XPath的函数,不过Excel处理通常用pandas的函数,比如loc或iloc。比如提取特定条件的,可以用df[df['列名'] > 100],这样。 然后,注意事项部分要提醒用户文件路径的正确性,单元格位置的索引是否正确,以及数据格式的问题,比如文本转数值可能需要处理。异常处理比如try-except块,避免程序崩溃。 最后,生成相关问题,比如如何合并不同结构的数据,或者处理大数据量的优化方法,或者数据清洗的问题。这些问题应该和用户的问题相关,帮助他们进一步学习。 要确保回答结构清晰,分点说明,代码用正确的格式,数学表达式用$符号,比如在提到公式时。不过这个问题可能不需要数学公式,但如果有的话要按规则处理。 总之,回答应该先介绍Python方法,给出代码示例,然后VBA的简要步骤,再讲高级应用,注意事项,最后相关问题。引用对应的参考资料,比如引用2、3、5Python部分,引用2在VBA部分。</think>### 批量提取数值的编程实现方法 #### 一、Python方案(推荐) 1. **核心工具** - 使用`pandas`库处理数据框架,`openpyxl`/`xlrd`读取Excel文件 - 代码框架: ```python import pandas as pd import os folder_path = "excel_files" output = [] for file in os.listdir(folder_path): if file.endswith(".xlsx"): df = pd.read_excel(os.path.join(folder_path, file)) # 提取B2单元格示例 value = df.iloc[1, 1] # 号列号从0开始 output.append({"文件名": file, "数值": value}) pd.DataFrame(output).to_excel("汇总结果.xlsx", index=False) ``` 2. **进阶功能** - 动态区域提取:`df.loc[起始:结束, 起始列:结束列]` - 条件筛选:`df[df['销售额'] > 1000]` - 多表处理:`pd.read_excel(..., sheet_name=None)`读取所有工作表[^5] #### 二、VBA方案(适合Excel原生环境) ```vba Sub BatchExtract() Dim files As Variant files = Application.GetOpenFilename(FileFilter:="Excel Files,*.xlsx", MultiSelect:=True) For Each file In files Workbooks.Open file ThisWorkbook.Sheets("汇总").Cells(Rows.Count, 1).End(xlUp).Offset(1) = _ ActiveWorkbook.Sheets(1).Range("B2").Value ActiveWorkbook.Close Next file End Sub ``` #### 三、特殊场景处理 1. **非固定位置提取** 使用`XPath`表达式定位数据(XML结构文件)[^4],或通过正则表达式匹配特征字符串: ```python import re pattern = r"\d+\.\d+" # 匹配浮点数 matches = re.findall(pattern, cell_value) ``` 2. **大数据量优化** - 分块读取:`pd.read_excel(..., chunksize=1000)` - 内存映射:`mode='r'`参数减少内存占用[^3] #### 注意事项 1. 文件路径建议使用原始字符串(`r"路径"`)避免转义问题 2. 处理前验证单元格数据类型(`df.dtypes`) 3. 添加异常处理: ```python try: value = float(df.iloc[1, 1]) except ValueError: value = None ``` #### 典型应用场景 - 财务系统每日报表汇总 - 实验仪器生成的数据文件解析 - 电商平台多店铺销售数据整合[^1]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值