如何自定义Excel转JSON的数据筛选与展示格式?
问题解决:Excel转自定义结构JSON的筛选与格式定制
问题概述
已实现Excel读取并转JSON,但无法筛选所需数据,也无法生成指定格式的JSON输出。当前输出是按Excel列名(A、B、C...)的键值对,期望输出是对应InterfaceRecord实体的结构化JSON,包含表格内指定字段及自定义固定字段。
现有代码问题分析
- 每个单元格创建一个
InterfaceRecord,逻辑错误:一行数据应对应一个实体实例 - 未映射Excel列到实体属性,无法筛选所需字段
- 未填充自定义字段(
MachineName、ClientID、CreatedAt) - 序列化的是原始列字典列表,而非目标实体列表
修改后的实现代码
1. 核心读取逻辑修改
// 定义Excel列与实体属性的映射(根据实际列调整) var columnMapping = new Dictionary<string, string> { {"A", "SampleNumber"}, {"E", "Value"} }; List<InterfaceRecord> interfaceRecords = new List<InterfaceRecord>(); foreach (Row row in rows) { // 跳过表头行(如果需要) if (row.RowIndex == 1) continue; InterfaceRecord record = new InterfaceRecord(); // 设置自定义固定字段 record.MachineName = "Analyzer A"; record.ClientID = 123; record.CreatedAt = DateTime.Now; int columnNumber = 1; foreach (Cell cell in row.Elements<Cell>()) { string columnName = GetColumnName(columnNumber); string cellValue = GetCellValue(cell, spreadsheetDocument); // 根据映射赋值对应属性 if (columnMapping.TryGetValue(columnName, out var propertyName)) { switch (propertyName) { case "SampleNumber": record.SampleNumber = cellValue; break; case "Value": if (decimal.TryParse(cellValue, out decimal value)) { record.Value = value; } break; } } columnNumber++; } interfaceRecords.Add(record); }
2. JSON序列化修改
// 直接序列化实体列表,而非原始列字典 string json = JsonConvert.SerializeObject(interfaceRecords, Formatting.Indented); string jsonPath = properties.Path; string randomFileName = DateTime.Today.Ticks.ToString(); File.WriteAllText($"{jsonPath}\\RandomFilen.json", json);
3. 保留原列名转换方法(无需修改)
public static string GetColumnName(int columnNumber) { int dividend = columnNumber; string columnName = string.Empty; int modulo; while (dividend > 0) { modulo = (dividend - 1) % 26; columnName = Convert.ToChar(65 + modulo).ToString() + columnName; dividend = (int)((dividend - modulo) / 26); } return columnName; }
4. 实体类(无需修改)
class InterfaceRecord { public string? SampleNumber { get; set; } public decimal Value { get; set; } public DateTime CreatedAt { get; set; } public long ClientID { get; set; } public string? MachineName { get; set; } }
关键改动说明
- 列映射机制:通过
columnMapping明确指定哪些Excel列对应实体的哪个属性,实现数据筛选 - 行对应实体:每一行创建一个
InterfaceRecord,符合数据逻辑 - 自定义字段填充:直接在创建实体时设置表格外的固定字段值
- 目标序列化:序列化实体列表而非原始字典,直接生成期望的JSON结构
输出示例
[ { "SampleNumber": "123-ABC", "Value": 0.1234, "CreatedAt": "2024-05-20T14:30:00", "ClientID": 123, "MachineName": "Analyzer A" } ]
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

