You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#将带表头的XML Schema文件转换为Excel文件?

要实现把带表头的XML Schema文件转换成Excel,用C#的话我推荐用EPPlus库——它轻量、易用,非商业用途还免费,下面是完整的实现步骤和代码示例,你可以直接参考调整:

实现步骤

1. 安装EPPlus NuGet包

打开NuGet包管理器搜索EPPlus并安装,或者用Package Manager Console执行命令:

Install-Package EPPlus

如果是.NET Core/.NET 5+项目,也可以用CLI命令:

dotnet add package EPPlus

2. 定义XML对应的实体类

由于你的XML带有命名空间,必须在实体类上指定对应命名空间,才能确保反序列化正确读取数据:

using System.Collections.Generic;
using System.Xml.Serialization;

[XmlRoot(Namespace = "http://www.ytutu.com/data/schema/XXXa/1829")]
public class Data
{
    public Header Header { get; set; }
    
    [XmlArrayItem("XXXRecord")]
    public List<XXXRecord> Records { get; set; }
}

public class Header
{
    public DateTime ContentDate { get; set; }
    public string Originator { get; set; }
    public string FileContent { get; set; }
    public int RecordCount { get; set; }
}

// 请根据XML中XXXRecord的实际字段补充属性,这里是示例
public class XXXRecord
{
    public string XField1 { get; set; }
    public int XField2 { get; set; }
    public DateTime XField3 { get; set; }
}

3. 读取并反序列化XML文件

用XmlSerializer把XML文件转换成C#对象,方便后续操作:

using System.IO;
using System.Xml.Serialization;

public static Data DeserializeXml(string xmlFilePath)
{
    var serializer = new XmlSerializer(typeof(Data));
    using var reader = new StreamReader(xmlFilePath);
    return (Data)serializer.Deserialize(reader);
}

4. 生成Excel文件

创建Excel工作簿,把Header信息和Records数据分别写入不同工作表(也可以放在同一工作表,分开更清晰):

using OfficeOpenXml;
using System.IO;

public static void ConvertToExcel(Data xmlData, string excelOutputPath)
{
    // 配置EPPlus许可证:非商业用途用这个,商业用途需购买许可证
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
    
    using var package = new ExcelPackage();
    
    // 处理Header工作表
    var headerSheet = package.Workbook.Worksheets.Add("文件表头");
    // 写入表头标题
    headerSheet.Cells["A1"].Value = "内容日期";
    headerSheet.Cells["B1"].Value = "发起方ID";
    headerSheet.Cells["C1"].Value = "文件内容标识";
    headerSheet.Cells["D1"].Value = "记录总数";
    
    // 填充Header数据
    headerSheet.Cells["A2"].Value = xmlData.Header.ContentDate.ToString("yyyy-MM-dd HH:mm:ss");
    headerSheet.Cells["B2"].Value = xmlData.Header.Originator;
    headerSheet.Cells["C2"].Value = xmlData.Header.FileContent;
    headerSheet.Cells["D2"].Value = xmlData.Header.RecordCount;
    
    // 格式化表头样式
    headerSheet.Cells["A1:D1"].Style.Font.Bold = true;
    headerSheet.Cells.AutoFitColumns();
    
    // 处理Records工作表
    var recordsSheet = package.Workbook.Worksheets.Add("数据记录");
    // 写入数据表头(请根据XXXRecord的实际字段调整)
    recordsSheet.Cells["A1"].Value = "字段1";
    recordsSheet.Cells["B1"].Value = "字段2";
    recordsSheet.Cells["C1"].Value = "字段3";
    
    // 填充记录数据
    int row = 2;
    foreach (var record in xmlData.Records)
    {
        recordsSheet.Cells[$"A{row}"].Value = record.XField1;
        recordsSheet.Cells[$"B{row}"].Value = record.XField2;
        recordsSheet.Cells[$"C{row}"].Value = record.XField3.ToString("yyyy-MM-dd HH:mm:ss");
        row++;
    }
    
    // 格式化数据工作表
    recordsSheet.Cells["A1:C1"].Style.Font.Bold = true;
    recordsSheet.Cells.AutoFitColumns();
    
    // 保存Excel文件
    package.SaveAs(new FileInfo(excelOutputPath));
}

5. 主函数调用整合

把上述方法整合起来,完成整个转换流程:

static void Main(string[] args)
{
    string xmlInputPath = @"C:\your-input-file.xml";
    string excelOutputPath = @"C:\your-output-file.xlsx";
    
    var xmlData = DeserializeXml(xmlInputPath);
    ConvertToExcel(xmlData, excelOutputPath);
    
    Console.WriteLine("XML转Excel完成!");
}
关键注意事项
  • 命名空间匹配:实体类XmlRoot的命名空间必须和XML根节点的命名空间完全一致,否则反序列化会读取不到数据。
  • XXXRecord字段补充:你提供的XML中XXXRecord的字段被截断了,请根据实际XML结构补充XXXRecord类的属性,并同步调整Excel写入的代码。
  • 字段较多时的优化:如果XXXRecord的字段很多,你可以用反射遍历属性自动生成表头和填充数据,避免手动硬编码每个字段。
  • EPPlus许可证:商业项目使用EPPlus需要购买商业许可证,非商业项目用LicenseContext.NonCommercial即可。

内容的提问来源于stack exchange,提问作者Pragan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:12