
CSV 与 XML 是软件开发中最常用的两大数据交换格式:CSV 轻量化、适合存储传输表格数据;XML 具备层级结构与严格校验规则,广泛用于跨系统对接、接口交互。在配置文件生成、数据库数据导出、第三方 API 对接等业务场景中,CSV 转 XML 是高频开发需求。
手动解析 CSV 拼接 XML 不仅代码冗余、极易出错,处理大批量数据时效率极低。而 Spire.XLS for .NET 作为独立高性能 Excel 组件,无需依赖 Office,可快速实现 C# 中 CSV 到 XML 的高效转换。本文将详细介绍两种主流转换方案,并附带完整代码示例。
- 两种 XML 输出格式说明
- 方法一:使用 C# 将 CSV 转换为 Excel XML
- 方法二:使用 C# 将 CSV 转为自定义结构 XML
- 适配真实业务 CSV 特殊场景
- CSV 转 XML 常见问题解答
环境前置准备
通过 NuGet 安装 Spire.XLS
在 Visual Studio 中打开 “程序包管理器控制台” 执行以下命令:
Install-Package Spire.XLS
或者在 NuGet 可视化界面中搜索 “Spire.XLS”,安装最新稳定版即可。
准备测试 CSV 文件
在项目输出目录中创建一个 Products.csv 文件,写入以下表格数据(包含表头和数据行):
商品ID,商品名称,商品分类,单价,库存数量,上架日期
1,笔记本电脑,电子产品,999.99,50,2023-01-15
2,无线鼠标,电子产品,25.50,200,2023-02-20
3,纯棉T恤,服饰,19.99,150,2022-11-05
4,咖啡马克杯,家居用品,12.99,300,2022-09-10
5,办公椅,家具,150.00,75,2023-03-01
两种 XML 输出格式说明
使用 Spire.XLS 转换 CSV 时,支持生成两种主流 XML 格式,可按需选择:
1. Excel XML(SpreadsheetML)
基于微软 Open XML 规范的官方格式,完整保留 CSV 的表格布局、单元格样式与数据结构。
- 适用场景:需用 Excel、WPS 等表格工具直接打开编辑 XML 文件。
2. 自定义结构 XML
开发者可自定义根节点、子节点、层级关系,自由映射 CSV 列与 XML 标签。
- 适用场景:对接第三方接口、老旧业务系统、有固定 XML 报文规范的业务场景。
Python 开发者可参考专属教程:使用 Python 将 CSV 转换为 XML(处理现实数据问题)
方法一:使用 C# 将 CSV 转换为 Excel XML
这是最简单的实现方式,仅需几行代码即可完成。将 CSV 加载到 Workbook(工作簿)实例中,然后直接另存为 Excel XML(SpreadsheetML)格式。适用于目标系统支持 Excel 原生 XML 格式的场景。
CSV 转 XML C# 代码示例:
using Spire.Xls;
namespace CsvToExcelXmlConverter
{
class Program
{
static void Main(string[] args)
{
// 创建工作簿实例
Workbook workbook = new Workbook();
// 将CSV加载到第一个工作表
workbook.LoadFromFile("Products.csv", ",", 1, 1);
// 另存为SpreadsheetML格式
workbook.SaveAsXml("output.xml");
// 释放资源
workbook.Dispose();
}
}
}
核心方法解析:
- LoadFromFile():自动解析 CSV 数据,导入到工作簿首个工作表,完美兼容中文编码;
- SaveAsXml():一键将表格数据导出为标准 SpreadsheetML 格式,中文无乱码。
核心数据部分的效果如下:

拓展:该组件同样支持 Excel XLS/XLSX 转 XML,复用同一套
SaveAsXml方法。
方法二:使用 C# 将 CSV 转为自定义结构 XML
当目标系统要求特定的 XML 架构时,就需要构建自定义 XML 文档。Spire.XLS 结合 .NET 内置的 XmlWriter 类即可轻松遍历表格行列,自由定制根节点、数据节点与标签名称,中文表头自动映射为 XML 节点名,无乱码。
自定义 XML 代码示例:
using Spire.Xls;
using System.Xml;
namespace CSVtoXMLConverter
{
class Program
{
static void Main(string[] args)
{
// 初始化工作簿并加载CSV
Workbook workbook = new Workbook();
workbook.LoadFromFile("Products.csv", ",", 1, 1);
Worksheet worksheet = workbook.Worksheets[0];
// 创建自定义XML设置(缩进优化可读性)
XmlWriterSettings settings = new XmlWriterSettings
{
Indent = true,
IndentChars = "\t",
OmitXmlDeclaration = false,
Encoding = System.Text.Encoding.UTF8
};
// 将CSV保存为带自定义根节点和格式的XML
XmlWriter writer = XmlWriter.Create("Custom_Output.xml", settings);
writer.WriteStartDocument();
// 自定义根元素:<ProductInventory>
writer.WriteStartElement("ProductInventory");
// 遍历CSV行(跳过表头行:从第2行开始)
for (int row = 2; row <= worksheet.LastRow; row++)
{
// 自定义数据节点:<Product>
writer.WriteStartElement("Product");
// 遍历CSV列并写入自定义元素
for (int col = 1; col <= worksheet.LastColumn; col++)
{
string header = worksheet.Range[1, col].Text;
string value = worksheet.Range[row, col].Text;
writer.WriteElementString(header, value);
}
writer.WriteEndElement(); // 闭合<Product>节点
}
writer.WriteEndElement(); // 闭合<ProductInventory>节点
writer.WriteEndDocument();
writer.Close();
workbook.Dispose();
}
}
}
实现逻辑
- 加载 CSV 并获取工作表数据,自动适配中文编码;
- 配置
XmlWriter缩进、UTF8 编码,从根源避免中文乱码; - 自定义中文根节点与数据节点,循环行列自动生成 XML 标签,中文表头直接映射为节点名;
- 自动闭合节点、释放资源,生成规范自定义 XML。
输出效果:
生成的 XML 以 <ProductInventory> 为根节点、<Product> 为数据节点,子节点名称与 CSV 表头一致,完全匹配自定义业务需求。

适配真实业务 CSV 特殊场景
实际项目中 CSV 常存在非标准分隔符、空值、无表头、冗余行列等问题,以下为通用解决方案:
1. 适配多种自定义分隔符
CSV文件可能使用制表符(\t)、分号(;)或竖线(|)作为分隔符。Spire.XLS 支持加载 CSV 时指定自定义分隔符:
// 制表符分隔
workbook.LoadFromFile("data.tsv", "\t", 1, 1);
// 分号分隔(欧洲地区常用)
workbook.LoadFromFile("data.csv", ";", 1, 1);
// 竖线分隔
workbook.LoadFromFile("data.psv", "|", 1, 1);
2. 跳过指定行/列
如果 CSV 包含元数据行或空列,可调整循环边界:
// 从第3行开始遍历
for (int row = 3; row <= worksheet.LastRow; row++)
// 从第3列开始遍历
for (int col = 3; col <= worksheet.LastColumn; col++)
3. 处理空单元格与缺失值
CSV 中的空单元格会显示为空字符串,你可以通过填充默认值或忽略空元素来处理:
// 方案1:为空值填充"N/A"
string value = worksheet.Range[row, col].Text;
if (string.IsNullOrEmpty(value))
value = "N/A";
writer.WriteElementString(header, value);
// 方案2:忽略空节点
string value = worksheet.Range[row, col].Text;
if (!string.IsNullOrEmpty(value))
writer.WriteElementString(header, value);
4. 缺失表头行
如果 CSV 没有表头行,可以传入自定义名称数组,或生成通用列名(示例如下):
for (int col = 1; col <= worksheet.LastColumn; col++)
{
string header = $"列{col}"; // 生成列 1、列 2...
string value = worksheet.Range[row, col].Text;
writer.WriteElementString(header, value);
}
总结
借助 Spire.XLS for .NET 实现 C# CSV 转 XML,无需手动解析文本、无需安装 Office 依赖,大幅降低开发成本:
- 简单场景:一行代码导出 Excel 标准 XML,开箱即用,完美兼容中文;
- 定制场景:自由设计 XML 层级与节点,适配各类接口报文,中文无乱码;
- 兼容复杂 CSV:支持多分隔符、空值、无表头、冗余行列等业务异常。
更多 Excel、CSV 批量处理教程,可查阅官方在线文档。
CSV 转 XML 常见问题解答
Q1:能否只转换指定单元格区域(如A1:C10)?
可以。无需遍历到 worksheet.LastRow 和 LastColumn,只需设置自定义边界,或直接通过 worksheet.Range 访问指定区域。
Q2:Spire.XLS 是否需要安装 Microsoft Excel?
不需要。它是独立的 .NET 组件,不依赖 Microsoft Excel、Office Interop 或任何第三方办公软件。
Q3:能否批量转换多个 CSV文件?
可以。遍历文件夹下所有 .csv 文件,循环调用本文转换逻辑,即可批量导出对应 XML。
Q4:可以给 XML 节点添加自定义属性和命名空间吗?
可以。通过 XmlWriter.WriteAttributeString() 添加节点属性,也可在创建元素时指定命名空间,满足企业级 XML 规范要求。







