json2csv

import React, { Component } from 'react';
import PropTypes from 'prop-types'

export default function JSONToCSVConvertor(obj) {
  var JSONData = obj['data'],
  ShowLabel = typeof obj['showLabel'] === 'undefined' ? true : obj['showLabel'],
  ReportTitle = obj['title']
  //If JSONData is not an object then JSON.parse will parse the JSON string in an Object
  var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;
  var CSV = '';
  var ShowLabel = typeof ShowLabel === 'undefined' ? true : ShowLabel;
  //This condition will generate the Label/Header
  if (ShowLabel) {
      var row = "";
      //This loop will extract the label from 1st index of on array
      for (var index in arrData[0]) {
          //Now convert each value to string and comma-seprated
          row += index + ',';
      }
      row = row.slice(0, -1);
      //append Label row with line break
      CSV += row + '\r\n';
  }
  //1st loop is to extract each row
  for (var i = 0; i < arrData.length; i++) {
      var row = "";
      //2nd loop will extract each column and convert it in string comma-seprated
      for (var index in arrData[i]) {
          row += '"' + arrData[i][index] + '",';
      }
      row.slice(0, row.length - 1);
      //add a line break after each row
      CSV += row + '\r\n';
  }
  if (CSV == '') {
      console.error();
      ("Invalid data");
      return;
  }
  // export file
  SaveAs(ReportTitle,CSV);
}


function SaveAs (ReportTitle, CSV){
  console.log("get brower version");
  var Sys = _browerVersion();

  if(Sys.isChrome){
    //this trick will generate a temp "a" tag
    var link = document.createElement("a");
    link.id = "lnkDwnldLnk";
    //this part will append the anchor tag and remove it after automatic click
    document.body.appendChild(link);
    var csv = CSV;
    var csvUrl = _getDownloadUrl(csv); //window.webkitURL.createObjectURL(blob);
    var filename = ReportTitle || 'UserExport';
    filename = filename + '.csv';
    var linkDom = document.getElementById('lnkDwnldLnk');
    linkDom.setAttribute('download', filename);
    linkDom.setAttribute('href', csvUrl);
    linkDom.click();
    document.body.removeChild(link);
  }
  if(Sys.isIE){
    var BOM = "\uFEFF";
    var csvUrl = new Blob([BOM + CSV], {
      type: 'text/csv'
    });
    var filename = ReportTitle || 'UserExport';
    filename = filename + '.csv';
    navigator.msSaveBlob(csvUrl,filename);
  }
}

function _browerVersion(){
    var Sys = {};
    //judge the brower version
    var userAgent = navigator.userAgent;
    console.log(userAgent);

    var isOpera = userAgent.indexOf("Opera") > -1; //whether Opera
    var isIE=window.ActiveXObject || "ActiveXObject" in window
    // var isEdge = userAgent.indexOf("Windows NT 6.1; Trident/7.0;") > -1 && !isIE; //whether IE的Edge浏览器
    var isEdge = userAgent.indexOf("Edge") > -1; //whether IE Edge
    var isFF = userAgent.indexOf("Firefox") > -1; //whether Firefox
    var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //whether Safari
    var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1&&!isEdge; //whether Chrome

    console.log("isOpera?" + isOpera);
    console.log("isIE?" + isIE);
    console.log("isEdge?" + isEdge);
    console.log("isFF?" + isFF);
    console.log("isSafari?" + isSafari);
    console.log("isChrome?" + isChrome);

    if(isChrome) Sys.isChrome = true;
    if(isIE) Sys.isIE = true;

    return Sys;
}


function _getDownloadUrl(text) {
  var BOM = "\uFEFF";
  // Add BOM to text for open in excel correctly
  if (window.Blob && window.URL && window.URL.createObjectURL) {
      var csvData = new Blob([BOM + text], {
          type: 'text/csv'
      });
      return URL.createObjectURL(csvData);
  } else {
      return 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text);
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。