How To Find The Active Number Of Elements On A Single Column/row Using Openpyxl In Python?
I am using openpyxl. I have the below basic spreadsheet. I am trying to just get the active number of elements in a particular column using len() and filter but still not gett
Solution 1:
Spreadsheets are tables of rows and columns so if a spreadsheet has 30 rows then all columns have 30 cells. As to whether a cell is active or not, you have to decide what are the criteria for this but this is trivial to do:
not_empty = [c for c in ws.iter_rows(min_col=1, max_col=1, values_only=True) if c[0] isnotNone]
print(len(not_empty))
Solution 2:
Question: get the active number of elements in a particular column
Worksheet:
Title Title Title 134NoneNoneNone134
min_col =1 # 'A'
val_counter =0
# Iterate allRows, starting at'min_row='
# Iterate onlyONEColumn, therefore 'min_col='and'max_col=' have the same value
# Returns a Tuple ofColumnValues ((value A2,), (value A3), ...)
for cells in ws.iter_rows(min_row=2,
min_col=min_col, max_col=min_col,
values_only=True):
value= cells[0]
# Condition, which to count
if valueisnotNone:
val_counter +=1
print('Values are {}'.format(val_counter))
# >>>Valuesare2
OOP Solution:
Extending openpyxl class Worksheet
with a .filter(...
methode.
import openpyxl
classWorksheet:
def__init__(self, pyxl):
for attr in ['filter', 'filter_list']:
setattr(pyxl.worksheet.worksheet.Worksheet,
attr,
getattr(Worksheet, attr)
)
deffilter(self, f, range=None, values_only=True):
cells = self.iter_rows(min_row=range[0],
min_col=range[1],
max_row=range[2],
max_col=range[3],
values_only=values_only
)
for row in cells:
yieldfrom (c for c in row if f(c))
deffilter_list(self, f, range=None, values_only=True):
return [v for v in self.filter(f, range, values_only)]
# Extend openpyxl Worksheet
Worksheet(openpyxl)
Usage:
wb = openpyxl.Workbook()
ws = wb.active
# Add some test data
ws.append(['Title', 'Title', 'Title'])
for r inrange(3):
if r == 1:
ws.append([None, None, None])
else:
ws.append([1, 3, 4])
# Filter Values, where Cell.value is not None# range(min_row, min_col, max_row, max_col)# Return a List of Values
cells = ws.filter_list(lambda v: v isnotNone,
range=(2, 1, ws.max_row, 1)
print('Values are {}'.format(len(cells)))
# >>> Values are 2
Post a Comment for "How To Find The Active Number Of Elements On A Single Column/row Using Openpyxl In Python?"