Ordereddict - 如何迭代读取 Excel 文件中所有工作表中的相同单元格?

问题描述 投票:0回答:1

ordereddict
的上下文中,我想循环遍历 Excel 文件中的所有工作表,从每个工作表中读取 B2 单元格的内容,然后将其打印出来。稍后,我计划根据该单元格的字符串值设置条件。

  • 感兴趣的单元格是B2:我想打印三个不同的学生姓名,分别是Roberto、Miquel Angelo 和Leonardo。
  • 我当前的代码仅在 Sheet_3 中打印“Leonardo”,而没有考虑其余工作表上 B2 中的信息。
# Importing modules
import openpyxl as op
import pandas as pd
import numpy as np
import xlsxwriter
import openpyxl
from openpyxl import Workbook, load_workbook

# Defining the file path
file_path = r'C:/Users/machukovich/Desktop/stackoverflow.xlsx'

# Load workbook as openpyxl
reference_workbook = load_workbook(file_path)

# We will mantain the workbook open
wb = reference_workbook.active

# Loading the file into a dictionary of Dataframes
dict_of_df = pd.read_excel(file_path, sheet_name=None, skiprows=2)

# Writting the loop itself (it only prints Leonardo)
for sheet_name, df in dict_of_df.items():
    student_name = wb['B2'].value
    print(f"Student Name: {student_name}")
  • 您可以在下面找到 Excel 文件的快照以进一步说明。
pandas dataframe for-loop ordereddictionary ordereddict
1个回答
0
投票

来自 https://openpyxl.readthedocs.io/en/stable/tutorial.html#create-a-workbook :

工作簿始终至少包含一个工作表。您可以通过使用 Workbook.active 属性来获取它:

ws = wb.active

信息:默认设置为 0。除非您修改其值,否则使用此方法您将始终获得第一个工作表。

您永远不会更改

reference_workbook.active
并且
wb
始终是工作簿的第一个工作表。然后,此外,您还可以使用 pandas 通过(正确地)传递 None 作为sheet_name 来加载所有工作表。您也可以正确地迭代它们,但在循环内您总是访问
wb
而无需实际使用工作表
df
的 pandas 数据框。所以你基本上混合了两种解决方案。

所以你有两个选择:

1:删除 pd.load_excel 并通过使用类似

的方式迭代工作表来使用 openpyxl
for sheet in reference_workbook:
    print(sheet["B2"])

2:通过访问

df
而不是
wb
,将 OrderedDict 与 pandas 数据框一起使用。但是,因为您通过了
skiprows=2
,所以您切断了 B2,并且工作表将从第 3 行开始。

© www.soinside.com 2019 - 2024. All rights reserved.