DEV Community

Jeremy K.
Jeremy K.

Posted on

Deleting Blank Rows and Columns in Excel via Python

Manually removing blank rows and columns from large Excel files is tedious and error‑prone. By combining Python with the Free Spire.XLS for Python library, you can automate this cleaning process in just a few lines of code. Unlike traditional approaches that loop through every cell, Free Spire.XLS offers the IsBlank property – a direct, efficient way to identify empty rows and columns.


1. Environment Setup

Free Spire.XLS for Python is a lightweight, standalone library that does not require Microsoft Excel to be installed. It supports both .xls and .xlsx formats.

Install it via pip:

pip install Spire.XLS.Free
Enter fullscreen mode Exit fullscreen mode

Note: The free edition is limited to small workloads.


2. How to Delete Blank Rows & Columns

The following script loads an Excel file, deletes all completely blank rows and columns from the first worksheet, and saves the result.

from spire.xls import Workbook, ExcelVersion

# Load the workbook
workbook = Workbook()
workbook.LoadFromFile("Input.xlsx")

# Access the first worksheet
sheet = workbook.Worksheets[0]

# Delete blank rows (iterate backwards)
for i in range(sheet.Rows.Length - 1, -1, -1):
    if sheet.Rows[i].IsBlank:
        sheet.DeleteRow(i + 1)      # Note: DeleteRow uses 1‑based index

# Delete blank columns (iterate backwards)
for j in range(sheet.Columns.Length - 1, -1, -1):
    if sheet.Columns[j].IsBlank:
        sheet.DeleteColumn(j + 1)   # DeleteColumn uses 1‑based index

# Save and clean up
workbook.SaveToFile("Cleaned.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
Enter fullscreen mode Exit fullscreen mode

Key points explained

  • sheet.Rows.Length / sheet.Columns.Length

    Returns the total row/column count (including blanks) – used as the iteration boundary.

  • IsBlank property

    Returns True only if every cell in the row/column is truly empty (no data, no formula, no space characters).

  • Reverse iteration

    Deleting forward shifts indices; backward iteration prevents skipping rows/columns.

  • Index offset trap

    Rows[i] is 0‑based, but DeleteRow(i+1) is 1‑based. Always add 1.

  • workbook.Dispose()

    Releases unmanaged resources – especially important when processing many files.


3. Important Considerations

a. What IsBlank considers “blank”

  • ✅ Cells with absolutely no content.
  • ❌ Cells that contain:
    • Space characters (" ")
    • Empty strings ("") from formulas
    • Null values (#NULL!, etc.) These are not blank according to IsBlank.

Workaround: To treat cells with only spaces as blank, strip whitespace:

if sheet.Rows[i].Cells[col_index].Text.strip() == "":
    # treat as blank
Enter fullscreen mode Exit fullscreen mode

b. Processing multiple worksheets

Wrap the deletion logic in a loop to clean every sheet:

for sheet in workbook.Worksheets:
    # ... deletion code for rows and columns ...
Enter fullscreen mode Exit fullscreen mode

c. Performance tip

IsBlank is highly optimized – it does not iterate through cells internally. Use it instead of manual cell‑by‑cell checks whenever possible.


4. Extended Usage Scenarios

4.1 Batch process all Excel files in a folder

Define a reusable function and apply it to every .xlsx / .xls file in a directory.

import os
from spire.xls import Workbook, ExcelVersion

def clean_excel_file(input_path, output_path):
    """Remove blank rows/columns from all worksheets in a file."""
    workbook = Workbook()
    workbook.LoadFromFile(input_path)

    for sheet in workbook.Worksheets:
        # Delete blank rows
        for i in range(sheet.Rows.Length - 1, -1, -1):
            if sheet.Rows[i].IsBlank:
                sheet.DeleteRow(i + 1)
        # Delete blank columns
        for j in range(sheet.Columns.Length - 1, -1, -1):
            if sheet.Columns[j].IsBlank:
                sheet.DeleteColumn(j + 1)

    workbook.SaveToFile(output_path, ExcelVersion.Version2016)
    workbook.Dispose()

def batch_clean_folder(folder_path):
    """Clean all Excel files in the given folder."""
    for filename in os.listdir(folder_path):
        if filename.endswith(('.xlsx', '.xls')):
            input_full = os.path.join(folder_path, filename)
            output_full = os.path.join(folder_path, f"cleaned_{filename}")
            clean_excel_file(input_full, output_full)
            print(f"Processed: {filename}")

# Example usage
batch_clean_folder("data")
Enter fullscreen mode Exit fullscreen mode

4.2 Delete rows where a specific column is blank

Sometimes you only want to delete a row if a certain column (e.g., column A) is empty. Replace the blank‑row check with a targeted cell test:

# Inside the worksheet loop:
for i in range(sheet.Rows.Length - 1, -1, -1):
    # Column index 0 = column A
    cell_value = sheet.Rows[i].Cells[0].Text.strip()
    if cell_value == "":
        sheet.DeleteRow(i + 1)
Enter fullscreen mode Exit fullscreen mode

You can easily adapt this to check multiple columns or use more complex conditions.


5. Summary

Free Spire.XLS for Python provides a clean, efficient way to delete empty rows and columns via the IsBlank property. Combined with reverse iteration, the code is robust and easy to maintain.

This approach is ideal for:

  • Automated data cleaning pipelines
  • Preprocessing reports before analysis
  • Archiving legacy Excel files without manual scrubbing

By extending the core logic with the batch and conditional deletion patterns above, you can handle a wide range of real‑world Excel cleaning tasks with minimal effort.

Top comments (0)