您有大量需要喂入数据库、分析流水线或报表仪表板的XLS和XLSX文件 — 而目标系统讲CSV,而不是Excel。在Excel中打开每个工作簿并点击另存为 → CSV无法扩展到两三个文件以上,并且在没有Excel安装的服务器上完全失效。Total Excel Converter X可通过命令行批量将Excel文件转换为CSV,无需GUI,机器上无需Microsoft Office。将其安装在Windows服务器上,通过脚本或ActiveX调用,即可实现无人值守运行。
*.xlsx),转换器即可在一次运行中处理所有匹配文件-CSVDelimiter使用逗号、分号、制表符或竖线,匹配您导入器期望的任何字符-EachSheetSeparate将每个工作表拆分到自己的文件中
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
Excel文件(XLS、XLSX)是容器格式。一个工作簿包含多个工作表、公式、格式、图表、数据透视表、条件规则和嵌入对象。XLS是上世纪90年代的专有二进制格式;XLSX是XML部分的ZIP归档。两者都需要理解Office架构的解析器。大多数数据库和分析工具无法直接读取它们。
CSV是纯文本 — 每行一条记录,字段由分隔符分隔。每个数据库引擎、每种脚本语言、每个BI工具和每个ETL平台都无需翻译即可读取CSV。PostgreSQL COPY、MySQL LOAD DATA INFILE、BigQuery bq load、pandas read_csv、R read.csv — 它们都期望CSV。当Excel数据需要进入该流水线时,必须先转换为CSV。
| Excel (XLS / XLSX) | CSV | |
|---|---|---|
| 格式 | 专有二进制或ZIP-XML | 纯文本 |
| 每个文件的工作表数 | 多个 | 一个表 |
| 公式 | 存储并重新计算 | 仅求值后的值 |
| 格式化 | 字体、颜色、边框、图表 | 无 |
| 数据库导入 | 需要ODBC或库 | 每个引擎原生 |
| 受众 | Office用户 | 数据库、脚本、ETL工具 |
从上方链接下载安装程序,在Windows服务器或工作站上运行。安装不到一分钟即可完成。无需安装Microsoft Excel或Office — 转换器使用自有引擎直接解析XLS和XLSX。
打开cmd.exe或PowerShell。转换器可执行文件为XLSConverter.exe,位于安装文件夹中(通常为C:\Program Files\CoolUtils\TotalExcelConverterX\)。将其添加到系统PATH,或在命令中使用完整路径。
最简单的命令是将文件夹中所有Excel文件转换为CSV:
XLSConverter.exe C:\Reports\*.xlsx C:\Output\ -c CSV
此命令处理C:\Reports\中的每个.xlsx文件,并将生成的CSV文件保存到C:\Output\。每个Excel文件生成一个同名的CSV。使用*.xls转换旧版二进制文件,或使用*.xls*一次捕获两种扩展名。
CSV默认值通常需要调整以匹配目标系统。真正的导入器对分隔符和代码页非常挑剔:
XLSConverter.exe C:\Reports\*.xlsx C:\Output\ -c CSV -CSVDelimiter ";" -CSVQuotation "\"" -Encoding UTF-8 -log C:\Logs\xls2csv.log
-CSVDelimiter "," — 逗号(默认)。在欧洲区域使用";",制表符分隔使用"\t",竖线使用"|"-CSVQuotation "\"" — 用双引号包裹包含分隔符、引号或换行符的字段-Encoding UTF-8 — 强制UTF-8输出。根据目标系统的需要使用UTF-16、Windows-1251、Windows-1252或ISO-8859-1-EachSheetSeparate — 将多工作表工作簿拆分为每个工作表一个CSV,命名为{file}_{sheet}.csv-log C:\Logs\xls2csv.log — 写入转换日志以便验证将命令保存到.bat文件中,并通过Windows任务计划程序安排执行:
@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
此脚本每晚(或按您设定的任何间隔)运行转换,并写入日志文件以便您验证结果。将新的XLSX文件放入C:\Incoming\,下一次计划运行将拾取它们。
Total Excel Converter X包含完整的ActiveX接口。您可以从任何兼容COM的环境调用转换器 — .NET、VBScript、PHP、Python、Ruby或ASP。这使您能够将Excel到CSV的转换嵌入自己的ETL作业、Web上传表单或报表服务,无需通过命令行进程调用。
示例(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");
示例(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");
同样的调用方式适用于ASP.NET、VBScript、Python、Ruby、Perl和JavaScript(Windows Script Host)。您的应用程序可以接受上传的XLSX文件,并返回可直接摄取到数据库或分析工具中的CSV。
| 功能 | 在线转换器 | Total Excel Converter X |
|---|---|---|
| 批量处理 | 一次一个文件 | 每批次无限文件 |
| 文件隐私 | 文件上传至第三方服务器 | 文件不会离开您的机器 |
| 文件大小限制 | 通常5–25 MB | 无 — 支持千兆字节工作簿 |
| 分隔符/编码控制 | 少见或隐藏 | 通过标志完全控制 |
| 多工作表处理 | 通常仅第一张表 | -EachSheetSeparate或合并 |
| 自动化 | 仅手动操作 | 命令行、.bat、任务计划程序、ActiveX |
| 服务器部署 | 不可能 | 专为服务器设计,无需GUI |
| 需要安装Excel | 不适用 | 否 |
| 需要互联网 | 是 | 否 |
COPY sales FROM '/data/sales.csv' CSV HEADER,或在MySQL中运行LOAD DATA INFILE。整个流水线在几秒内运行,而通过GUI导入器需要几分钟。bq load或COPY INTO原生摄取CSV。每晚的.bat任务将当天的Excel报表转换为CSV并上传到暂存桶,供仓库拾取。read_csv和R read.csv中工作。当源数据从财务或运维以XLSX形式到达时,服务器端转换器无需任何人接触Excel即可生成干净的CSV。-CSVDelimiter和-Encoding设置为机构规范,将内部Excel报表转换为合规的CSV。转换器直接解析XLS和XLSX文件。您无需在服务器上安装Microsoft Office、LibreOffice或任何电子表格应用程序。这避免了授权成本,也避免了在无人值守场景中自动化Excel众所周知的不稳定问题。
Total Excel Converter X专为无人值守使用而设计。没有GUI窗口,没有对话框,没有确认提示。它从命令行静默运行,或作为服务的一部分运行 — 正是生产服务器所需要的。
真正的CSV导入器关注细节。欧洲系统的分号分隔符、国际文本的UTF-8、嵌入逗号字段的双引号包裹。带十二个月度工作表的Excel工作簿是单个文件,但CSV每个文件容纳一个表 — -EachSheetSeparate将工作簿拆分为十二个命名的CSV文件,每个都可单独摄取。每个细节都作为命令行标志公开,因此输出在第一次尝试时就匹配下游流水线的期望。
同一命令行工具可将Excel转换为PDF、DOC、HTML、XML、JSON、ODS、TIFF、JPEG等格式。一次安装即可覆盖每个Excel转换目标。将-c CSV改为-c PDF,即可获得具有相同批处理和自动化功能的PDF报表。
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
"我们的流水线每天从地区门店经理那里摄取200多个XLSX文件,并通过COPY将它们加载到Postgres中。我们用一个.bat任务中的XLSConverter.exe替换了一个脆弱的Python加openpyxl脚本。分号分隔符和UTF-8标志在第一次运行时就解决了我们的德语和波兰语字符问题。同一个夜间批处理的吞吐量从40分钟降到了不到5分钟。"
Priya Raghavan Data Engineer, Retail Analytics
"我们将每月Excel工作簿喂入BigQuery用于高管仪表板。-EachSheetSeparate标志是缺失的部分 — 每个工作表一个CSV干净地映射到每个业务线一个暂存表。再也不需要从Excel中手动逐表导出。COM接口让同一个工具也能服务我们的内部上传门户。"
Daniel Kowalski BI Analyst, Insurance Group
"我通过ActiveX类将XLSConverter集成到一个处理经纪商报告的.NET服务中。即使在带有跨表引用的较大工作簿上,公式求值也能正确工作。编码标志可以干净地处理我们的意大利语和法语输入。一些较罕见标志的文档可以更详细,但当我提问时,技术支持在一个工作日内回复了。"
Sofia Marchetti ETL Developer, FinTech Platform
XLSConverter.exe C:\Reports\*.xlsx C:\Output\ -c CSV。此命令将源文件夹中的每个XLSX文件转换为CSV。添加-CSVDelimiter ";"、-Encoding UTF-8或-EachSheetSeparate等标志以控制输出。-CSVDelimiter标志。传入","用于逗号(默认),";"用于分号(在欧洲区域常见),"\t"用于制表符,或"|"用于竖线。在命令行上将值用双引号包裹。-Encoding UTF-8。其他支持的代码页包括UTF-16、Windows-1251、Windows-1252、ISO-8859-1等。设置编码以匹配数据库或导入器的期望,使非ASCII字符完整保留。-EachSheetSeparate,转换器为每个工作表生成一个CSV,命名为{file}_{sheet}.csv。每当您将每个工作表加载到不同的数据库表时,使用该模式。
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;