Преобразование листа Excel в JSON и отправка данных в список SharePoint - вместо этого получается пустой объект - PullRequest
2 голосов
/ 04 марта 2020

Я работаю над проектом, который должен принять загруженный файл Excel, преобразовать его в JSON и POST, который проанализировал информацию в список SharePoint. Запрос POST работает - когда я перезагружаю список SharePoint, загруженный элемент уже есть, но он возвращается пустым.

Короче говоря, данные, которые должны быть проанализированы, показываются пустыми. object.

Я также заметил, что в функции парсинга Excel большая часть кода пропускается, и я не уверен, почему. В приведенном ниже коде я указал, где это происходит.

Какие параметры мне нужно передать в xl2String (см. Ниже)?


HTML:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script lang="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.15.5/xlsx.full.min.js"></script>

<input class="getFile" id="getFile" type="file" name="files[]" multiple="multiple"/><br />

JS:

<script>
    const ExcelToJSON = function(files) {

        this.parseExcel = function(files) {
            let reader = new FileReader();

            reader.onload = function(e) { 
                let data = e.target.result; // this code is NOT reached
                    console.log("data: ", data)
                let workbook = XLSX.read(data, { type: 'binary' });

                workbook.SheetNames.forEach((sheetName) => {
                    let XL_row_object = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]);
                    let json_object = JSON.stringify(XL_row_object);

                    console.log(JSON.parse(json_object))

                    $('#jsonData').val(json_object);
                })

            } // reader.onload // debugger skips over

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

            // reader.readAsBinaryString(files); // tells JS to start reading the file
        } // this.parseExcel

    } // ExcelToJSON

    function handleFileSelect(evt) {
        let files = evt.target.files; // FileList object

            let xl2json = new ExcelToJSON(files);
                    xl2json.parseExcel(files[0]);
                    let xl2String = JSON.stringify(xl2json);

            let addlistItem = new AddItemToSPList();
                AddItemToSPList(xl2String[0].Title, xl2String[0].Location);
                console.log(xl2String) // empty obj...

//      let filteredByLocation = xl2json.map(e => e.Location == "New York");

        console.log(xl2String.Title); // empty obj

    }

    const AddItemToSPList = function(title, location) {
        let holidaysColumns = {
            "__metadata":{"type": "SP.Data.holidaysListItem"},
      "Title": title,
            "Location": location
        };

        let listName = "Test%20Holidays";
        return fetch("www.url.com/gc/_api/web/lists/getbytitle('" + listName + "')/items", {
            method: "POST",
            credentials: 'same-origin',
            body: JSON.stringify(holidaysColumns),
            headers: { 
                // etc            
            }
        }).then((response) => {
            $(".uploadSuccessFail").html("File was upload successfully.")
            console.log(response)
        }).catch((err) => {
            $(".uploadSuccessFail").html("Error: File upload unsuccessful.")
            console.log("Error: " + err);
        })
    }

</script>


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

1 Ответ

1 голос
/ 04 марта 2020

Меня немного смущает синтаксис, который вы используете, вы определили ExcelToJSON как конструктор объекта, но он содержит только один метод, который даже не использует параметр, который был передан либо конструктору, либо метод. onLoad никогда не выполняется, потому что reader.readAsBinaryString закомментирован, что является методом, запускающим загрузку файла. Вы пытаетесь захватить xl2json из parseExcel, но файл анализируется асинхронно, поэтому вам нужно будет использовать json в onLoad и сохранить ваш элемент в SharePoint из этого обратного вызова. Затем вы обрабатываете AddItemToSPList, как если бы он также был конструктором, но это просто функция, поэтому, скорее всего, ничего не будет делать.

У меня нет вашей XLSX утилиты, поэтому я не могу выполнить код, но это должно работать:

<script>
    function parseAndUploadFile(file) {
        let reader = new FileReader();

        reader.onload = function(e) { 
            let data = e.target.result; // this code is NOT reached
                console.log("data: ", data)
            let workbook = XLSX.read(data, { type: 'binary' });

            workbook.SheetNames.forEach((sheetName) => {
                let XL_row_object = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]);
                let json_object = JSON.stringify(XL_row_object);

                //console.log(JSON.parse(json_object))

                //$('#jsonData').val(json_object);

                if (XL_row_object && XL_row_object.Title && XL_row_object.Location) {
                    addItemToSPList(XL_row_object.Title, XL_row_object.Location);
                } else {
                    console.log('parsed json does not appear to have necessary values: ')
                    console.log(XL_row_object);
                }
            })

        } // reader.onload

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

        reader.readAsBinaryString(files); // tells JS to start reading the file
    } // ExcelToJSON

    function addItemToSPList(title, location) {
        let holidaysColumns = {
            "__metadata":{"type": "SP.Data.holidaysListItem"},
            "Title": title,
            "Location": location
        };

        let listName = "Test%20Holidays";
        return fetch("www.url.com/gc/_api/web/lists/getbytitle('" + listName + "')/items", {
            method: "POST",
            credentials: 'same-origin',
            body: JSON.stringify(holidaysColumns),
            headers: { 
                // etc            
            }
        }).then((response) => {
            $(".uploadSuccessFail").html("File was upload successfully.")
            console.log(response)
        }).catch((err) => {
            $(".uploadSuccessFail").html("Error: File upload unsuccessful.")
            console.log("Error: " + err);
        })
    }

    function handleFileSelect(evt) {
        let files = evt.target.files; // FileList object

        if (files.length > 0) {
            parseAndUploadFile(files[0]);
        }
    }
</script>


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