【问题标题】:Convert Excel to JSON using LightweightExcelReader使用 LightweightExcelReader 将 Excel 转换为 JSON
【发布时间】:2021-04-09 02:27:36
【问题描述】:

我有一个带有工作表的 Excel 文件 (.xlsx),如下所示:

Name     | Age | Country      |
Nik        17    Switzerland
Thomas     28    Kuba
Waslim     12    Russia

我想将此 Excel 表格转换为 JSON 格式。

结果应该是这样的:

[
    {
        "Name":"Nik",
        "Age":17,
        "Country":"Switzerland"
    },
    {
        "Name":"Thomas",
        "Age":28,
        "Country":"Kuba"
    },
    {
        "Name":"Waslim",
        "Age":12,
        "Country":"Russia"
    }
]

我想使用LightweightExcelReader 框架。我知道已经问过similar question,但答案使用OLEDB,这不再是最佳实践。我想用一个更简单、更快的框架来解决这个转换。

重要提示: 行数和列数是动态的并且可以变化,但 Excel 工作表的格式在工作表之间保持相同。

这是我的尝试。如您所见,我没有管理很多,而且非常基本。我设法获得了 JSON 中键的第一行:

var excelReader = new ExcelReader(@"path\to\file\test.xlsx");
var sheetReader = excelReader[0];

IEnumerable<object> keys = sheetReader.Row(1);

如何使用 LightweightExcelReader 框架将 Excel 工作表转换为 JSON 格式?

【问题讨论】:

    标签: c# json excel


    【解决方案1】:

    如果您不介意依赖 Newtonsoft JSON,您可以执行以下操作:

    public static class ExcelJsonExtensionMethods
    {
        public static string ToJson(this SheetReader sheetReader)
        {
            IDictionary<int, string> HeaderNames = GetHeaderNames(sheetReader);
            var jArray = new JArray();
            while (sheetReader.ReadNext())
            {
                var jObject = new JObject();
                do
                {
                    var propertyName = HeaderNames[new CellRef(sheetReader.Address).ColumnNumber];
                    jObject[propertyName] = sheetReader.Value?.ToString();
                } while (sheetReader.ReadNextInRow());
                jArray.Add(jObject);
            }
    
            return jArray.ToString();
        }
    
        private static IDictionary<int, string> GetHeaderNames(SheetReader sheetReader)
        {
            var headerNames = new Dictionary<int, string>();
            while (sheetReader.ReadNextInRow())
            {
                headerNames.Add(new CellRef(sheetReader.Address).ColumnNumber, sheetReader.Value?.ToString());
            }
    
            return headerNames;
        }
    }
    

    像这样使用它:

    var excelReader = new ExcelReader(@"path\to\file\test.xlsx");
    var sheetReader = excelReader[0];
    var sheetJson = sheetReader.ToJson();
    

    请记住,要使此代码正常工作:

    • 标题必须位于第一行
    • 标头名称必须是有效的 JSON 属性名称
    • 标题名称不能重复
    • 标题中不能有任何空白列

    【讨论】:

      【解决方案2】:

      LightWeightExcelReader 在他们的 github 自述文件中声明

      如果您想将电子表格映射到对象集合,请使用我们的姊妹项目 ExcelToEnumerable

      他们姊妹项目的示例看起来很像您想要实现的目标。 https://github.com/ChrisHodges/ExcelToEnumerable

      public class Animal
      {
        public string Name { get; set; }
        public string Colour { get; set; }
        public int Legs { get; set; }
        public decimal TopSpeed { get; set; }
      }
      
      IEnumerable<Animal> animals = "path/to/ExcelFile.xlsx".ExcelToEnumerable<Animal>();
      

      然后动物应该很容易用 Newtonsoft Json 序列化

      using (StreamWriter file = File.CreateText(@"c:\animals.json"))
      {
          JsonSerializer serializer = new JsonSerializer();
          serializer.Serialize(file, animals);
      }
      

      【讨论】:

      • ExcelToEnumerable 框架的问题在于,行和列不能是动态的,并且必须始终相同。这是我必须具备的标准。在 ExcelToEnumerable 中,您必须定义一个类,然后将 Excel 映射到该类。所以键的数量(姓名、年龄、国家和可能更多)不能改变,因为你在类中总是有相同的字段。请纠正我,如果它仍然有可能。
      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多