如何编辑此代码以从多个Excel文件的特定工作表提取数据并显示在单独文件中

1 投票
1 回答
75 浏览
提问于 2025-04-14 15:42

我有一段Python代码,它可以从多个Excel文件中提取数据,并把选中的数据放到一个单独的文件里,方便进一步分析。这个功能是可以用的:

import os
import openpyxl

folder = 'D:\My Documents\Code\Data'
output_file = 'D:\My Documents\Code\Data\masterfile.xlsx'

output_wb = openpyxl.Workbook()
output_sheet = output_wb.active
output_sheet.title = 'masterfile'

cells = ['A2', 'B2', 'C2']

for filename in os.listdir(folder):
    if filename.endswith('.xlsx'):
        filename = os.path.join(folder, filename)
        workbook = openpyxl.load_workbook(filename)
        values = [workbook.active[cell].value for cell in cells]
        output_sheet.append(values)

output_wb.save(output_file)

不过,它只能从当前活动的工作表中提取数据……这就意味着,如果我想从Sheet2中提取数据,我必须把所有的Excel文件(有几百个)都保存成Sheet2为活动工作表,否则代码就无法运行。所以我想尝试在代码里直接设置活动工作表,但这样也不行。我才学Python一个月,并不是专业程序员,而是一个处理大量生物数据的科学家。这段代码不管用,我需要帮助来修复它。

import os
import openpyxl

folder = 'D:\My Documents\Code\Data'
output_file = 'D:\My Documents\Code\Data\masterfile.xlsx'

wb = openpyxl.Workbook()

output_wb = openpyxl.Workbook()
output_sheet = output_wb.active
output_sheet.title = 'masterfile'

cells = ['A2', 'B2', 'C2']

for filename in os.listdir(folder):
    if filename.endswith('.xlsx'):
        filename = os.path.join(folder, filename)
        workbook = openpyxl.load_workbook(filename)
        workbook.active = workbook.sheetnames.index('Sheet2')
        values = [workbook.active[cell].value for cell in cells]
        output_sheet.append(values)

output_wb.save(output_file)

我尝试把活动工作表设置为Sheet2,但它只会从原始Excel文件中当前活动的工作表提取数据。

我也试过这些链接里的建议,但都没有用:

用openpyxl设置活动工作表 如何在Excel openpyxl中切换工作表以进行更改 使用openpyxl按名称获取工作表

任何帮助都非常感谢。

1 个回答

1

你并没有缺少任何模块

这里有个快速教程,教你如何选择工作表

活动工作表是指在保存工作簿时处于焦点的那个工作表,你可以通过以下方式访问它:

sheet = wb.active

这里的 'wb' 是 Openpyxl 的工作簿对象。这也适用于在创建新工作簿时选择默认的工作表。

如果你想选择工作簿中的其他工作表,可以通过名称来选择;

sheet = wb['<sheet name>']

其中 <sheet name> 是工作表的名称(在 Openpyxl 中也叫做 '标题'),注意名称是区分大小写的。如果工作表的名称是 'Sheet1',那么 wb['sheet1'] 会返回错误。

此外,工作表的 名称 存在于列表 wb.sheetnames 中,也就是说,这个列表仅包含工作表的名称,都是字符串。
因此,你可以通过以下方式选择工作簿中的每个工作表;

for sheetname in wb.sheetnames:
    sheet = wb[sheetname]
    ...

但通常只有在你想根据标题筛选工作表时才会使用这种方法。

实际的 工作表对象 存储在列表 wb.worksheets 中。
如果你想处理工作簿中的每个工作表,可以通过以下方式遍历所有工作表;

for sheet in wb.worksheets:
    print(sheet.title)
    # do something with the worksheet object 'sheet' having 'title' ...

因此,使用这个列表,你也可以通过索引选择工作表,如下所示:

sheet = wb.worksheets[X]

其中 X 是你需要的工作表的索引。

工作表通常按它们在工作簿中出现的顺序列出。

撰写回答