【问题标题】:How to serialize Xml (from XLSX files) to Json ? C# .NET Json.Net如何将 Xml(从 XLSX 文件)序列化为 Json? C# .NET Json.Net
【发布时间】:2016-09-09 09:48:41
【问题描述】:

我正在处理不同类型的 Xlsx 文件。
这些文件有多个列的可能性,例如 2 或 6 甚至 7 列)
我使用 OpenXml 读取了里面的 Xml 数据,我想从每个工作表中生成 Json 文件。
实际上我能够阅读并遍历每个工作表,但是当我尝试使用 Newtonsoft.Json 将其转换为 Json 格式时似乎很奇怪


Excel 文件与此类似
项目 1 ||项目 2 ||第 3 项
V1 || V2 || V3
V1 || V2 || V3
V1 || V2 || V3

但生成的 JSON 文件与此类似
[
[第 1 项 ,第 2 项 ,第 3 项]
[V1 ,V2 ,V3]
[V1 ,V2 ,V3]
[V1 ,V2 ,V3]
]


我想这样格式化它


{
{"项目 1":"V1" ,"项目 2":"V2" ,"项目 3":"V3"}
{"项目 1":"V1" ,"项目 2": "V2" ,"项目 3":"V3"}
{"项目 1":"V1" ,"项目 2":"V2" ,"项目 3":"V3"}
}

这是我的代码:

使用 (SpreadsheetDocument excelDocument = SpreadsheetDocument.Open(file, false)) { var documentBody = excelDocument.WorkbookPart.Workbook;

            var sheets = documentBody.Sheets.Cast<Sheet>().ToList();
            sheets.ForEach(x => Console.WriteLine(String.Format("RelationshipId:{0}\n SheetName:{1}\n SheetId:{2}", x.Id.Value, x.Name.Value, x.SheetId.Value)));

            SharedStringTablePart sstpart = excelDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
            SharedStringTable sst = sstpart.SharedStringTable;

            Console.WriteLine("Worksheet count = {0}", documentBody.WorkbookPart.WorksheetParts.Count());

            foreach (var worksheetPart in documentBody.WorkbookPart.WorksheetParts)
            {

                DocumentFormat.OpenXml.Spreadsheet.Worksheet sheet = worksheetPart.Worksheet;

                var cells = sheet.Descendants<Cell>();
                var rows = sheet.Descendants<Row>();

                Console.WriteLine("Row count = {0}", rows.LongCount());
                Console.WriteLine("Cell count = {0}", cells.LongCount());
                var list = new List<string[]>();
                foreach (Row row in rows)
                {
                    Console.WriteLine("Row number: {0}", row.RowIndex);
                    list.Add(row.Elements<Cell>().Select(x => x.InnerText).ToArray());
                    foreach (Cell c in row.Elements<Cell>())
                    {
                        if (c.CellValue != null)
                        {
                            Console.WriteLine("Cell contents: {0}", c.CellValue.Text);

                        }
                    }
                }
                var i = JsonConvert.SerializeObject(list, Newtonsoft.Json.Formatting.Indented);


            }
        }

【问题讨论】:

    标签: c# .net json json.net


    【解决方案1】:

    将字符串 xml 中包含的 XML 节点转换为 JSON 字符串

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string jsonText = JsonConvert.SerializeXmlNode(doc);
    

    将字符串 json 中包含的 JSON 文本转换为 XML 节点

     XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
    

    此处的文档:Click Here for Documentation

    或者在我使用字典的代码下面试试这个

    class Program
    {
    static void Main()
    {
        var xml = 
        @"<Columns>
          <Column Name=""key1"" DataType=""Boolean"">True</Column>
          <Column Name=""key2"" DataType=""String"">Hello World</Column>
          <Column Name=""key3"" DataType=""Integer"">999</Column>
        </Columns>";
        var dic = XDocument
            .Parse(xml)
            .Descendants("Column")
            .ToDictionary(
                c => c.Attribute("Name").Value, 
                c => c.Value
            );
        var json = new JavaScriptSerializer().Serialize(dic);
        Console.WriteLine(json);
    }
    

    }

    【讨论】:

    • 字典的 json 序列化给出 { "key": "property", "Value": objectValue } KeyValuePair 对象的原因
    【解决方案2】:

    在您的情况下,我建议使用 ExpandoObject 列表而不是字符串 [] 列表。 它是作为 IDictionnary 生成的动态对象

    var list = new List<ExpandoObject>();
    var expandoObject = new ExpandoObject();
    var dict = (IDictionary<string, Object>)expandoObject;
    dict.Add("NewProp", "prop value");
    dict.Add("SecondProp", 58);
    list.add(expandoObject);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多