【问题标题】:Excel to JSON Schema in JavascriptJavascript 中的 Excel 到 JSON 架构
【发布时间】:2016-07-18 15:38:27
【问题描述】:

我的任务是生成表单 excelsheet,我必须根据 excelsheet 中提供的数据类型设计表单。例子:

我正在尝试从上面的 excel 数据中创建一个 JSON 架构,以便我可以将其插入 mongodb 以动态生成表单。

以下是我正在尝试实现的代码:

            var workbook = XLSX.readFile(req.file.path);
            //console.log(workbook);
            var result = {};
            workbook.SheetNames.forEach(function (sheetName) {
                var roa = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
                if (roa.length > 0) {
                    result = roa;
                }
            });
            //return result;
            //console.log(result);

            var jsonData = {};
            var dropdown = {};
            var attrTypes = result[0];
            //console.log(attrTypes);

            for (var i = 1; i < result.length; i++) {
                var obj = result[i];
                //console.log(obj);
                for (var key in obj) {
                    var attrName = key;
                    var attrValue = obj[key];
                    if (attrTypes[attrName]) {
                        var type = attrTypes[attrName].toLowerCase().replace(/ /g, ''); // Means type is given                        
                        //console.log(type);

                        if (type === "selectbox") {
                            console.log(attrValue);
                            //var dropdown = attrValue;
                            //console.log(dropdown);
                        }

                    } else {
                        //console.log(type); // Means type is not given
                        jsonData = attrName + ":" + attrValue;
                        //console.log(jsonData);
                    }
                }
            }

预期JSON 输出:

[
{
    Number : 1,
    FirstName : "Abc",
    LastName : "Xyza",
    Dept: ['Finance','Health','Insurance'],
    Country : ['US','Australia','Canada'],
    Year : ['2014','2015','2016'],,
    DateofBirth" : new Date(1937,05,02),
    Gender : ['M','F']    
},
{
    Number : 2,
    FirstName : "Abcd",
    LastName : "Xyzb",
    Dept: ['Finance','Health','Insurance'],
    Country : ['US','Australia','Canada'],
    Year : ['2014','2015','2016'],,
    DateofBirth" : new Date(1948,10,27),
    Gender : ['M','F']    
}
        .
        .
        and so on
]

以上是我试图在 MEANSTACK 中实现的代码。

任何帮助将不胜感激。

【问题讨论】:

  • 不要粘贴代码块并要求我们调试它。你试过什么?实际与预期的行为是什么?错误信息? stackoverflow.com/help/how-to-ask
  • @JuanMendes:好的。让我更新一个帖子
  • @JuanMendes:我已经更新帖子请检查它
  • 预期的Dept 值是一个数组?不应该是下拉列表的值吗?我建议先将工作表转换为常规字符串二维数组,然后再创建对象。
  • 错误/问题是什么?您提出的问题越多,得到的回答就越快。

标签: javascript json mongodb mean-stack mean


【解决方案1】:

This project 从 XLSX 文件生成 JSON。看看那个代码。

它是用 Java 编写的。它使用apache.poi 解析XLSX 文件和mongodb.bson 生成JSON。也许它会给你任何有用的想法。

This projectthis project 是用 Javascript 编写的。如果你在 github 上搜索,你可能会找到有用的代码。

【讨论】:

    【解决方案2】:

    在我看来,您混淆了schema with that of data 的概念。 Abc Xyza 的财务部门是数据。给定 Excel 文件的 Department 的可能值是 Finance、Health 或 Insurance 是模式。

    这里是一个例子:http://json-schema.org/examples.html

    因此,如果问题的标题是正确的并且您需要 JSON 模式,那么我会使用从提供的值创建字符串数组的函数,如果是“下拉菜单”或“单选按钮”类型,则确定列中值的数据类型(int 表示 Number,string 表示 FirstName 等),确定最小值和最大值甚至允许的字符串模式。

    我在这里设想的输出是这样的:

    {
        "id" : "http://your.site/form-schema",
        "title" : "Form schema",
        "description" : "JSON schema for autogenerating forms",
        "type" : "object",
        "properties" : {
            "Number" : {
                "type" : "integer"
            },
            "FirstName" : {
                "type" : "string"
            },
            "LastName" : {
                "type" : "string"
            },
            "Dept" : {
                "type" : "string",
                "oneOf" : [
                            { "format" : "Finance"},
                            { "format" : "Health" },
                            { "format" : "Insurance" }
                ]
            },
            "Country" : {
                "type" : "string",
                "oneOf" : [
                            {"format" : "US" },
                            { "format" : "Australia" },
                            { "format" : "Canada" }
                ]
            },
            "Year" : {
                "type" : "integer",
                "oneOf" : [
                            { "format" : "2014" },
                            { "format" : "2015" },
                            { "format" : "2016" }
                ]
            },
            "DateofBirth" : {
                "type" : "string",
                "pattern" : "yyyyMMdd"
            },
            "Gender" : {
                "enum" : ["M", "F"]
            }
        },
        "required" : ["Number", "FirstName", "LastName"],
        "additionalProperties" : false
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用JS-XLSX库读取客户端的XLSX和其他excel格式。

      您不需要在下拉列表中存储要在输入乘法中填充的任何其他值。它们应分开存放。所以数组对象应该如下所示

      [   
          {  
            "Number":1,
            "FirstName":"Abc",
            "LastName":"Xyza",
            "Dept":"Finance",
            "Country":"US",
            "Year":2014,
            "DateOfBirth":19370502,
            "Gender":"M"
          },
          {  
            "Number":2,
            "FirstName":"Abcd",
            "LastName":"Xyzb",
            "Dept":"Health",
            "Country":"Australia",
            "Year":2014,
            "DateOfBirth":19481027,
            "Gender":"F"
          }
      ]
      

      下拉列表和单选值应分开存储,如下所示:

      {  
         "Dept":{  
            "type":"dropdown",
            "values":[  
               "Finance",
               "Health",
               "Insurance"
            ]
         },
         "Country":{  
            "type":"dropdown",
            "values":[  
               "US",
               "Australia",
               "Canada"
            ]
         },
         "Year":{  
            "type":"dropdown",
            "values":[  
               2014,
               2015,
               2016
            ]
         },
         "Gender":{  
            "type":"radio button",
            "values":[  
               "M",
               "F"
            ]
         }
      }
      

      这两者都可以组合成一个模式对象

      //included single objects from both for brevity
      jsonSchema = {
          array: [
              {  
                  "Number":2,
                  "FirstName":"Abcd",
                  "LastName":"Xyzb",
                  "Dept":"Health",
                  "Country":"Australia",
                  "Year":2014,
                  "DateOfBirth":19481027,
                  "Gender":"F"
              }
          ],
          inputs: {
              "Gender":{  
                  "type":"radio button",
                  "values":[  
                      "M",
                      "F"
                  ]
              }
          }
      };
      

      注意:日期类型值在序列化为 JSON 时不能存储为日期对象。这些应存储为字符串或数字,并应在客户端转换为 Date 对象

      我在这个GIT项目中实现了JSON生成和Form生成

      https://github.com/ConsciousObserver/stackoverflow/tree/master/excelTest

      以下是输出截图。

      这是输出的 JSON。

      {
        "array": [
          {
            "Number": 1,
            "FirstName": "Abc",
            "LastName": "Xyza",
            "Dept": "Finance",
            "Country": "US",
            "Year": 2014,
            "DateOfBirth": 19370502,
            "Gender": "M"
          },
          {
            "Number": 2,
            "FirstName": "Abcd",
            "LastName": "Xyzb",
            "Dept": "Health",
            "Country": "Australia",
            "Year": 2014,
            "DateOfBirth": 19481027,
            "Gender": "F"
          },
          {
            "Number": 3,
            "FirstName": "Abce",
            "LastName": "Xyzc",
            "Dept": "Health",
            "Country": "US",
            "Year": 2015,
            "DateOfBirth": 19441029,
            "Gender": "F"
          },
          {
            "Number": 4,
            "FirstName": "Abcf",
            "LastName": "Xyzd",
            "Dept": "Insurance",
            "Country": "Canada",
            "Year": 2016,
            "DateOfBirth": 19481030,
            "Gender": "M"
          },
          {
            "Number": 5,
            "FirstName": "Abcg",
            "LastName": "Xyze",
            "Dept": "Finance",
            "Country": "Canada",
            "Year": 2016,
            "DateOfBirth": 19480604,
            "Gender": "M"
          }
        ],
        "inputs": {
          "Dept": {
            "type": "dropdown",
            "values": [
              "Finance",
              "Health",
              "Insurance"
            ]
          },
          "Country": {
            "type": "dropdown",
            "values": [
              "US",
              "Australia",
              "Canada"
            ]
          },
          "Year": {
            "type": "dropdown",
            "values": [
              2014,
              2015,
              2016
            ]
          },
          "Gender": {
            "type": "radio button",
            "values": [
              "M",
              "F"
            ]
          }
        }
      }
      

      【讨论】:

      • @11thdimention:谢谢
      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多