You have folders of XLS and XLSX files that need to feed a database, an analytics pipeline, or a reporting dashboard — and the target system speaks CSV, not Excel. Opening every workbook in Excel and clicking Save As → CSV does not scale past two or three files, and it falls apart entirely on a server with no Excel installation. Total Excel Converter X converts Excel files to CSV from the command line, in batch, with no GUI and no Microsoft Office on the machine. Install it on a Windows server, call it from a script or via ActiveX, and let it run unattended.
*.xlsx) and the converter processes every matching file in one run-CSVDelimiter, matching whatever your importer expects-EachSheetSeparate
(30 days, no email)
(server license, perpetual)
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
Excel files (XLS, XLSX) are container formats. A workbook holds multiple sheets, formulas, formatting, charts, pivot tables, conditional rules, and embedded objects. XLS is a proprietary binary format from the 1990s; XLSX is a ZIP archive of XML parts. Both require a parser that understands the Office schema. Most databases and analytics tools cannot read either directly.
CSV is plain text — one row per line, fields separated by a delimiter. Every database engine, every scripting language, every BI tool, and every ETL platform reads CSV without translation. PostgreSQL COPY, MySQL LOAD DATA INFILE, BigQuery bq load, pandas read_csv, R read.csv — they all expect CSV. When Excel data needs to enter that pipeline, it has to become CSV first.
| Excel (XLS / XLSX) | CSV | |
|---|---|---|
| Format | Proprietary binary or ZIP-XML | Plain text |
| Sheets per file | Multiple | One table |
| Formulas | Stored and recalculated | Evaluated values only |
| Formatting | Fonts, colors, borders, charts | None |
| Database import | Requires ODBC or library | Native in every engine |
| Audience | Office users | Databases, scripts, ETL tools |
Download the installer from the link above and run it on your Windows server or workstation. The setup takes under a minute. No Microsoft Excel or Office installation is required — the converter parses XLS and XLSX directly using its own engine.
Open cmd.exe or PowerShell. The converter executable is XLSConverter.exe, located in the installation folder (typically C:\Program Files\CoolUtils\TotalExcelConverterX\). Add it to your system PATH or use the full path in your commands.
The simplest command converts all Excel files in a folder to CSV:
XLSConverter.exe C:\Reports\*.xlsx C:\Output\ -c CSV
This processes every .xlsx file in C:\Reports\ and saves the resulting CSV files in C:\Output\. Each Excel file produces one CSV with the same base name. Use *.xls to convert legacy binary files, or *.xls* to catch both extensions in one pass.
The CSV defaults often need tweaking to match the target system. Real importers are picky about separators and code pages:
XLSConverter.exe C:\Reports\*.xlsx C:\Output\ -c CSV -CSVDelimiter ";" -CSVQuotation "\"" -Encoding UTF-8 -log C:\Logs\xls2csv.log
-CSVDelimiter "," — comma (default). Use ";" for European locales, "\t" for tab-separated, or "|" for pipe-CSVQuotation "\"" — wrap fields containing the delimiter, quotes, or line breaks in double quotes-Encoding UTF-8 — force UTF-8 output. Use UTF-16, Windows-1251, Windows-1252, or ISO-8859-1 as the target system requires-EachSheetSeparate — split a multi-sheet workbook into one CSV per sheet, named {file}_{sheet}.csv-log C:\Logs\xls2csv.log — write a conversion log for verificationSave your command in a .bat file and schedule it with Windows Task Scheduler:
@echo off "C:\Program Files\CoolUtils\TotalExcelConverterX\XLSConverter.exe" C:\Incoming\*.xlsx C:\Archive\CSV\ -c CSV -CSVDelimiter ";" -Encoding UTF-8 -EachSheetSeparate -log C:\Logs\xls2csv.log
This runs the conversion every night (or at whatever interval you set) and writes a log file so you can verify the results. Drop new XLSX files into C:\Incoming\ and the next scheduled run picks them up.
Total Excel Converter X includes a full ActiveX interface. You can call the converter from any COM-compatible environment — .NET, VBScript, PHP, Python, Ruby, or ASP. This lets you embed Excel-to-CSV conversion into your own ETL job, web upload form, or reporting service without shelling out to a command-line process.
Example (C#/.NET):
XLSConverterX Cnv = new XLSConverterX();
Cnv.Convert("C:\\Reports\\sales.xlsx", "C:\\Output\\sales.csv", "-c CSV -CSVDelimiter \";\" -Encoding UTF-8 -log c:\\Logs\\xls.log");
Example (PHP):
$c = new COM("XLSConverter.XLSConverterX");
$c->convert("C:\\Reports\\sales.xlsx", "C:\\Output\\sales.csv", "-c CSV -CSVDelimiter \";\" -Encoding UTF-8 -log c:\\Logs\\xls.log");
The same call works from ASP.NET, VBScript, Python, Ruby, Perl, and JavaScript (Windows Script Host). Your application can accept uploaded XLSX files and return CSV ready for direct ingestion into a database or analytics tool.
| Feature | Online Converters | Total Excel Converter X |
|---|---|---|
| Batch processing | One file at a time | Unlimited files per batch |
| File privacy | Files uploaded to third-party server | Files never leave your machine |
| File size limit | Typically 5–25 MB | None — gigabyte workbooks supported |
| Delimiter / encoding control | Rare or hidden | Full control via flags |
| Multi-sheet handling | First sheet only, usually | -EachSheetSeparate or merged |
| Automation | Manual only | Command line, .bat, Task Scheduler, ActiveX |
| Server deployment | Not possible | Designed for servers, no GUI needed |
| Requires Excel installed | N/A | No |
| Requires internet | Yes | No |
COPY sales FROM '/data/sales.csv' CSV HEADER in Postgres or LOAD DATA INFILE in MySQL. The whole pipeline runs in seconds for files that would take minutes through a GUI importer.bq load or COPY INTO. A nightly .bat job converts the day's Excel reports to CSV and uploads them to a staging bucket for the warehouse to pick up.read_csv and R read.csv. When the source data arrives as XLSX from finance or operations, a server-side converter produces clean CSV without anyone touching Excel.-CSVDelimiter and -Encoding set to match the agency's spec.The converter parses XLS and XLSX files directly. You do not need Microsoft Office, LibreOffice, or any spreadsheet application installed on the server. This avoids licensing costs and the well-known instability of automating Excel in unattended scenarios.
Total Excel Converter X is designed for unattended use. No GUI windows, no dialog boxes, no confirmation prompts. It runs silently from the command line or as part of a service — exactly what a production server needs.
Real CSV importers care about details. A semicolon delimiter for European systems, UTF-8 for international text, double-quote wrapping for fields with embedded commas. An Excel workbook with twelve monthly sheets is a single file, but CSV holds one table per file — -EachSheetSeparate splits the workbook into twelve named CSV files, each ready for separate ingestion. Every detail is exposed as a command-line flag, so the output matches whatever your downstream pipeline expects on the first try.
The same command-line tool converts Excel to PDF, DOC, HTML, XML, JSON, ODS, TIFF, JPEG, and more. One installation covers every Excel conversion target. Change -c CSV to -c PDF and you get PDF reports with the same batch and automation features.
(30 days, no email or credit card)
(server license, perpetual)
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
"Our pipeline ingests 200+ XLSX files a day from regional store managers and loads them into Postgres via COPY. We replaced a fragile Python-plus-openpyxl script with XLSConverter.exe in a .bat job. The semicolon delimiter and UTF-8 flags solved our German and Polish character issues on the first run. Throughput went from forty minutes to under five for the same nightly batch."
Priya Raghavan Data Engineer, Retail Analytics
"We feed monthly Excel workbooks into BigQuery for the executive dashboard. The -EachSheetSeparate flag was the missing piece — one CSV per sheet maps cleanly to one staging table per business line. No more manual sheet-by-sheet exports from Excel. The COM interface lets the same tool serve our internal upload portal."
Daniel Kowalski BI Analyst, Insurance Group
"I integrated XLSConverter via the ActiveX class into a .NET service that processes broker reports. Formula evaluation works correctly even on the larger workbooks with cross-sheet references. The encoding flag handles our Italian and French input cleanly. Documentation on a few of the rarer flags could be more detailed, but support replied to my questions within a business day."
Sofia Marchetti ETL Developer, FinTech Platform
XLSConverter.exe C:\Reports\*.xlsx C:\Output\ -c CSV. This converts every XLSX file in the source folder to CSV. Add flags like -CSVDelimiter ";", -Encoding UTF-8, or -EachSheetSeparate to control the output.-CSVDelimiter flag. Pass "," for comma (default), ";" for semicolon (common in European locales), "\t" for tab, or "|" for pipe. Wrap the value in double quotes on the command line.-Encoding UTF-8 to the command. Other supported code pages include UTF-16, Windows-1251, Windows-1252, ISO-8859-1, and many more. Set the encoding to match what your database or importer expects so non-ASCII characters survive intact.-EachSheetSeparate and the converter produces one CSV per sheet, named {file}_{sheet}.csv. Use that mode whenever you load each sheet into a different database table.
Download free trial and convert your files in minutes.
No credit card or email required.
string src = @"C:\test\Source.xlsx";
string dest = @"C:\test\Dest.pdf";
var cnv = new ExcelConverterX();
cnv.Convert(src, dest, "-cPDF -log c:\\test\\Excel.log");
if (!string.IsNullOrEmpty(cnv.ErrorMessage))
throw new Exception(cnv.ErrorMessage);
public static class Function1
{
[FunctionName("Function1")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
StringBuilder sbLogs = new StringBuilder();
sbLogs.AppendLine("started...");
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
var assemblyDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
assemblyDirectoryPath = assemblyDirectoryPath.Substring(0, assemblyDirectoryPath.Length - 4);
var executablePath = $@"{assemblyDirectoryPath}\Converter\ExcelConverterX.exe";
sbLogs.AppendLine(executablePath + "...");
var srcPath = $@"{assemblyDirectoryPath}\src\sample.xlsx";
var outPath = Path.GetTempFileName() + ".pdf";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(srcPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & source files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"{srcPath} {outPath}";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
int sleepCounter = 10;
while(!File.Exists(outPath) && sleepCounter > 0)
{
System.Threading.Thread.Sleep(1000);
sbLogs.AppendLine("sleep...");
sleepCounter--;
}
if (File.Exists(outPath))
sbLogs.AppendLine("Conversion complete successfully.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
dim C
Set C=CreateObject("ExcelConverter.ExcelConverterX")
C.Convert "c:\test\source.xlsx", "c:\test\dest.pdf", "-cPDF -log c:\test\Excel.log"
Response.Write C.ErrorMessage
set C = nothing
dim C
Set C=CreateObject("ExcelConverter.ExcelConverterX")
Response.Clear
Response.AddHeader "Content-Type", "binary/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=test.pdf"
Response.BinaryWrite C.ConvertToStream("C:\www\ASP\Source.xlsx", "C:\www\ASP", "-cpdf -log c:\html.log")
set C = nothing
$src="C:\\test\\test.xlsx";
$dest="C:\\test\\test.csv";
if (file_exists($dest)) unlink($dest);
$c= new COM("ExcelConverter.ExcelConverterX");
$c->convert($src,$dest, "-c csv -log c:\\test\\xls.log");
if (file_exists($dest)) echo "OK"; else echo "fail:".$c->ErrorMessage;
require 'win32ole'
c = WIN32OLE.new('ExcelConverter.ExcelConverterX')
src = "C:\\test\\test.xlsx"
dest = "C:\\test\\test.pdf"
c.convert(src, dest, "-c PDF -log c:\\test\\Excel.log")
if not File.exist?(dest)
puts c.ErrorMessage
end
import win32com.client
import os.path
c = win32com.client.Dispatch("ExcelConverter.ExcelConverterX")
src = "C:\\test\\test.xlsx"
dest = "C:\\test\\test.pdf"
c.convert(src, dest, "-c PDF -log c:\\test\\Excel.log")
if not os.path.exists(dest):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c := CreateOleObject('ExcelConverter.ExcelConverterX');
c.Convert('c:\test\source.xlsx', 'c:\test\dest.pdf', '-cPDF -log c:\test\Excel.log');
if c.ErrorMessage <> '' then
ShowMessage(c.ErrorMessage);
end;
var c = new ActiveXObject("ExcelConverter.ExcelConverterX");
c.Convert("C:\\test\\source.xlsx", "C:\\test\\dest.pdf", "-c PDF");
if (c.ErrorMessage != "")
alert(c.ErrorMessage)
use Win32::OLE; my $src = "C:\\test\\test.xlsx"; my $dest = "C:\\test\\test.csv"; my $c = CreateObject Win32::OLE 'ExcelConverter.ExcelConverterX'; $c->convert($src, $dest, "-c csv -log c:\\test\\xls.log"); print $c->ErrorMessage if -e $dest;