如何在Javascript/HTML5中解析Excel文件

duc*_*ped 110 javascript html5 json xls filereader

我能够通过读取Excel文件,FileReader但它输出文本以及奇怪的字符.我需要xls逐行读取文件,读取每列中的数据并将其转换为JSON.

有谁知道如何逐行读取xls文件.

任何帮助将受到高度赞赏.

She*_*tJS 103

老问题,但我应该注意,从javascript解析XLS文件的一般任务是繁琐而困难但并非不可能.

我在纯JS中实现了基本的解析器:

这两个页面都是HTML5文件API驱动的XLS/XLSX解析器(您可以拖放文件,它将以逗号分隔的列表打印出单元格中的数据).您还可以生成JSON对象(假设第一行是标题行).

测试套件http://oss.sheetjs.com/显示了一个使用XHR来获取和解析文件的版本.

  • 如果你可以在答案中添加一些示例代码,那么它会更好(如果你是图书馆的领导者,还可以添加一个diaclaimer). (4认同)
  • 我在博客上写了这篇http://psjinx.com/programming/2014/01/04/parsing-excel-workbooks-using-javascript/ :) (3认同)

小智 84

下面的函数将Excel工作表(XLSX格式)数据转换为JSON.你可以添加函数的承诺.

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
var ExcelToJSON = function() {

  this.parseExcel = function(file) {
    var reader = new FileReader();

    reader.onload = function(e) {
      var data = e.target.result;
      var workbook = XLSX.read(data, {
        type: 'binary'
      });

      workbook.SheetNames.forEach(function(sheetName) {
        // Here is your object
        var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
        var json_object = JSON.stringify(XL_row_object);
        console.log(json_object);

      })

    };

    reader.onerror = function(ex) {
      console.log(ex);
    };

    reader.readAsBinaryString(file);
  };
};
</script>
Run Code Online (Sandbox Code Playgroud)

以下帖子有XLS格式Excel到JSON javascript代码的代码?

  • e.target.result()应该是e.target.result,请参阅https://developer.mozilla.org/en-US/docs/Web/API/FileReader/onload (6认同)
  • 对我来说,我必须在`xlsx.js`之前声明`jszip.js`脚本. (3认同)
  • 如何将 json_object 分配给公共变量并在 for 循环之外访问它? (2认同)

小智 13

这段代码可以帮助你
大多数时候jszip.js没有工作,所以在你的js代码中包含xlsx.full.min.js.

Html代码

 <input type="file" id="file" ng-model="csvFile"  
    onchange="angular.element(this).scope().ExcelExport(event)"/>
Run Code Online (Sandbox Code Playgroud)

使用Javascript

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.10.8/xlsx.full.min.js">
</script>

$scope.ExcelExport= function (event) {


    var input = event.target;
    var reader = new FileReader();
    reader.onload = function(){
        var fileData = reader.result;
        var wb = XLSX.read(fileData, {type : 'binary'});

        wb.SheetNames.forEach(function(sheetName){
        var rowObj =XLSX.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);
        var jsonObj = JSON.stringify(rowObj);
        console.log(jsonObj)
        })
    };
    reader.readAsBinaryString(input.files[0]);
    };
Run Code Online (Sandbox Code Playgroud)


asd*_*ads 11

如果您想要在浏览器中以最简单和最小的方式读取 *.xlsx 文件,那么这个库可能会这样做:

https://catamphetamine.github.io/read-excel-file/

<input type="file" id="input" />
Run Code Online (Sandbox Code Playgroud)
import readXlsxFile from 'read-excel-file'

const input = document.getElementById('input')

input.addEventListener('change', () => {
  readXlsxFile(input.files[0]).then((data) => {
    // `data` is an array of rows
    // each row being an array of cells.
  })
})
Run Code Online (Sandbox Code Playgroud)

在上面的例子中data是原始字符串数据。可以通过传递schema参数将其解析为具有严格模式的 JSON 。有关示例,请参阅 API 文档。

API 文档:http : //npmjs.com/package/read-excel-file


Aka*_*ash 8

上传excel file此处,您可以获取以下JSON格式的数据console:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    var ExcelToJSON = function() {

      this.parseExcel = function(file) {
        var reader = new FileReader();

        reader.onload = function(e) {
          var data = e.target.result;
          var workbook = XLSX.read(data, {
            type: 'binary'
          });
          workbook.SheetNames.forEach(function(sheetName) {
            // Here is your object
            var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
            var json_object = JSON.stringify(XL_row_object);
            console.log(JSON.parse(json_object));
            jQuery( '#xlx_json' ).val( json_object );
          })
        };

        reader.onerror = function(ex) {
          console.log(ex);
        };

        reader.readAsBinaryString(file);
      };
  };

  function handleFileSelect(evt) {
    
    var files = evt.target.files; // FileList object
    var xl2json = new ExcelToJSON();
    xl2json.parseExcel(files[0]);
  }


 
</script>

<form enctype="multipart/form-data">
    <input id="upload" type=file  name="files[]">
</form>

    <textarea class="form-control" rows=35 cols=120 id="xlx_json"></textarea>

    <script>
        document.getElementById('upload').addEventListener('change', handleFileSelect, false);

    </script>
Run Code Online (Sandbox Code Playgroud)

这是以下Stackoverflow帖子的组合:

  1. /sf/answers/2595856091/
  2. /sf/answers/2766109251/

祝好运...


小智 7

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    var ExcelToJSON = function() {

      this.parseExcel = function(file) {
        var reader = new FileReader();

        reader.onload = function(e) {
          var data = e.target.result;
          var workbook = XLSX.read(data, {
            type: 'binary'
          });
          workbook.SheetNames.forEach(function(sheetName) {
            // Here is your object
            var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
            var json_object = JSON.stringify(XL_row_object);
            console.log(JSON.parse(json_object));
            jQuery( '#xlx_json' ).val( json_object );
          })
        };

        reader.onerror = function(ex) {
          console.log(ex);
        };

        reader.readAsBinaryString(file);
      };
  };

  function handleFileSelect(evt) {
    
    var files = evt.target.files; // FileList object
    var xl2json = new ExcelToJSON();
    xl2json.parseExcel(files[0]);
  }


 
</script>

<form enctype="multipart/form-data">
    <input id="upload" type=file  name="files[]">
</form>

    <textarea class="form-control" rows=35 cols=120 id="xlx_json"></textarea>

    <script>
        document.getElementById('upload').addEventListener('change', handleFileSelect, false);

    </script>
Run Code Online (Sandbox Code Playgroud)


The*_*ion 5

感谢您提供上述答案,我认为(答案)范围已完成,但我想为使用 react 的任何人添加“反应方式”。

创建一个名为 importData.js 的文件:

import React, {Component} from 'react';
import XLSX from 'xlsx';
export default class ImportData extends Component{
    constructor(props){
        super(props);
        this.state={
            excelData:{}
        }
    }
    excelToJson(reader){
        var fileData = reader.result;
        var wb = XLSX.read(fileData, {type : 'binary'});
        var data = {};
        wb.SheetNames.forEach(function(sheetName){
             var rowObj =XLSX.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);
             var rowString = JSON.stringify(rowObj);
             data[sheetName] = rowString;
        });
        this.setState({excelData: data});
    }
    loadFileXLSX(event){
        var input = event.target;
        var reader = new FileReader();
        reader.onload = this.excelToJson.bind(this,reader);
        reader.readAsBinaryString(input.files[0]);
    }
    render(){
        return (
            <input type="file" onChange={this.loadFileXLSX.bind(this)}/>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在渲染方法中使用该组件,例如:

import ImportData from './importData.js';
import React, {Component} from 'react';
class ParentComponent extends Component{
    render(){
        return (<ImportData/>);
    }
}
Run Code Online (Sandbox Code Playgroud)

<ImportData/>将数据设置为自己的状态,就可以通过Excel中的数据“父组件”按照这个