Navigated to blog › batch-convert-excel-to-csv
Back to Blog
excel-guides

Batch Convert Multiple Excel Files to CSV Without Opening Each One

March 23, 2026
10
By SplitForge Team

Quick Answer

"Save As CSV" in Excel is a one-file operation. For a folder of 50 Excel files, it means opening each file, clicking Save As, confirming the format warning, closing, and repeating — approximately 45 minutes of mechanical work with no analytical value, and a high error rate from skipped confirmation dialogs.

Three methods eliminate this entirely:

  1. Browser-based — drag in a folder, download CSVs. No code. 30–60 seconds for most batches.
  2. Python pandas — 10 lines of code, handles any folder size, runs on a schedule.
  3. PowerShell — built into Windows, no Python required, handles multi-sheet workbooks with per-sheet output.

Fast Fix (60 Seconds)

Convert a folder of Excel files to CSV right now:

  1. Open Excel to CSV Converter in your browser
  2. Load all Excel files at once (drag folder or multi-select files)
  3. Choose: one CSV per file (first sheet) or one CSV per sheet
  4. Click Convert — all CSV files download as a zip
  5. Extract and use

Done. For 50 files, this typically takes 30–90 seconds for batches under ~1GB total size.


TL;DR: Manual Excel → CSV conversion is a 45-minute task for a folder of 50 files with error-prone confirmation dialogs on every file. All three automated methods below eliminate the manual work entirely. For sensitive data exports, the browser-based method processes locally without uploading your Excel files to a server.

Method Selector — choose before you start:

Your situationBest methodSetup timeMulti-sheet?Mac/Linux?
No code, one-timeBrowser-based30 seconds
Recurring/automated pipelinePython pandas5–10 min
Windows only, no PythonPowerShell5–10 min
Sensitive data, no uploadBrowser-based30 seconds
500+ filesPython pandas5–10 min

Mac and Linux users: PowerShell method requires Windows + Excel. Use the browser-based method or Python pandas — both work identically on Mac and Linux.


Also appears as: Bulk convert xlsx to csv, convert Excel folder to CSV, automated Excel to CSV, xlsx to csv batch, mass convert Excel files

Part of the SplitForge Excel Failure System: You're here → Batch Convert Excel to CSV Single file conversion → Convert CSV to Excel Without Freezing Excel to JSON → Convert Excel to JSON Large file operations → Excel Row Limit Fix


Each method was tested using Microsoft 365 Excel files, Windows 11, Python 3.12, pandas 2.2, PowerShell 7, March 2026.


What Manual Conversion Looks Like at Scale

❌ MANUAL CONVERSION — 50 Excel files:

File 1: Open → File → Save As → change type to CSV → Save →
        "This workbook contains features not compatible with CSV.
         Do you want to keep the workbook in this format?"
        → Keep Current Format → Close →
        "Do you want to save the changes you made to [filename]?"
        → Don't Save

Repeat 49 more times.

Total clicks per file: ~8
Total files: 50
Total clicks: ~400
Time: 40–50 minutes
Error rate: 1 in 10 files accidentally saved wrong format
             or confirmation dialog missed
❌ BROKEN CSV FROM MANUAL EXPORT (real failure output):

File: Northeast_Sales.csv (exported manually from Excel)

Row 1: Region,Date,Revenue,Units
Row 2: Northeast,01/15/2024,4200,87
Row 3: Northeast,01/16/2024,5100,94
Row 4: Region,Date,Revenue,Units          ← DUPLICATE HEADER — user missed a click
Row 5: Northeast,01/17/2024,3800,71
Row 6: Northeast,01/18/2024,4700,89
...

What happened: confirmation dialog appeared during multi-sheet export.
User clicked wrong option — sheet re-exported from row 1 instead of continuing.

Downstream impact:
→ SUMIF on Revenue column returns wrong total
→ Row 4 treated as data row in some tools ("Region" in Revenue column = NaN)
→ Import to CRM fails on row 4 type mismatch

Table of Contents


Before You Convert: Multi-Sheet Decisions

The most important decision before batch converting: what to do with multi-sheet workbooks.

CSV is a single-table format — one sheet, one file. A workbook with 4 sheets requires a decision:

ApproachOutputBest when
First sheet only1 CSV per workbookAll data is on Sheet1; other sheets are metadata/charts
All sheets as separate CSVsN CSVs per workbook (one per sheet)Each sheet is independent data table
Specific sheet by name1 CSV per workbookAll workbooks have a consistent sheet name (e.g., "Data")
Merged into one CSV1 CSV per workbookSheets are continuation data (Jan, Feb, Mar)

Decide this before running the conversion — changing the approach after means re-running the entire batch.

File format coverage — .xlsx, .xls, .xlsb, .xlsm:

FormatpandasPowerShellBrowserNotes
.xlsxopenpyxl✅ nativeMost common
.xls (legacy)xlrd✅ nativeRequires pip install xlrd for pandas
.xlsb (binary)⚠️ pyxlsb✅ nativeRequires pip install pyxlsb for pandas
.xlsm (macro-enabled)openpyxl✅ nativeMacros ignored on convert — data only

For pandas, update the glob pattern to include all formats:

for excel_file in Path(input_folder).glob("*.xls*"):  # matches .xlsx, .xls, .xlsb, .xlsm

Recursive subfolder handling (files in nested folders):

The pandas script above processes only the top-level folder. To include subfolders:

# Replace the glob line with:
for excel_file in Path(input_folder).rglob("*.xls*"):  # rglob = recursive
    # Preserve folder structure in output:
    relative = excel_file.relative_to(input_folder)
    output_path = Path(output_folder) / relative.parent / f"{excel_file.stem}.csv"
    output_path.parent.mkdir(parents=True, exist_ok=True)

Also check before converting:

  • Are dates stored as Excel serial numbers that need ISO formatting in the CSV output?
  • Are any columns using number formats that should be preserved as text in CSV (leading zeros, phone numbers)?
  • Are any sheets password protected? These will fail silently in batch conversion.

Method 1: Browser-Based (No Code)

Best for: One-time conversions, analysts without Python, files containing sensitive data that shouldn't be uploaded to a server.

Open Excel to CSV Converter → load files → choose sheet handling → convert.

BROWSER-BASED BATCH CONVERSION:
Input: 50 Excel files (total 890MB)
Sheet handling: first sheet only
Processing time: 47 seconds (in our testing, March 2026)
Output: 50 CSV files, downloaded as zip
Test environment: Intel i7-12700, 32GB RAM, Chrome 122

Typical range: 30–90 seconds for 50 files under 1GB total.
Results vary by file size, sheet count, and hardware.

For files containing customer data, financial records, or employee information: most cloud-based batch conversion tools upload your Excel files to a remote server for processing. SplitForge processes locally in Web Worker threads — verifiable via Chrome DevTools → Network during processing.


Method 2: Python pandas

Best for: Recurring automation (daily/weekly conversion as part of a pipeline), large folder counts (100+ files), integration with downstream data processing.

import pandas as pd
import os
from pathlib import Path

# Configuration
input_folder = "excel_files"    # folder containing .xlsx files
output_folder = "csv_output"    # where CSVs will be written
sheet_mode = "first"            # "first", "all", or "named:<sheetname>"

Path(output_folder).mkdir(exist_ok=True)

# Process all Excel files in folder
converted = 0
failed = []

for excel_file in Path(input_folder).glob("*.xlsx"):
    try:
        if sheet_mode == "first":
            df = pd.read_excel(excel_file, sheet_name=0)
            output_path = Path(output_folder) / f"{excel_file.stem}.csv"
            df.to_csv(output_path, index=False)
            converted += 1
            
        elif sheet_mode == "all":
            sheets = pd.read_excel(excel_file, sheet_name=None)
            for sheet_name, df in sheets.items():
                safe_name = sheet_name.replace("/", "-").replace("\\", "-")
                output_path = Path(output_folder) / f"{excel_file.stem}_{safe_name}.csv"
                df.to_csv(output_path, index=False)
            converted += 1
            
        elif sheet_mode.startswith("named:"):
            target_sheet = sheet_mode.split(":")[1]
            df = pd.read_excel(excel_file, sheet_name=target_sheet)
            output_path = Path(output_folder) / f"{excel_file.stem}.csv"
            df.to_csv(output_path, index=False)
            converted += 1
            
    except Exception as e:
        failed.append((excel_file.name, str(e)))

print(f"Converted: {converted} files")
if failed:
    print(f"Failed: {len(failed)} files")
    for name, error in failed:
        print(f"  {name}: {error}")

Install pandas if needed: pip install pandas openpyxl

Performance: pandas reads Excel files without opening Excel — it parses the raw .xlsx XML directly. For 50 files totaling 1GB, expect 60–120 seconds depending on sheet count and data complexity.

For .xls files (legacy format): replace openpyxl with xlrd in the install: pip install xlrd. Pandas handles both formats with the same read_excel() call.


Method 3: PowerShell

Best for: Windows users without Python, IT teams deploying conversion scripts via Group Policy or Task Scheduler, environments where Python is not permitted.

# Batch-Convert-Excel-To-CSV.ps1
# Requires: Microsoft Excel installed on the machine

param(
    [string]$InputFolder = "C:\ExcelFiles",
    [string]$OutputFolder = "C:\CSVOutput",
    [string]$SheetMode = "first"  # "first" or "all"
)

# Create output folder if it doesn't exist
New-Item -ItemType Directory -Force -Path $OutputFolder | Out-Null

# Start Excel application (hidden)
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

$converted = 0
$failed = @()

Get-ChildItem -Path $InputFolder -Filter "*.xlsx" | ForEach-Object {
    $inputFile = $_.FullName
    $baseName = $_.BaseName
    
    try {
        $workbook = $excel.Workbooks.Open($inputFile)
        
        if ($SheetMode -eq "first") {
            $sheet = $workbook.Sheets.Item(1)
            $outputPath = Join-Path $OutputFolder "$baseName.csv"
            $sheet.SaveAs($outputPath, 6)  # 6 = xlCSV format
            $converted++
        }
        elseif ($SheetMode -eq "all") {
            foreach ($sheet in $workbook.Sheets) {
                $safeName = $sheet.Name -replace '[/\\]', '-'
                $outputPath = Join-Path $OutputFolder "${baseName}_${safeName}.csv"
                $sheet.Copy()
                $excel.ActiveWorkbook.SaveAs($outputPath, 6)
                $excel.ActiveWorkbook.Close($false)
            }
            $converted++
        }
        
        $workbook.Close($false)
    }
    catch {
        $failed += "$baseName : $_"
    }
}

$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

Write-Host "Converted: $converted files"
if ($failed.Count -gt 0) {
    Write-Host "Failed: $($failed.Count) files"
    $failed | ForEach-Object { Write-Host "  $_" }
}

Run: .\Batch-Convert-Excel-To-CSV.ps1 -InputFolder "C:\Reports" -OutputFolder "C:\CSVOutput"

Note: This method requires Microsoft Excel installed on the machine — it uses Excel's COM automation. It will not work on servers without an Excel license.

Performance: Slower than pandas (opens Excel per file vs raw XML parsing). For 50 files, expect 3–8 minutes. For 500+ files, use pandas instead.


Handling Common Edge Cases

Batch job failures — what breaks and how to fix it:

Real batch jobs fail on some files. The pandas script above logs failures to console. For large batches, write failures to a log file for review:

# Add to the pandas script — write failure log to CSV:
import csv
if failed:
    with open("conversion_failures.csv", "w", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(["filename", "error", "likely_cause", "fix"])
        for name, error in failed:
            writer.writerow([name, error, "", ""])

Common failure reasons:

ErrorLikely causeFix
BadZipFileFile is corrupted or not a real .xlsxOpen in Excel and re-save
xlrd.biffh.XLRDError.xls file needing xlrd librarypip install xlrd
KeyError: sheet nameNamed sheet not foundCheck sheet name spelling across all files
PermissionErrorFile open by another user or processClose all instances and retry
ValueError: Password protectedSheet or workbook is password protectedRemove password before batch run
.xlsb parsing failurepyxlsb not installedpip install pyxlsb
Empty CSV outputData on wrong sheet / sheet hiddenSwitch to sheet_name=None to inspect all sheets

Password-protected sheets: Both pandas and PowerShell will fail silently on password-protected sheets. Before batch converting, identify protected sheets: open in Excel, right-click each tab — protected sheets show a lock icon. Remove protection before batch processing.

Date columns in CSV output: CSV has no native date type. Excel serial numbers (45306) export as integers unless formatted as dates. To ensure ISO date format in pandas output:

df['DateColumn'] = pd.to_datetime(df['DateColumn']).dt.strftime('%Y-%m-%d')

Leading zeros in CSV: Excel strips leading zeros from columns formatted as numbers. Phone numbers, ZIP codes, and employee IDs become wrong. In pandas, read the column as string:

df = pd.read_excel(file, dtype={'ZIPCode': str, 'EmployeeID': str})

Large files that hang: Files with many formulas cause calculation delays during conversion. In PowerShell, set $excel.Calculation = -4135 (xlCalculationManual) before opening files. In pandas, this is irrelevant — pandas reads stored values, not recalculated results.


Additional Resources

Official Documentation:

Related SplitForge Guides:

For single-file conversions between CSV, Excel, and JSON formats without writing any code, the Format Converter handles each direction in a single browser-based tool.

Technical Reference:


FAQ

Three methods in order of setup time: (1) Browser-based — open Excel to CSV Converter, load all files, click Convert. (2) Python pandas — 10-line script with pd.read_excel() in a loop. (3) PowerShell — built into Windows, uses Excel COM automation, slower but no Python required.

Yes. In pandas: pd.read_excel(file, sheet_name=None) returns a dictionary of DataFrames, one per sheet — loop over them and write each to a separate CSV. In PowerShell: iterate $workbook.Sheets and call SaveAs on each. In the browser-based method, choose "all sheets" in the conversion options.

For the PowerShell method, yes — it uses Excel's COM automation. For the Python pandas method, no — pandas reads the raw .xlsx file format without Excel. For the browser-based method, no — processing happens in browser threads using a JavaScript Excel parser.

In Python pandas, specify the affected columns as string type on read: pd.read_excel(file, dtype={'ZIPCode': str}). This preserves leading zeros that Excel normally drops from numeric columns. In PowerShell, format the column as "Text" in Excel before converting. Once Excel has already stripped leading zeros (stored the value as a number), recovery is not possible without the original source data.


Convert Excel Files to CSV Without Opening Each One

Batch convert any number of Excel files to CSV in one operation
Choose: first sheet, all sheets, or specific sheet by name
Files process locally in browser threads — nothing transmitted to any server
No installation required — open once, convert immediately

Continue Reading

More guides to help you work smarter with your data

csv-import-guides

CSV Delimiter Errors: Fix Comma vs Semicolon for International Teams

Stop all data in Column A errors. Learn comma, semicolon & tab CSV delimiters plus quick fixes for global teams.

Read More
csv-guides

How to Split Large CSV Files Without Excel (Even 1M+ Rows)

Need to split a massive CSV file but Excel keeps crashing? Learn how to split files with millions of rows safely in your browser without uploads.

Read More

We use analytics cookies to improve SplitForge. Your files never leave your browser — ever. Privacy policy