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

如何自定义Excel转JSON的数据筛选与展示格式?

问题解决:Excel转自定义结构JSON的筛选与格式定制

问题概述

已实现Excel读取并转JSON,但无法筛选所需数据,也无法生成指定格式的JSON输出。当前输出是按Excel列名(A、B、C...)的键值对,期望输出是对应InterfaceRecord实体的结构化JSON,包含表格内指定字段及自定义固定字段。

现有代码问题分析

  1. 每个单元格创建一个InterfaceRecord,逻辑错误:一行数据应对应一个实体实例
  2. 未映射Excel列到实体属性,无法筛选所需字段
  3. 未填充自定义字段(MachineName、ClientID、CreatedAt)
  4. 序列化的是原始列字典列表,而非目标实体列表

修改后的实现代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:55:03