Excel dosyası Javascript / HTML5'te nasıl ayrıştırılır


136

Excel dosyasını okuyabiliyorum, FileReaderancak metin ve onunla birlikte garip karakterler çıkarıyor. Okumam lazımxls her sütunda dosya sıra sıra, okunan veri ve JSON dönüştürmek.

Xls dosyası satır satır nasıl okunur?



1
@JoachimPileborg: Bu soruya cevap vermiyor. Excel dosyasını satır satır okumam gerekiyor. Yine de FileReader (HTML5) kullanarak okuyabilsem de satırlara göz atamıyorum.
ducktyped

Yanıtlar:


105

Aşağıdaki İşlev, Excel sayfası (XLSX biçimi) verilerini JSON'a dönüştürür. işleve söz ekleyebilirsiniz.

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

Aşağıdaki yazıda XLS formatı Excel'den JSON'a javascript kodu var mı?


1
Chrome'daki daha büyük excel dosyaları için çöküyor, bunun için iyi bir çözüm var mı?
Zed

Dosyanızın ne kadar büyük olduğunu öğrenebilir miyim?
Peru

6
e.target.result () e.target.result olmalıdır, bkz. developer.mozilla.org/en-US/docs/Web/API/FileReader/onload
user227353

3
Benim için jszip.jssenaryoyu önceden ilan etmem gerekiyordu xlsx.js.
Florin Vîrdol

1
Json_object'i genel değişkene nasıl atayabilir ve for döngüsünün dışında ona nasıl erişebilirim?
Shardul

109

Eski soru, ancak XLS dosyalarını javascript'ten ayrıştırmanın genel görevinin sıkıcı ve zor olduğunu ancak imkansız olmadığını belirtmeliyim.

Saf JS'de uygulanan temel ayrıştırıcılarım var:

Her iki sayfa da HTML5 Dosyası API'sine dayalı XLS / XLSX ayrıştırıcılarıdır (dosyanızı sürükleyip bırakabilirsiniz ve hücrelerdeki verileri virgülle ayrılmış bir listede yazdırır). Ayrıca JSON nesneleri de oluşturabilirsiniz (ilk satırın bir başlık satırı olduğu varsayılarak).

Http://oss.sheetjs.com/ test paketi , dosyaları almak ve ayrıştırmak için XHR kullanan bir sürümü gösterir.


4
Cevaba bazı örnek kodlar ekleyebilseydiniz, bu çok daha iyi olur (kitaplık lideriyseniz ayrıca bir diaclaimer ekleyin).
acdcjunior


JS-XLSX ile xlsx'in birkaç üst satırını ve sütununu atlayabilir miyiz?
mayank

19

excel fileBuraya bir yükleyin ve verileri şu JSONformatta alabilirsiniz 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>

Bu, aşağıdaki Stackoverflowgönderilerin bir kombinasyonudur :

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

İyi şanslar...


14

Bu kod size yardımcı olabilir
böylece js kodunda xlsx.full.min.js dahil çalışmıyor zaman jszip.js çoğu.

HTML Kodu

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

Peki ya excel sayfasındaki resimleri de yüklemek istersem
Mayur Agarwal

9

Bir tarayıcıda * .xlsx dosyasını okumanın en basit ve en küçük yolunu istiyorsanız, bu kitaplık şunları yapabilir:

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

Yukarıdaki örnekte dataham dize verileri bulunmaktadır. Bu geçirerek sıkı şema ile JSON çözümlenebilir schemaargüman. Bunun bir örneği için API belgelerine bakın.

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


4

Yukarıdaki cevap için teşekkür ederim, sanırım (cevapların) kapsamı tamamlandı, ancak react kullanan her kimse için bir "tepki yolu" eklemek istiyorum.

İmportData.js adlı bir dosya oluşturun:

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

Ardından, oluşturma yöntemindeki bileşeni şu şekilde kullanabilirsiniz:

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

<ImportData/>kendi durumuna verileri belirleyecek şunlara "ana bileşeni" Excel verilerine erişebilir bu :


Bence return ifadesindeki etiket <ImportData/>yerine olmalıdır <importData/>. React konusunda oldukça yeniyim ancak bileşen adlarının her zaman büyük harfle yazıldığına inanıyorum. Her durumda, örnekte içe aktarılırken kullanılan ad budur.
raben

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

Bir dosyayı sunucudan nasıl okuyacağınızı merak ediyorsanız, bu kod yardımcı olabilir.

Kısıtlamalar:

  1. Dosya sunucuda (Yerel / Uzak) olmalıdır.
  2. Başlıkları ayarlamanız veya CORS google eklentisine sahip olmanız gerekir.

<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

xslx.js, xlsx.full.min.js, jszip.js'yi dahil edin

dosya girişine bir onchange olay işleyicisi ekleyin

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, Microsoft tarafından kullanılan ikili tescilli bir biçimdir. XLS'yi sunucu tarafı dilleriyle ayrıştırmak, belirli bir kitaplık veya Office Interop kullanmadan çok zordur. Bunu javascript ile yapmak görev imkansızdır. HTML5 Dosya API'si sayesinde ikili içeriğini okuyabilirsiniz, ancak onu ayrıştırmak ve yorumlamak için XLS formatının özelliklerine dalmanız gerekir . Office 2007'den başlayarak Microsoft , bir standart olan Açık XML dosya biçimlerini ( xslxExcel için) benimsedi .


@ducktyped, ikili Excel dosyasını okuyan herhangi bir javascript kodunu bilmiyorum veya görmedim.
Darin Dimitrov

13
İmkansız görev? Şüpheliyim. Linux çekirdeğini istemci tarafı javascript'te çalıştırabilirsek, ikili bir Excel dosyasını ayrıştırmak mümkün olmalıdır. Sadece bildiğim kadarıyla kimse bunu henüz yapmadı.
JP Richardson

İşte meraklı ms xls yapısı msdn.microsoft.com/en-us/library/office/…
djra

-5

var excel = new ActiveXObject ("Excel.Application"); var kitap = excel.Workbooks.Open (your_full_file_name_here.xls); var sayfa = kitap.Sayfa.Item (1); var value = page.Range ("A1");

çarşafın olduğunda. Excel'de yaptığınız gibi VBA işlevlerini kullanabilirsiniz.


6
bu sadece "sevgili dostumuz" IE ile çalışır. Ve HTML5 kullanmam gerekiyor. Sadece gerçek metin içeriğine satır satır göz atmam gerekiyor.
07:47
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.