簡體   English   中英

如何通過分離對象的項目符號將對象轉換為Excel / csv文件中具有多個工作表的csv文件

[英]How to convert Object to csv file with a multiple sheet in excel/csv file by separating bullet of Object

我需要一些建議,通過將每個項目符號分隔到 csv / excel文件中的新表中,將下面的對象轉換為csv文件。”

var data = {
  DeviceA: {
    smokeSensor: [
      {
        '190501': {
          '0001': 200,
          '0002': 300
        },
      },
      {
        '190502': {
          '0001': 20,
          '0002': 30
        },
      }
    ],
    fireSensor: [
      {
        '190501': {
          '0001': 700,
          '0002': 750
        },
      },
      {
        '190502': {
          '0001': 780,
          '0002': 630
        },
      }
    ]
  },
  DeviceB: {
    smokeSensor: [
      {
        '190601': {
          '0001': 100,
          '0002': 110
        },
      },
      {
        '190602': {
          '0001': 120,
          '0002': 130
        },
      }
    ],
    fireSensor: [
      {
        '190601': {
          '0001': 600,
          '0002': 522
        },
      }
    ]
  },
};

目前,我已經完成了用自己的方式轉換數據並獲得excel文件的結果。

var data = { deviceA: { smokeSensor: [ { '190501': { '0001': 200, '0002': 300 }, }, { '190502': { '0001': 20, '0002': 30 }, } ], fireSensor: [ { '190501': { '0001': 700, '0002': 750 }, }, { '190502': { '0001': 780, '0002': 630 }, } ] }, deviceB: { smokeSensor: [ { '190601': { '0001': 100, '0002': 110 }, }, { '190602': { '0001': 120, '0002': 130 }, } ], fireSensor: [ { '190601': { '0001': 600, '0002': 522 }, } ] }, };

const dataToCSV = data => {
  const rows = [];

  for (const device in data) {
    rows.push(
      [device.replace(/^./, m => m.toUpperCase())], 
      ["Date/Time", ...Object.keys(data[device])]
    );
    const groups = {};
    let longest = 0;

    for (const sensor in data[device]) {  
      for (const time of data[device][sensor]) {
        const k = Object.keys(time)[0];

        for (const hm in time[k]) {
          const groupKey = `${k} ${hm.replace(/(\d\d)(\d\d)/, "$1:$2")}`;

          if (!(groupKey in groups)) {
            groups[groupKey] = [groupKey];
          }

          groups[groupKey].push("" + time[k][hm]);
          longest = Math.max(longest, groups[groupKey].length);
        }
      }
    }

    for (const group of Object.values(groups)) {
      while (group.length < longest) { 
        group.push("");
      }

      rows.push(group);
    }

    rows.push([""]);
  }

  return rows.slice(0, -1);
};

const rows = dataToCSV(data)

/* const rows = [
  ["DeviceA"]
  ["Date/Time", "smokeSensor", "fireSensor"],
  ["190501 00:01", "200", "700"],
  ["190501 00:02", "300", "750"],
  ["190502 00:01", "20", "780"],
  ["190502 00:02", "30", "630"],
  [""],
  ["DeviceB"],
  ["Date/Time", "smokeSensor", "fireSensor"],
  ["190501 00:01", "100", "600"],
  ["190501 00:02", "110", "522"],
  ["190502 00:01", "120", ""],
  ["190502 00:02", "130", ""],
];
*/

function exportToCSV(rows) {
      let csvContent = ""
      rows.forEach(function(rowArray) {
          let row = rowArray.join(",")
          csvContent += row + "\r\n"
      });
      var link = document.createElement("a")
      document.body.appendChild(link)
      // var blob = new Blob([csvContent], {type: "text/csv"}); 
      var blob = new Blob([csvContent], {type: "xls/xlsx"})
      var url = window.URL.createObjectURL(blob)
      link.setAttribute("href", url)
      link.setAttribute("download", "my_data.csv")
      link.click() /* Download the data file named "my_data.csv". */
      $('#loading-modal').modal('hide');
},

exportToCSV(rows)

以上一切似乎還可以。 但是,如果我有超過1000條記錄的大量數據,那么所有這些都顯示在一個工作表文件中,那么我就無法向下滾動以查看DeviceB,對嗎? 因此,我想將DeviceB分離到excel文件中的新表中。 我必須從exportToCSV函數做些什么?

您需要將行聲明為object( rows = {} )。 循環數據數組時,請使用鍵名( deviceA,deviceB... )並使用鍵名將該鍵名聲明為數組。

我已經在您的代碼中進行了更改,並創建了代碼段。

參見下面的屏幕截圖和代碼片段

在此處輸入圖片說明

 var data = {"deviceA":{"smokeSensor":[{"190501":{"0001":200,"0002":300}},{"190502":{"0001":20,"0002":30}}],"fireSensor":[{"190501":{"0001":700,"0002":750}},{"190502":{"0001":780,"0002":630}}]},"deviceB":{"smokeSensor":[{"190601":{"0001":100,"0002":110}},{"190602":{"0001":120,"0002":130}}],"fireSensor":[{"190601":{"0001":600,"0002":522}}]}}; const dataToCSV = data => { const rows = {}; for (const device in data) { let keyName = device.replace(/^./, m => m.toUpperCase()); rows[keyName] = [ ["Date/Time", ...Object.keys(data[device])] ]; const groups = {}; let longest = 0; for (const sensor in data[device]) { for (const time of data[device][sensor]) { const k = Object.keys(time)[0]; for (const hm in time[k]) { const groupKey = `${k} ${hm.replace(/(\\d\\d)(\\d\\d)/, "$1:$2")}`; if (!(groupKey in groups)) { groups[groupKey] = [groupKey]; } groups[groupKey].push("" + time[k][hm]); longest = Math.max(longest, groups[groupKey].length); } } } for (const group of Object.values(groups)) { while (group.length < longest) { group.push(""); } rows[keyName].push(group); } } return rows; } const rowObject = dataToCSV(data); function exportToCSV(rows, keyName) { let csvContent = "" rows.forEach(function(rowArray) { let row = rowArray.join(",") csvContent += row + "\\r\\n" }); var blob = new Blob([csvContent], { type: "xls/xlsx" }); var url = window.URL.createObjectURL(blob); $('#container').append(`<a download="${keyName}.csv" href="${url}">Click to Download : ${keyName}</a>`); } for (let key in rowObject) { exportToCSV(rowObject[key], key); } 
 #container a{ display: inline-block; width: 100%; background-color: #3c3c3c; color: #fff; padding: 10px 20px; margin: 5px 0px; text-decoration: none; } #container a:hover{ color:#ffa; text-decoration: underline; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="container"></div> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM