如何使用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
相关产品推荐
相关产品推荐

