Excel转XML后读取并转为.NET对象,是否有内置类型可用?
嘿,这个需求完全可行!而且.NET本身就内置了工具能帮你轻松实现,我给你分享两种实用的处理方式:
方式一:用XmlSerializer反序列化为自定义强类型对象
如果希望得到结构清晰的.NET对象(对应工作表、行、列),最直接的方式是先根据Excel导出的XML结构定义匹配的类,再用XmlSerializer把XML内容直接转成对象。
举个简单的示例(你需要根据实际XML的节点名称、命名空间调整类的属性):
using System.Xml.Serialization; using System.Collections.Generic; // 对应XML根节点(比如Workbook) [XmlRoot("Workbook")] public class ExcelWorkbook { // 对应每个工作表节点 [XmlElement("Worksheet")] public List<ExcelWorksheet> Worksheets { get; set; } = new List<ExcelWorksheet>(); } public class ExcelWorksheet { // 工作表名称(如果XML里有Name属性) [XmlAttribute("Name")] public string Name { get; set; } // 对应工作表里的表格节点 [XmlElement("Table")] public ExcelTable Table { get; set; } } public class ExcelTable { // 对应每一行 [XmlElement("Row")] public List<ExcelRow> Rows { get; set; } = new List<ExcelRow>(); } public class ExcelRow { // 对应每一列单元格 [XmlElement("Cell")] public List<ExcelCell> Cells { get; set; } = new List<ExcelCell>(); } public class ExcelCell { // 单元格内容 [XmlElement("Data")] public string Value { get; set; } // 如果XML里有数据类型属性,可以额外添加 [XmlAttribute("Type")] public string DataType { get; set; } }
然后用以下代码读取XML并转换:
var serializer = new XmlSerializer(typeof(ExcelWorkbook)); using (var reader = new StreamReader("你的Excel导出文件.xml")) { var workbook = (ExcelWorkbook)serializer.Deserialize(reader); // 现在你可以直接操作workbook对象了,比如遍历工作表、行、列 foreach (var sheet in workbook.Worksheets) { Console.WriteLine($"工作表:{sheet.Name}"); foreach (var row in sheet.Table.Rows) { foreach (var cell in row.Cells) { Console.Write($"{cell.Value}\t"); } Console.WriteLine(); } } }
注意:如果你的XML带有命名空间,需要在XmlRoot或XmlElement属性里指定Namespace参数,确保和XML里的命名空间一致。
方式二:用LINQ to XML灵活查询(无需预定义类)
如果不想提前写一堆类,或者XML结构偶尔有变动,用LINQ to XML会更灵活,直接加载XML后通过LINQ查询提取数据:
using System.Xml.Linq; var doc = XDocument.Load("你的Excel导出文件.xml"); // 提取所有工作表及其行、列数据 var worksheetData = doc.Descendants("Worksheet") .Select(sheet => new { SheetName = sheet.Attribute("Name")?.Value, Rows = sheet.Descendants("Row") .Select(row => row.Descendants("Cell") .Select(cell => cell.Element("Data")?.Value) .ToList()) .ToList() }) .ToList(); // 遍历输出示例 foreach (var sheet in worksheetData) { Console.WriteLine($"工作表:{sheet.SheetName}"); foreach (var row in sheet.Rows) { Console.WriteLine(string.Join("\t", row)); } }
这种方式适合快速提取数据,不需要维护强类型类,尤其适合临时分析或结构多变的XML文件。
小提示
Excel导出的XML(比如SpreadsheetML格式)可能包含一些元数据节点(比如样式、格式定义),你可以根据实际需求过滤掉这些节点,只提取业务相关的行和列数据。
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

