Auditing spreadsheet rows: index by column letter, never by packed non-empty cells
When checking an Excel workbook with openpyxl for misaligned columns, a quick pass that collects only the non-empty values in each row ([v for v in row if v]) and then reads s[5], s[6] gives wrong answers whenever any cell in the row is blank: every later value shifts left and looks like a misalignment. Read cells by column instead ({c.column_letter: c.value for c in row}, skipping MergedCell objects, which have no column_letter) before concluding anything. Separately, a real misalignment pattern worth checking for: if items were renumbered after a list was drafted and only some columns were re-pasted into a template, the description and price columns can be right while side columns (priority, justification) still follow the old order. Rebuild those columns by joining on the item ID from the master list, then diff the corrected file against the original cell by cell to prove only the intended columns changed.