iT邦幫忙

0

尋找支援excel轉Json的工具

如標題,我想尋找一個"工具"可以支援excel轉成Json格式,包含陣列與非陣列(如下所示),因工作安排為非自行開發,因此在板上提問,想看看邦友是否使用過類似工具,謝謝。

  • 陣列單值
{
    "Color":["white","red","blue"]
}
  • 陣列多值
{  
   "Members":[  
      {  
         "no":"A001",
         "name":"Annie",
         "sex":"women",
         "id":"54321"
      },
      {  
         "no":"A002",
         "name":"David",
         "sex":"men",
         "id":"54321"
      }
   ]
}
  • 非陣列
{  
   "Author":{  
      "name":"Annie",
      "sex":"women"
   }
}

問題 : 目前找到的工具只能符合一種陣列或非陣列單值,
想詢問是否有其他工具呢?

輸入的Excel如下 :
https://ithelp.ithome.com.tw/upload/images/20190606/20115336MvgIoU6tBr.png

使用工具產生的結果 :
https://ithelp.ithome.com.tw/upload/images/20190606/20115336OLBIV5102M.png


更新:謝謝邦友提供程式的部分,若之後工作安排自行開發,會再朝各位提供的方向去嘗試,謝謝!

ccutmis iT邦研究生 4 級 ‧ 2019-06-06 16:38:55 檢舉
關鍵字 "python excel to json"
Luis-Chen iT邦新手 4 級 ‧ 2019-06-12 23:55:53 檢舉
你應該先用excel export cvs 再找cvs convert json
anniecat iT邦新手 5 級 ‧ 2019-06-14 13:32:44 檢舉
謝謝兩位提供的關鍵字,之後有實做的話,會再朝你們提到的部份去嘗試,謝謝!
1
浩瀚星空
iT邦大師 1 級 ‧ 2019-06-06 16:16:26

不知道,沒在用這種工具。
一般都是直接寫程式,並搭配我想要的格式直接輸出。
倒還真的沒碰過這種工具。

anniecat iT邦新手 5 級 ‧ 2019-06-06 16:35:08 檢舉

我也正在尋找中,因為User常接觸的是office,建立的資料很大筆,希望可以透過他們熟悉的工具將內容轉成Json丟給系統

1
vegalou
iT邦新手 5 級 ‧ 2019-06-06 16:37:57

自己寫個 form, textarea parse paste tab / string ,
new line per Obj or Arr.

JS就搞定了

看更多先前的回應...收起先前的回應...
anniecat iT邦新手 5 級 ‧ 2019-06-06 16:43:00 檢舉

使用者手上只有Excel,先排除一筆一筆透過系統key-in的方式,
希望可以找到工具給使用者使用

dragonH iT邦新手 1 級 ‧ 2019-06-06 16:51:26 檢舉

vegalou大 的意思是

你就是這工具的作者

anniecat iT邦新手 5 級 ‧ 2019-06-06 16:53:37 檢舉

恩恩,有看懂,只是目前工作安排是先找到現成的工具,謝謝!

froce iT邦大師 7 級 ‧ 2019-06-06 18:01:02 檢舉

你在這問的時間,搞不好都寫出來了...

2
小魚
iT邦高手 1 級 ‧ 2019-06-06 16:43:27
anniecat iT邦新手 5 級 ‧ 2019-06-06 16:48:33 檢舉

看完這篇,發現是JSON轉成Excel,
我剛好是需要Excel轉成JSON的,但還是很謝謝!

0
giulian
iT邦新手 5 級 ‧ 2019-06-07 11:59:21
anniecat iT邦新手 5 級 ‧ 2019-06-10 09:42:55 檢舉

這個我有操作過,可能不適用所有狀況,謝謝!

3
淺水員
iT邦新手 3 級 ‧ 2019-06-07 20:23:19

不知道你要用什麼語言
所以就直接用網頁前端處理了
(js-xlsx 參考:https://github.com/SheetJS/js-xlsx

<!DOCTYPE html>
<html lang="Zh-Hant">
<head>
    <meta charset="utf-8">
    <title>excel2json</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js"></script>
</head>
<body>
    <input type="file" onchange="onLoadExcel(this)">
    <pre id='output'></pre>
    <script>
    function onLoadExcel(eleInputFile)
    {
        let frd=new FileReader();
        frd.onload=function(evt) {
            let data=new Uint8Array(this.result);
            let wb;
            try{
                wb=XLSX.read(data, {type:'array'});
            } catch(err) {
                alert('無法讀取這個格式的檔案'+err);
                return;
            }
            parseToJson(wb);
        }
        frd.readAsArrayBuffer(eleInputFile.files[0]);
    }

    function parseToJson(wb)
    {
        let jsonData={};
        wb.SheetNames.forEach(function(name){
            let sheet=wb.Sheets[name];
            let range=XLSX.utils.decode_range(sheet['!ref']);
            let nCols=range.e.c-range.s.c+1;
            let nRows=range.e.r-range.s.r+1;
            if(nRows-3===1) {
                jsonData[name]=getNonArray(name, sheet, range);
            } else if(nCols===1) {
                jsonData[name]=getSingleValueArray(name, sheet, range);
            } else {
                jsonData[name]=getMultiValueArray(name, sheet, range);
            }
        });
        document.getElementById('output').textContent=JSON.stringify(jsonData, null, 4);
        
        function getSingleValueArray(name, sheet, range) {
            let arr=[];
            for(let i=range.s.r; i<=range.e.r-3; ++i) {
                arr.push(getCellValue(sheet, range, 0, i+3));
            }
            return arr;
        }
        
        function getNonArray(name, sheet, range) {
            let obj2={};
            for(let i=0,n=range.e.c-range.s.c+1; i<n; ++i) {
                obj2[getCellValue(sheet, range, i, 0)]=getCellValue(sheet, range, i, 3);
            }
            return obj2;
        }
        
        function getMultiValueArray(name, sheet, range) {
            let arr=[];
            let obj2;
            for(let i=range.s.r; i<=range.e.r-3; ++i) {
                obj2={};
                for(let j=0,n=range.e.c-range.s.c+1; j<n; ++j) {
                    obj2[getCellValue(sheet, range, j, 0)]=getCellValue(sheet, range, j, i+3);
                }
                arr.push(obj2);
            }
            return arr;
        }
        
        function getCellValue(sheet, range, x, y)
        {
            return sheet[XLSX.utils.encode_cell({c:range.s.c+x, r:range.s.r+y})].v;
        }
    }
    </script>
</body>
</html>
anniecat iT邦新手 5 級 ‧ 2019-06-10 09:46:45 檢舉

原本目的是找到一個工具使用,不好意思讓你費心提供程式,十分感謝!

淺水員 iT邦新手 3 級 ‧ 2019-06-10 10:12:33 檢舉

其實是因為連假有點無聊,想找事情做。以前也沒在前端處理過試算表,剛好研究一下。

anniecat iT邦新手 5 級 ‧ 2019-06-10 11:09:07 檢舉

/images/emoticon/emoticon41.gif

2
來杯拿鐵
iT邦新手 4 級 ‧ 2019-06-08 21:00:10

有接觸過json還不是很熟,所以用格式檢查工具測試。
多筆資料上限,就不知道怎麼測試,樓主可能要先試用過。

加個按鈕,指定巨集就可以使用。
為了排版美觀加了「_」,不想要程式太長可以刪掉。

Sub cvsConvertJson()

'宣告
    Dim json, jsontmp As String
    Dim col, row, colend, rowend As Integer
    col = 1
    row = 1

'判斷case(單欄,二維陣列,單列)B1<>0,A5<>0
'(單欄,二維陣列,單列)=樓主(陣列單值,陣列多值,非陣列)
    If (IsEmpty(Range("A5"))) Then
        row = 0
    End If
    If (IsEmpty(Range("B1"))) Then
        col = 0
    End If
   
   rowend = Range("A1").End(xlDown).row()
   colend = Range("A1").End(xlToRight).Column()
   
'開始
'因為","是保留字,所以要用Chr(34) 代替
    For rownow = 4 To rowend
        If (col) Then
            jsontmp = ""
            For Each colna In Range("A1", Cells(1, colend))
                 jsontmp = jsontmp _
                 & Chr(34) & colna & Chr(34) & ":"
                 
                 jsontmp = jsontmp _
                 & Chr(34) & Cells(rownow, colna.Column()) _
                 & Chr(34) & ","
            Next colna
             
             jsontmp = Left(jsontmp, Len(jsontmp) - 1)
             json = json & "{" & jsontmp & "},"
        Else
            json = json _
            & Chr(34) & Cells(rownow, 1) & Chr(34) & ","
        End If
     Next rownow
     
     json = Left(json, Len(json) - 1)
    
     If (row) Then
         json = "[" + json + "]"
     End If

'結尾
    json = Chr(34) & ActiveSheet.name & Chr(34) & ":" & json
    json = "{" + json + "}"
    
'輸出
    Debug.Print (json)
End Sub
anniecat iT邦新手 5 級 ‧ 2019-06-10 09:46:57 檢舉

原本目的是找到一個工具使用,讓你費心提供程式,真是不好意思,謝謝你!

0
v2266514
iT邦新手 5 級 ‧ 2019-06-13 17:32:00

建議可以用 excel.js 實作

anniecat iT邦新手 5 級 ‧ 2019-06-14 13:31:34 檢舉

謝謝你提供的關鍵字,若之後有安排實做會再朝這部份去看看,謝謝!

我要發表回答

立即登入回答