您有大量需要喂入SOAP Web服务、EDI合作伙伴、监管申报或ERP集成的Excel工作簿 — 而接收系统讲XML,而不是XLSX。手工在Excel中打开每个文件并将其另存为XML,到第二个工作簿就停止工作了,而且Excel的内置XML导出会忽略下游系统实际检查的架构要求。Total Excel Converter X可通过命令行批量将XLS和XLSX文件转换为格式良好的XML,无需GUI,无需安装Microsoft Excel。将其安装在Windows服务器上,通过脚本或ActiveX调用,即可实现无人值守运行。
*.xlsx),转换器即可在一次运行中处理所有匹配工作簿
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
Excel是网格。行和列保存值,每列的含义存在于人类阅读的标题行中。该格式对分析人员很友好,但对系统集成很糟糕。SOAP服务、EDI网关、监管门户、银行接口和HL7医疗保健消息不解析XLSX。它们期望XML具有显式元素名、定义的嵌套和可预测的转义规则。
XML是分层的且自描述的。每个值都带有元素名,文档可针对架构验证,任何平台 — Linux、Java、.NET、IBM大型机 — 都可以无需专有库即可解析它。当Excel数据必须进入该世界时,必须先转换为XML。Total Excel Converter X写入有效的XML,每个Excel行变成一个记录节点,标题行提供字段名,特殊字符被转义,使输出可干净地通过任何XML解析器。
| Excel (XLS/XLSX) | XML | |
|---|---|---|
| 形状 | 二维网格 | 分层树 |
| 字段名 | 隐式(标题行) | 每条记录显式 |
| 验证 | 文件级别无 | 架构(XSD、DTD) |
| 消费者 | 人类、Excel感知工具 | SOAP、EDI、ERP、HL7、监管机构 |
| 跨平台 | 在Windows + Office上最佳 | 通用 — 每种语言和操作系统 |
从上方链接下载安装程序,在Windows服务器或工作站上运行。安装不到一分钟即可完成。无需安装Microsoft Excel — 转换器使用自有解析器直接读取XLS和XLSX,包括公式、样式和多工作表工作簿。
打开cmd.exe或PowerShell。转换器可执行文件为XLSConverter.exe,位于安装文件夹中(通常为C:\Program Files\CoolUtils\TotalExcelConverterX\)。将其添加到系统PATH,或在命令中使用完整路径。
最简单的命令是将文件夹中所有Excel文件转换为XML:
XLSConverter.exe C:\Sheets\*.xlsx C:\Output\ -c XML
此命令处理C:\Sheets\中的每个.xlsx文件,并将生成的XML文件保存到C:\Output\。每个工作簿生成一个同名的XML文件。源中的每行成为一个<Row>元素,每个单元格成为以相应列标题命名的子元素。
使用附加标志控制XML输出:
XLSConverter.exe C:\Sheets\*.xlsx C:\Output\ -c XML -Encoding UTF-8 -FirstRowAsHeader true -log C:\Logs\xls2xml.log
-Encoding UTF-8 — 设置XML编码(UTF-8、UTF-16、Windows-1252、ISO-8859-1)-FirstRowAsHeader true — 使用第1行作为元素名,而不是通用的Column1、Column2-Sheet "Invoices" — 仅转换命名工作表,而不是每个工作表-log C:\Logs\xls2xml.log — 写入转换日志以便验证将命令保存到.bat文件中,并通过Windows任务计划程序安排执行:
@echo off "C:\Program Files\CoolUtils\TotalExcelConverterX\XLSConverter.exe" C:\Incoming\*.xlsx C:\Archive\XML\ -c XML -Encoding UTF-8 -FirstRowAsHeader true -log C:\Logs\xls2xml.log
此脚本每晚(或按您设定的任何间隔)运行转换,并写入日志文件以便您验证结果。白天将新工作簿放入C:\Incoming\,集成流水线会自动拾取它们。
Total Excel Converter X包含完整的ActiveX接口。您可以从任何兼容COM的环境调用转换器 — .NET、VBScript、PHP、Python、Ruby或ASP。这使您能够将Excel到XML的转换嵌入自己的Web应用、集成代理或文档工作流,无需通过命令行进程调用。
示例(C#/.NET):
XLSConverterX Cnv = new XLSConverterX();
Cnv.Convert("C:\\Sheets\\invoices.xlsx", "C:\\Output\\invoices.xml", "-c XML -Encoding UTF-8 -FirstRowAsHeader true -log c:\\Logs\\xls.log");
示例(PHP):
$c = new COM("XLSConverter.XLSConverterX");
$c->convert("C:\\Sheets\\invoices.xlsx", "C:\\Output\\invoices.xml", "-c XML -Encoding UTF-8 -FirstRowAsHeader true -log c:\\Logs\\xls.log");
同样的调用方式适用于ASP.NET、VBScript、Python、Ruby、Perl和JavaScript(Windows Script Host)。您的集成层可以接受上传的Excel文件,在内存中将其转换为XML,并将XML有效负载直接转发到SOAP端点或ERP队列。
| 功能 | 在线转换器 | Total Excel Converter X |
|---|---|---|
| 批量处理 | 一次一个文件 | 每批次无限文件 |
| 数据隐私 | 工作簿上传至第三方服务器 | 文件不会离开您的机器 |
| 编码控制 | 仅UTF-8,常常损坏 | UTF-8、UTF-16、Windows-1252、ISO-8859-1 |
| 特殊字符转义 | 不一致,常常无效XML | 对&、<、>、"、控制字符完整转义 |
| 多工作表工作簿 | 仅第一张表 | 所有工作表或命名工作表 |
| 自动化 | 仅手动操作 | 命令行、.bat、任务计划程序、ActiveX |
| 服务器部署 | 不可能 | 专为服务器设计,无需GUI |
| 需要安装Excel | 不适用 | 否 |
| 需要互联网 | 是 | 否 |
转换器使用自有解析器直接读取XLS和XLSX。您无需在服务器上安装Microsoft Office、LibreOffice或任何电子表格应用程序。这避免了授权成本,也避免了在无人值守场景中自动化Excel众所周知的不稳定问题。
Total Excel Converter X专为无人值守使用而设计。没有GUI窗口,没有对话框,没有确认提示。它从命令行静默运行,或作为服务的一部分运行 — 正是生产集成服务器所需要的。
输出是格式良好的XML。与号变成&,尖括号变成<和>,属性内的引号被转义,杂散控制字符被剥离。XML可以通过任何符合标准的解析器,不会因恰巧包含与号的客户名而出错。
同一命令行工具可将Excel转换为PDF、DOC、HTML、CSV、JSON、ODS、TXT等格式。一次安装即可满足所有电子表格转换需求。将-c XML改为-c JSON,即可获得具有相同批处理和自动化功能的JSON输出。
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
"我们的运输合作伙伴只接受通过SOAP传输的XML格式采购订单,但运营团队在Excel中构建它们。Total Excel Converter X作为计划的.bat在集成服务器上运行,在不到三秒内将每日订单工作簿转换为XML。转义处理客户名中的特殊字符,这破坏了我们之前的内部解析器。完美替代了一个没人想维护的VBA脚本。"
Andreas Vogt Integration Engineer, Logistik AG
"我们与约四十个零售合作伙伴交换EDI文档,其中三分之一希望使用XML信封而不是X12或EDIFACT。转换器位于我们基于电子表格的订单台和EDI网关之间。标题行映射意味着每个合作伙伴的XML架构与我们已经使用的列名对齐。每个合作伙伴的编码通过命令行设置。生产环境无意外。"
Priya Subramanian EDI Specialist, Wholesale Distribution
"我们每周以XML形式向中央银行提交监管申报。源数据由财务团队在Excel中调和,然后必须成为严格编码的XML有效负载。转换器的UTF-8输出和干净的与号转义在第一次尝试时就通过了监管机构的验证器。我们仍然通过XSLT后处理输出以适合确切的目标架构,但转换步骤本身可靠且快速。"
Marc Lefevre Regulatory Reporting Lead, Banque Mutuelle
XLSConverter.exe C:\Sheets\*.xlsx C:\Output\ -c XML。此命令将源文件夹中的每个Excel工作簿转换为XML。添加-Encoding UTF-8、-FirstRowAsHeader true或-log等标志以控制输出结构和编码。-FirstRowAsHeader true,转换器使用每个列标题作为该字段的元素名,因此CustomerName列生成<CustomerName>元素。如果没有该标志,转换器会回退到通用的Column1、Column2标签。行节点默认为<Row>;这为您提供了可预测的、规则的结构,可以干净地映射到大多数消费架构。-Encoding标志支持UTF-8、UTF-16、Windows-1252和ISO-8859-1。UTF-8是SOAP、EDI和大多数现代集成的安全默认值。当下游系统特别需要时使用UTF-16,或在喂入期望单字节XML的旧版合作伙伴时使用Windows代码页。&,尖括号变成<和>,属性值内的双引号变成",会破坏XML 1.0解析器的杂散控制字符被剥离。输出可针对任何符合标准的解析器验证,无需手工清理。-Sheet "Invoices"仅转换一个命名工作表,或-Sheet 1按零基索引选择。隐藏工作表和图表工作表会被跳过。XLSConverter.XLSConverterX)。您可以从.NET、PHP、Python、VBScript、ASP、Ruby、Perl及任何其他兼容COM的环境中调用它,实时将Excel上传转换为XML,并将结果转发到SOAP端点或消息队列。
string src="C:\\test\\Source.xlsx";
string dest="C:\\test\\Dest.PDF";
ExcelConverterX Cnv = new ExcelConverterX();
Cnv.Convert(src, dest, "-c PDF -log c:\\test\\Excel.log");
MessageBox.Show("转换完成!");
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 msgPath = $@"{assemblyDirectoryPath}\MSG\MSG-1.xlsx";
var outPath = Path.GetTempFileName() + ".pdf";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(msgPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & MSG files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"{msgPath} {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"
Rresponse.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.XLS";
$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(file_path):
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.XLS"; 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;