[英]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.