使用 openpyxl 在 excel 工作表中查找隐藏列时缺少列
Columns missing when looking for hidden columns in excel worksheet using openpyxl
我正在尝试只读取 excel 工作sheet 中的非隐藏列,并使用它创建一个数据框。同时使用 pandas 和 openpyxl.
Openpyxl 在使用 column_dimension 时找不到连续的隐藏列。如果在创建隐藏状态时有分组,则只返回第一个隐藏列。
例如,如果列 E 和 F 作为一个组隐藏,则 E 已隐藏设置为 true,列列表中缺少 F。
因此,我所做的是计算 sheet 中所有可能的列和所有列之间的差异,从而得到丢失的隐藏列。然后将其与具有隐藏状态的那些连接起来以获得 'all' 个隐藏列。
但是正在发生的事情是一些不在 column_dimension 中的列没有显示为隐藏在实际的 excel sheet 中。不确定如何仅获取真实 'hidden' 列的列表。
这是我写的代码
# reading the file and worksheet
wb = load_workbook(path, read_only = False)
ws = wb['Overview']
mx_col = ws.max_column
col_indx =[]
for i in range(1,mx_col+1):
num = get_column_letter(i)
col_indx.append(num)
hid_cols = []
col_vals = []
for col, dimension in ws.column_dimensions.items():
col_vals.append(col)
if dimension.hidden:
hid_cols.append(col)
diff = list(set(col_indx) - set(col_vals))
hidden_columns = diff+hid_cols
ws.column_dimensions.items()
似乎没有返回 sheet 中所有列的完整列表。通过遍历 sheet 中的所有列并测试该列是否隐藏,我能够找到所有隐藏的列。如 this answer 中所述,Excel 合并分组列的单元格定义,但您可以使用 max
属性查找该组中的最后一列。因此,一旦找到隐藏列,您可以使用 max
属性轻松找到该组的其余部分。
import openpyxl as op
from openpyxl.utils import get_column_letter
wb = op.load_workbook("Date_format.xlsx")
ws = wb["Sheet1"]
max_col = ws.max_column
cols = [get_column_letter(i) for i in range(1, max_col+1)]
# Find hidden columns
hidden_cols = []
last_hidden = 0
for i, col in enumerate(cols):
# Column is hidden
if ws.column_dimensions[col].hidden:
hidden_cols.append(col)
# Last column in the hidden group
last_hidden = ws.column_dimensions[col].max
# Appending column if more columns in the group
elif i+1 <= last_hidden:
hidden_cols.append(col)
visible_cols = [col for col in cols if col not in hidden_cols]
print("Columns:\t\t", cols)
print("Hidden columns:\t", hidden_cols)
print("Visible columns:", visible_cols)
>>>
Columns: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
Hidden columns: ['B', 'D', 'E', 'G', 'H', 'I']
Visible columns: ['A', 'C', 'F', 'J']
或者更嵌套的 for 循环版本(更少 Pythonic):
for i, col in enumerate(cols):
if ws.column_dimensions[col].hidden:
for col_num in range(ws.column_dimensions[col].min, ws.column_dimensions[col].max + 1):
hidden_cols.append(get_column_letter(col_num))
我正在尝试只读取 excel 工作sheet 中的非隐藏列,并使用它创建一个数据框。同时使用 pandas 和 openpyxl.
Openpyxl 在使用 column_dimension 时找不到连续的隐藏列。如果在创建隐藏状态时有分组,则只返回第一个隐藏列。 例如,如果列 E 和 F 作为一个组隐藏,则 E 已隐藏设置为 true,列列表中缺少 F。 因此,我所做的是计算 sheet 中所有可能的列和所有列之间的差异,从而得到丢失的隐藏列。然后将其与具有隐藏状态的那些连接起来以获得 'all' 个隐藏列。
但是正在发生的事情是一些不在 column_dimension 中的列没有显示为隐藏在实际的 excel sheet 中。不确定如何仅获取真实 'hidden' 列的列表。
这是我写的代码
# reading the file and worksheet
wb = load_workbook(path, read_only = False)
ws = wb['Overview']
mx_col = ws.max_column
col_indx =[]
for i in range(1,mx_col+1):
num = get_column_letter(i)
col_indx.append(num)
hid_cols = []
col_vals = []
for col, dimension in ws.column_dimensions.items():
col_vals.append(col)
if dimension.hidden:
hid_cols.append(col)
diff = list(set(col_indx) - set(col_vals))
hidden_columns = diff+hid_cols
ws.column_dimensions.items()
似乎没有返回 sheet 中所有列的完整列表。通过遍历 sheet 中的所有列并测试该列是否隐藏,我能够找到所有隐藏的列。如 this answer 中所述,Excel 合并分组列的单元格定义,但您可以使用 max
属性查找该组中的最后一列。因此,一旦找到隐藏列,您可以使用 max
属性轻松找到该组的其余部分。
import openpyxl as op
from openpyxl.utils import get_column_letter
wb = op.load_workbook("Date_format.xlsx")
ws = wb["Sheet1"]
max_col = ws.max_column
cols = [get_column_letter(i) for i in range(1, max_col+1)]
# Find hidden columns
hidden_cols = []
last_hidden = 0
for i, col in enumerate(cols):
# Column is hidden
if ws.column_dimensions[col].hidden:
hidden_cols.append(col)
# Last column in the hidden group
last_hidden = ws.column_dimensions[col].max
# Appending column if more columns in the group
elif i+1 <= last_hidden:
hidden_cols.append(col)
visible_cols = [col for col in cols if col not in hidden_cols]
print("Columns:\t\t", cols)
print("Hidden columns:\t", hidden_cols)
print("Visible columns:", visible_cols)
>>>
Columns: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
Hidden columns: ['B', 'D', 'E', 'G', 'H', 'I']
Visible columns: ['A', 'C', 'F', 'J']
或者更嵌套的 for 循环版本(更少 Pythonic):
for i, col in enumerate(cols):
if ws.column_dimensions[col].hidden:
for col_num in range(ws.column_dimensions[col].min, ws.column_dimensions[col].max + 1):
hidden_cols.append(get_column_letter(col_num))