我如何将本地Excel文件数据传递到Javascript数组(用于谷歌图表)

How can I pass local Excel file data to Javascript array (for google charts)?

本文关键字:数组 Javascript 用于 谷歌 数据 文件 Excel      更新时间:2023-09-26

我有一个简单的问题,但我找不到一个简单的解决方案:

我有一个Excel文件(总是相同的),有几个工作表,非it同事希望能够更新,以便它也更新谷歌图表(或其他图表API,你可以建议我)网页。

(顺便说一下,我只需要每个工作表的某一部分,所以如果你知道一种方法,只提取我需要的,那将是伟大的:))

我想避免服务器端操作,但这可能是不可能的,因为我想读取本地文件。

我已经看过转换为JSON的方法,或者使用xlsx.js加载为base64字符串,但我发现没有什么简单的,我的同事可以很容易地使用。

非常感谢。

<标题>编辑

我找到了一种方法来做我想做的事情,所以如果它能帮助任何人:

首先,我把所有需要的数据放在一个csv文件中。

然后,我使用HTML5 FileAPI读取我用文件输入加载的csv文件。

最后,我使用cvstojson脚本来解析文件,然后将其传递给google graph dataTable我想要的方式。

然而,这只允许加载一次数据,所以我为文件输入使用了一个按钮样式的标签,在文件加载后触发一个隐藏的"重置"按钮(实际上克隆多于重置),所以现在它看起来像一个按钮,允许在我更改其中的数据后多次加载文件。我还使用了jQuery的localStorage来填充json。我知道这很乱,所以这里有一个代码摘录:

<div id="load">
    <button id="clear">Clear</button>
    <label id="forcvs" for="cvs" > Load data </label>
    <input type="file" id="cvs" onchange="handleFiles(this.files);" accept=".csv"><br/>
</div>

"handleFiles"函数指向cvstojson脚本:

var json = JSON.parse(localStorage.getItem('json'))
function handleFiles(files) {
    // Check for the various File API support.
    if (window.FileReader) {
        // FileReader are supported.
        getAsText(files[0]);
    } else {
        alert('FileReader are not supported in this browser.');
    }
}
function getAsText(fileToRead) {
    var reader = new FileReader();
    // Read file into memory as UTF-8      
    reader.readAsText(fileToRead);
    // Handle errors load
    reader.onload = loadHandler;
    reader.onerror = errorHandler;
}
function loadHandler(event) {
    var csv = event.target.result;
    processData(csv);          
}
function processData(csv) {
  object = $.csv.toObjects(csv, {separator:";"})
    drawOutput(object);
}
function errorHandler(evt) {
    if(evt.target.error.name == "NotReadableError") {
        alert("Canno't read file !");
    }
}
function drawOutput(object){
  json = object
  localStorage.setItem('json', JSON.stringify(json))
  drawChart()
  $( "#clear" ).trigger( "click" );
}

,然后在更新我的数据和绘制我的图表之前,我使用:

json = JSON.parse(localStorage.getItem('json'))

这是我使用的jquery的一个摘录:

var load = $('#cvs')
$('#clear').click(function () {
load.replaceWith(load = load.clone(true))
})

和CSS:

#cvs, #clear {
  display: none;
}

#forcvs {
  -webkit-appearance: button;
  -moz-appearance: button;
  appearance: button;
  line-height: 16px;
  padding: .2em .4em;
  margin: .2em;
}

希望它能帮助一些人,谢谢你的回复:)

您可以尝试Alasql JavaScript库将XLSX数据加载到JavaScript数组中,而无需任何复杂的编程。Alasql使用XLSX.js库处理Excel文件。

这是一个示例:

<script src="alasql.min.js"></script>
<script src='xlsx.core.min.js'></script>
<script>
    alasql('select * from xlsx("cities.xlsx",{headers:true, sheetid:"Sheet1", range:"A1:B6"})',
           [],function(data) {
                console.log(data);
    });
</script>

您可以在alasql.org站点运行此示例。

默认情况下,header选项为false,工作表为"Sheet1",范围-工作表上的所有单元格。

Alasql还支持TXT、TAB、CSV、JSON和XLS格式。您还可以生成XLSX文件from JavaScript array:

var stars = [{star:"Aldebaran"},{star:"Algol"},{star:"Vega"}];
alasql('SELECT * INTO XSLX("stars.xlsx",{headers:true}) FROM ?',[stars]);

您可以使用sheet.js读取系统excel文件而无需上传

$(document).ready( function() {
   var data = SheetName = '';
   var fileUrl = "data.xlsx";
   var oReq;
  if(window.XMLHttpRequest) oReq = new XMLHttpRequest();
   else if(window.ActiveXObject) oReq = new ActiveXObject('MSXML2.XMLHTTP.3.0');
   else throw "XHR unavailable for your browser";
   oReq.open("GET", fileUrl, true);
   if(typeof Uint8Array !== 'undefined') {
     oReq.responseType = "arraybuffer"; // Set response type
     oReq.onload = function(e) {
       if(typeof console !== 'undefined')
       var arraybuffer = oReq.response;
       var data = new Uint8Array(arraybuffer);
       var wb = XLSX.read(data, {type:"array"}); // Read file data
       toJson(wb);
    };
  }
  else {
    oReq.setRequestHeader("Accept-Charset", "x-user-defined"); 
    oReq.onreadystatechange = function() {
    if(oReq.readyState == 4 && oReq.status == 200) {
      var ff = convertResponseBodyToText(oReq.responseBody);
      if(typeof console !== 'undefined')
        var wb = XLSX.read(ff, {type:"binary"});
        toJson(wb);
      }
    };
 }
 oReq.send(); // sends request
 function toJson(excel) {
   SheetName = excel.SheetNames[0];
   excel.SheetNames.forEach(function(sheetName) {
    var json = XLSX.utils.sheet_to_json(excel.Sheets[sheetName]); // convert sheet into json format
    if( !json.length ) return false;
    data = json;
   });
}

});

您可以在这里获得更多帮助:

http://onegibi.com/programming/javascript-jquery-read-system-excel-file-without-uploading/