Cách phân tích tệp Excel trong Javascript / HTML5


136

Tôi có thể đọc tệp Excel qua FileReadernhưng nó xuất ra văn bản cũng như các ký tự lạ với nó. Tôi cần đọcxls hàng theo tệp, đọc dữ liệu trong mỗi cột và chuyển đổi nó thành JSON.

Làm thế nào để đọc xls tập tin theo hàng?



1
@JoachimPileborg: điều này không trả lời câu hỏi. Tôi cần đọc tệp excel theo từng hàng. Mặc dù tôi có thể đọc nó bằng FileReader (HTML5) nhưng vẫn không thể duyệt các hàng.
vịt trời

Câu trả lời:


104

Hàm bên dưới chuyển đổi dữ liệu bảng Excel (định dạng XLSX) thành JSON. bạn có thể thêm lời hứa cho chức năng.

<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>

Bài viết dưới đây có mã cho định dạng XLS Excel sang mã javascript?


1
Nó gặp sự cố đối với các tệp excel lớn hơn trong chrome, giải pháp nào tốt cho điều đó?
Zed

Tôi có thể biết tập tin của bạn lớn hơn không?
Peru

6
e.target.result () nên là e.target.result xem developer.mozilla.org/en-US/docs/Web/API/FileReader/onload
user227353

3
Đối với tôi, tôi đã phải khai báo jszip.jskịch bản trước đó xlsx.js.
Florin Vîrdol

1
Làm cách nào tôi có thể gán json_object cho biến công khai và truy cập nó bên ngoài vòng lặp for?
Shardul

109

Câu hỏi cũ, nhưng tôi cần lưu ý rằng nhiệm vụ chung của việc phân tích tệp XLS từ javascript là tẻ nhạt và khó khăn nhưng không phải là không thể.

Tôi có các trình phân tích cú pháp cơ bản được triển khai trong JS thuần túy:

Cả hai trang đều là trình phân tích cú pháp XLS / XLSX dựa trên API tệp (bạn có thể kéo thả tệp của mình xuống và nó sẽ in ra dữ liệu trong các ô trong danh sách được phân tách bằng dấu phẩy). Bạn cũng có thể tạo các đối tượng JSON (giả sử hàng đầu tiên là hàng tiêu đề).

Bộ kiểm tra http://oss.sheetjs.com/ hiển thị phiên bản sử dụng XHR để nhận và phân tích tệp.


4
Nếu bạn có thể thêm một số mã mẫu vào câu trả lời, nó sẽ làm cho nó tốt hơn nhiều (cũng thêm một dấu phụ nếu bạn là người lãnh đạo thư viện).
acdcjunior

3
Tôi đã viết blog về psjinx.com/programming/2014/01/04/ trên :)
pankaj28843

chúng ta có thể bỏ qua vài hàng và cột hàng đầu của xlsx với JS-XLSX không?
mayank

18

Tải lên excel filetại đây và bạn có thể lấy dữ liệu ở JSONđịnh dạng 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>

Đây là sự kết hợp của các Stackoverflowbài viết sau :

  1. https://stackoverflow.com/a/37083658/4742733
  2. https://stackoverflow.com/a/39515846/4742733

Chúc may mắn...


14

Mã này có thể giúp bạn
Hầu hết thời gian jszip.js không hoạt động, vì vậy hãy bao gồm xlsx.full.min.js trong mã js của bạn.

Mã HTML

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

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]);
    };

Nếu tôi muốn tải lên hình ảnh trong bảng excel thì sao
Mayur Agarwal

9

Nếu bạn muốn cách đơn giản nhất và nhỏ nhất để đọc tệp * .xlsx trong trình duyệt thì thư viện này có thể thực hiện:

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

<input type="file" id="input" />
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.
  })
})

Trong ví dụ trên datalà dữ liệu chuỗi thô. Nó có thể được phân tích cú pháp thành JSON với một lược đồ nghiêm ngặt bằng cách chuyển schemađối số. Xem tài liệu API để biết ví dụ về điều đó.

Tài liệu API: http://npmjs.com/package/read-excel-file


4

Cảm ơn bạn đã trả lời ở trên, tôi nghĩ rằng phạm vi (câu trả lời) đã hoàn thành nhưng tôi muốn thêm một "cách phản ứng" cho bất cứ ai sử dụng phản ứng.

Tạo một tệp có tên là 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)}/>
        );
    }
}

Sau đó, bạn có thể sử dụng thành phần trong phương thức kết xuất như:

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

<ImportData/>sẽ thiết lập dữ liệu trạng thái riêng của mình, bạn có thể truy cập dữ liệu Excel trong "thành phần cha mẹ" bằng cách làm theo này :


Tôi nghĩ rằng thẻ trong tuyên bố trở lại nên được <ImportData/>thay vì <importData/>. Tôi còn khá mới với React nhưng tôi tin rằng tên thành phần luôn được viết hoa. Trong mọi trường hợp, đó là tên được sử dụng khi nhập trong ví dụ.
rhaben

3

<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>


0

Nếu bạn đang tự hỏi làm thế nào để đọc một tập tin từ máy chủ thì mã này có thể hữu ích.

Những hạn chế :

  1. Tệp phải ở trong máy chủ (Cục bộ / Từ xa).
  2. Bạn sẽ phải thiết lập các tiêu đề hoặc có plugin google CORS.

<Head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script lang="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.12.4/xlsx.core.min.js"></script>
</head>

<body>
    <script>
    /* set up XMLHttpRequest */


    // replace it with your file path in local server
    var url = "http://localhost/test.xlsx";

    var oReq = new XMLHttpRequest();
    oReq.open("GET", url, true);
    oReq.responseType = "arraybuffer";

    oReq.onload = function(e) {
        var arraybuffer = oReq.response;

        /* convert data to binary string */
        var data = new Uint8Array(arraybuffer);

        var arr = new Array();
        for (var i = 0; i != data.length; ++i) {
            arr[i] = String.fromCharCode(data[i]);
        }

        var bstr = arr.join("");

        var cfb = XLSX.read(bstr, { type: 'binary' });

        cfb.SheetNames.forEach(function(sheetName, index) {

            // Obtain The Current Row As CSV
            var fieldsObjs = XLS.utils.sheet_to_json(cfb.Sheets[sheetName]);

            fieldsObjs.map(function(field) {
                $("#my_file_output").append('<input type="checkbox" value="' + field.Fields + '">' + field.Fields + '<br>');
            });

        });
    }

    oReq.send();
    </script>
</body>
<div id="my_file_output">
</div>

</html>

0

bao gồm xslx.js, xlsx.full.min.js, jszip.js

thêm một trình xử lý sự kiện onchange vào đầu vào tệp

function showDataExcel(event)
{
            var file = event.target.files[0];
            var reader = new FileReader();
            var excelData = [];
            reader.onload = function (event) {
                var data = event.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]);

                    for (var i = 0; i < XL_row_object.length; i++)
                    {
                        excelData.push(XL_row_object[i]["your column name"]);

                    }

                    var json_object = JSON.stringify(XL_row_object);
                    console.log(json_object);
                    alert(excelData);
                })

            };

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

            reader.readAsBinaryString(file);

}

-4

XLS là một định dạng độc quyền nhị phân được sử dụng bởi Microsoft. Phân tích cú pháp XLS bằng ngôn ngữ phía máy chủ là rất khó nếu không sử dụng một số thư viện cụ thể hoặc Office Interop. Làm điều này với javascript là nhiệm vụ bất khả thi. Nhờ API tệp HTML5, bạn có thể đọc nội dung nhị phân của nó nhưng để phân tích và giải thích nó, bạn sẽ cần đi sâu vào các thông số kỹ thuật của định dạng XLS . Bắt đầu từ Office 2007, Microsoft chấp nhận các định dạng tệp Open XML ( xslxđối với Excel) là một tiêu chuẩn.


@ducktyped, tôi không biết và cũng không thấy bất kỳ mã javascript nào đọc tệp nhị phân Excel.
Darin Dimitrov

13
Nhiệm vụ bất khả thi? Tôi nghi ngờ điều đó. Nếu chúng ta có thể chạy nhân Linux trong javascript phía máy khách, thì có thể phân tích tệp nhị phân Excel. Chỉ là không ai biết đến tôi đã làm điều đó.
JP Richardson

Dưới đây là tài liệu cho sự tò mò về cấu trúc ms xls msdn.microsoft.com/en-us/l
Library / office / từ

-5

var excel = new ActiveXObject ("Excel.Application"); var book = excel.Workbooks.Open (your_full_file_name_here.xls); var sheet = book.Sheets.Item (1); var value = sheet.Range ("A1");

khi bạn có tờ. Bạn có thể sử dụng các hàm VBA như bạn làm trong Excel.


6
Điều này chỉ hoạt động với "người bạn thân yêu của chúng tôi" IE. Và tôi cần sử dụng HTML5. Tôi chỉ cần duyệt nội dung văn bản thực tế theo từng hàng.
vịt trời
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.