So analysieren Sie Excel-Dateien in Javascript / HTML5

136

Ich kann Excel-Dateien über lesen, FileReaderaber es gibt sowohl Text als auch seltsame Zeichen aus. Ich muss lesenxls Datei zeilenweise lesen, Daten in jeder Spalte lesen und in JSON konvertieren.

Wie lese ich xls Datei Zeile für Zeile?

ducktyped
quelle
1
Mögliches Duplikat von Wie lese ich den Inhalt einer Excel-Datei auf der Clientseite?
Einige Programmierer Typ
1
@ JoachimPileborg: Dies beantwortet die Frage nicht. Ich muss die Excel-Datei Zeile für Zeile lesen. Ich kann es zwar mit FileReader (HTML5) lesen, aber immer noch nicht in der Lage, Zeilen zu durchsuchen.
ducktyped

Antworten:

104

Die folgende Funktion konvertiert die Excel-Daten (XLSX-Format) in JSON. Sie können der Funktion ein Versprechen hinzufügen.

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

Hat der folgende Beitrag den Code für XLS-Format Excel zu JSON Javascript-Code?

Peru
quelle
1
es stürzt bei größeren Excel-Dateien in Chrome ab, gibt es dafür eine gute Lösung?
Zed
Darf ich wissen, wie groß Ihre Datei ist?
Peru
6
e.target.result () sollte e.target.result sein, siehe developer.mozilla.org/en-US/docs/Web/API/FileReader/onload
user227353
3
Für mich musste ich vorher ein jszip.jsSkript deklarieren xlsx.js.
Florin Vîrdol
1
Wie kann ich json_object einer öffentlichen Variablen zuweisen und außerhalb der for-Schleife darauf zugreifen?
Shardul
109

Alte Frage, aber ich sollte beachten, dass die allgemeine Aufgabe, XLS-Dateien aus Javascript zu analysieren, mühsam und schwierig, aber nicht unmöglich ist.

Ich habe grundlegende Parser in reinem JS implementiert:

Beide Seiten sind HTML5-Datei-API-gesteuerte XLS / XLSX-Parser (Sie können Ihre Datei per Drag & Drop verschieben und die Daten in den Zellen in einer durch Kommas getrennten Liste ausdrucken). Sie können auch JSON-Objekte generieren (vorausgesetzt, die erste Zeile ist eine Kopfzeile).

Die Testsuite http://oss.sheetjs.com/ zeigt eine Version, die XHR zum Abrufen und Analysieren von Dateien verwendet.

SheetJS
quelle
4
Wenn Sie der Antwort einen Beispielcode hinzufügen könnten, wäre dies viel besser (fügen Sie auch einen Diaclaimer hinzu, wenn Sie der Bibliotheksleiter sind).
Acdcjunior
3
Ich habe über dieses psjinx.com/programming/2014/01/04/… gebloggt :)
pankaj28843
Können wir mit JS-XLSX einige oberste Zeilen und Spalten von xlsx überspringen?
Mayank
18

Laden Sie eine excel filehier hoch und Sie können die Daten im JSONFormat erhalten in 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>

Dies ist eine Kombination der folgenden StackoverflowBeiträge:

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

Viel Glück...

Akash
quelle
14

Dieser Code kann Ihnen helfen
Meistens funktioniert jszip.js nicht. Fügen Sie daher xlsx.full.min.js in Ihren js-Code ein.

HTML Quelltext

 <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]);
    };
afzalriz304
quelle
Was ist, wenn ich auch Bilder in Excel Sheet hochladen möchte
Mayur Agarwal
9

Wenn Sie eine * .xlsx-Datei in einem Browser auf einfachste und kleinste Weise lesen möchten, kann diese Bibliothek Folgendes tun:

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.
  })
})

Im obigen Beispiel datahandelt es sich um rohe Zeichenfolgendaten. Es kann mit einem strengen Schema durch Übergeben eines schemaArguments in JSON analysiert werden . Ein Beispiel hierfür finden Sie in den API-Dokumenten.

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

Katamphetamin
quelle
4

Vielen Dank für die Antwort oben. Ich denke, der Umfang (der Antworten) ist abgeschlossen, aber ich möchte einen "Reaktionsweg" für jeden hinzufügen, der "Reagieren" verwendet.

Erstellen Sie eine Datei mit dem Namen 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)}/>
        );
    }
}

Dann können Sie die Komponente in der Rendermethode wie folgt verwenden:

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

<ImportData/>würde die Daten in ihren eigenen Zustand einstellen, können Sie Excel - Daten in der „Stammkomponente“ durch folgenden Zugriff auf diese :

Die Tore von Zion
quelle
Ich denke, das Tag in der return-Anweisung sollte <ImportData/>statt sein <importData/>. Ich bin ziemlich neu in React, aber ich glaube, dass Komponentennamen immer groß geschrieben werden. In jedem Fall ist dies der Name, der beim Importieren im Beispiel verwendet wird.
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>

Amin
quelle
0

Wenn Sie sich jemals fragen, wie Sie eine Datei vom Server lesen können, kann dieser Code hilfreich sein.

Beschränkungen :

  1. Die Datei sollte sich auf dem Server befinden (lokal / remote).
  2. Sie müssen Header einrichten oder das CORS Google Plugin haben.

<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>
Vijay Reddy
quelle
0

Fügen Sie die Dateien xslx.js, xlsx.full.min.js und jszip.js hinzu

Fügen Sie der Dateieingabe einen Onchange-Ereignishandler hinzu

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

}
vsnahar
quelle
-4

XLS ist ein binäres proprietäres Format, das von Microsoft verwendet wird. Das Parsen von XLS mit serverseitigen Sprachen ist sehr schwierig, ohne eine bestimmte Bibliothek oder Office Interop zu verwenden. Dies mit Javascript zu tun ist unmöglich. Dank der HTML5-Datei-API können Sie den binären Inhalt lesen. Um ihn jedoch zu analysieren und zu interpretieren, müssen Sie sich mit den Spezifikationen des XLS-Formats befassen . Ab Office 2007 hat Microsoft die Open XML- Dateiformate ( xslxfür Excel) übernommen, die ein Standard sind.

Darin Dimitrov
quelle
@ducktyped, mir ist kein Javascript-Code bekannt, der eine binäre Excel-Datei liest.
Darin Dimitrov
13
Unmögliche Mission? Ich bezweifle das. Wenn wir den Linux-Kernel in clientseitigem Javascript ausführen können, sollte es möglich sein, eine binäre Excel-Datei zu analysieren. Es ist nur so, dass es meines Wissens noch niemand getan hat.
JP Richardson
Hier ist die Dokumentation für neugierige ms xls Struktur msdn.microsoft.com/en-us/library/office/…
djra
-5

var excel = neues 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");

wenn Sie das Blatt haben. Sie können VBA-Funktionen wie in Excel verwenden.

i100
quelle
6
Dies funktioniert nur mit "unserem lieben Freund" IE. Und ich muss HTML5 verwenden. Ich muss nur den tatsächlichen Textinhalt Zeile für Zeile durchsuchen.
ducktyped