Q:

¿Cómo hacer un árbol de busqueda que se pueden consultar en varios lugares desde un archivo .xlsx?

Tengo un árbol en forma de archivo de Excel. Quiero almacenar las divisiones para presentarlas al usario. El objetivo es permitir al usuario buscar en tantas áreas del árbol como quiera :

¿Cómo leer las columnas para almacenar el que tiene "Division" ?
Intenta el siguiente codigo con openpyxl pero genera un AttributeError porque ReadOnlyWorksheet object has no attribute 'iter_cols' cuando leo las líneas una a una.
from openpyxl import load_workbook

wb = load_workbook(filename='Trees.xlsx', 
                   read_only=True)

ws = wb['Industry']

# Test if the cell values are "Division", if it is the case, store it
divisions = []
for cell in ws['A']:
    if "Division" in cell :
        divisions.append(cell.value)

# Transform into dataframe
import pandas as pd
df = pd.DataFrame(division)

print(df)

El error fue :
mike@mike-thinks:~/Data/on_2018_04_25_16_43_17$ python3 getSelection.py
Traceback (most recent call last):
  File "getSelection.py", line 10, in <module>
    for cell in ws['A']:
  File "/home/mike/.local/lib/python3.5/site-packages/openpyxl/worksheet/read_only.py", line 85, in __getitem__
    return meth(key)
  File "/home/mike/.local/lib/python3.5/site-packages/openpyxl/worksheet/worksheet.py", line 351, in __getitem__
    cols = tuple(self.iter_cols(min_col, max_col))
AttributeError: 'ReadOnlyWorksheet' object has no attribute 'iter_cols'

De manera más general, cómo hacer un árbol de busqueda que se pueden consultar en varios lugares desde el archivo .xlsx?
Pueden descargar los arboles aqui.

A:

No se puede iterar o seleccionar columnas con el modo de solo lectura activo, aparentemente se debe a cómo son almacenados los datos en el XML según se explica en la respuesta a este mismo problema expuesto en el repositorio oficial de openpyxl.
Aparte de esto, dado que Openpyxl parsea los datos a tipos Python válidos, debes modificar tu condicional para solo comprobar aquellas celdas que sean de tipo str.
Por lo tanto, o bien iteras sobre las filas:
from openpyxl import load_workbook
import pandas as pd

wb = load_workbook(filename='Trees.xlsx',
                   read_only=True)

ws = wb['Industry']

# Test if the cell values are "Division", if it is the case, store it
divisions = (row[0].value for row in ws.iter_rows(max_col=1)
                 if row[0].data_type == "s" and "Division"in row[0].value)

# Transform into dataframe
df = pd.DataFrame(divisions)

print(df)

O no usas el modo de solo lectura:
from openpyxl import load_workbook
import pandas as pd

wb = load_workbook(filename='Trees.xlsx')

# Test if the cell values are "Division", if it is the case, store it
divisions = (cell.value for cell in wb['Industry']['A']
                 if cell.data_type == "s" and "Division" in cell.value)

# Transform into dataframe
df = pd.DataFrame(divisions)

print(df)

La salida es:

                                                   0
0     Division A: Agriculture, Forestry, And Fishing
1                                 Division B: Mining
2                           Division C: Construction
3                          Division D: Manufacturing
4  Division E: Transportation, Communications, El...
5                        Division F: Wholesale Trade
6                           Division G: Retail Trade
7    Division H: Finance, Insurance, And Real Estate
8                               Division I: Services
9                  Division J: Public Administration

En vez de usar una lista intermedia se usa un generador directamente. data_type == "s" se encarga de discriminar aquellas celdas que contienen cadenas de aquellas que no (en tu caso las que son de tipo numérico). En caso contrario obtendrás un error al intentar iterar sobre un entero o float.
En cuanto a cómo implementar un sistema de búsqueda, tienes muchas opciones, si he entedido lo que buscas una de ellas podría ser por ejemplo crear un DataFrame MultiIndex a partir del archivo pudiendo realizar consultas de forma simple con las herramientas de Pandas.

