python - 使用 openpyxl 在 Excel 工作表中查找隐藏列时缺少列

标签 python excel pandas openpyxl

我正在尝试仅读取 Excel 工作表中的非隐藏列并使用相同的数据框创建数据框。同时使用 pandas 和 openpyxl。

使用column_dimension时,Openpyxl找不到连续的隐藏列。如果创建隐藏状态时存在分组,则仅返回第一个隐藏列。 例如,如果列 E 和 F 作为一组隐藏,则 E 已隐藏设置为 true,并且列列表中缺少 F。 因此,我所做的就是获取工作表中所有可能的列和所有列之间的差异,从而获得丢失的隐藏列。然后将其与具有隐藏状态的列连接起来以获得“所有”隐藏列。

但是发生的情况是一些不在column_dimensions 中的列在实际的Excel 工作表中没有显示为隐藏。不确定如何仅获取真正的“隐藏”列的列表。

这是我写的代码

# 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() 没有返回工作表中所有列的完整列表。我能够通过迭代工作表中的所有列并测试该列是否隐藏来找到所有隐藏的列。如 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))

关于python - 使用 openpyxl 在 Excel 工作表中查找隐藏列时缺少列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70794050/

相关文章:

VB6 Excel.Application对象 "Permission Denied"

c# - 在 C# 中读取 excel 文件时获取 ###### 值

python - 我们如何将新数据写入现有的 Excel 电子表格?

python - 使用热图居中表格

python - sklearn - 从文本文档预测多标签分类中的前 3-4 个标签

python - Python 中有声明关键字吗?

python - 在 Pandas 中加载 .rds 文件

python - 将带有运算符的列表缩减为对 mpi4py 中的每个元素求和

performance - 如何测量 Excel 计算时间

python - Pandas 合并和求和数据帧