getFileAsync вызывает сбой Excel - PullRequest
       9

getFileAsync вызывает сбой Excel

0 голосов
/ 30 декабря 2018

Я создаю надстройку office-js для Excel.Мне нужно загрузить текущую рабочую книгу на внутренний сервер.Я реализовал пример из документации Micrsoft, который, кажется, работает нормально при первом вызове, но при последующих вызовах вызывает сбой Excel.Я использую Excel 365 версии 1812 (сборка 11126.20132)

Вот ссылка на пример в документации MS: https://docs.microsoft.com/en-us/javascript/api/office/office.document

На этой странице есть много примеров, чтобы найтиЯ работаю по поиску «Следующий пример получает документ в Office Open XML». Я включил приведенный ниже пример для простоты использования.

Код просто получает текущий файл и выводит символы вжурнал консоли.Он отлично работает в первый раз, но завершает работу Excel во второй раз - после того, как он показал длину FileContent.

export function getDocumentAsCompressed() {
    Office.context.document.getFileAsync(Office.FileType.Compressed, { sliceSize: 65536 /*64 KB*/ },
        function (result) {
            if (result.status == "succeeded") {
                // If the getFileAsync call succeeded, then
                // result.value will return a valid File Object.
                var myFile = result.value;
                var sliceCount = myFile.sliceCount;
                var slicesReceived = 0, gotAllSlices = true, docdataSlices = [];
                console.log("File size:" + myFile.size + " #Slices: " + sliceCount);

                // Get the file slices.
                getSliceAsync(myFile, 0, sliceCount, gotAllSlices, docdataSlices, slicesReceived);
            }else {
                console.log("Error:", result.error.message);
            }
    });
}

function getSliceAsync(file, nextSlice, sliceCount, gotAllSlices, docdataSlices, slicesReceived) {
    file.getSliceAsync(nextSlice, function (sliceResult) {
        if (sliceResult.status == "succeeded") {
            if (!gotAllSlices) { // Failed to get all slices, no need to continue.
                return;
            }

            // Got one slice, store it in a temporary array.
            // (Or you can do something else, such as
            // send it to a third-party server.)
//            console.log("file part",sliceResult.value.data)
            docdataSlices[sliceResult.value.index] = sliceResult.value.data;
            if (++slicesReceived == sliceCount) {
              // All slices have been received.
              file.closeAsync();
              onGotAllSlices(docdataSlices);
            }
            else {
                getSliceAsync(file, ++nextSlice, sliceCount, gotAllSlices, docdataSlices, slicesReceived);
            }
        }
            else {
                gotAllSlices = false;
                file.closeAsync();
                console.log("getSliceAsync Error:", sliceResult.error.message);
            }
    });
}

function onGotAllSlices(docdataSlices) {
    var docdata = [];
    for (var i = 0; i < docdataSlices.length; i++) {
        docdata = docdata.concat(docdataSlices[i]);
    }

    var fileContent = new String();
    for (var j = 0; j < docdata.length; j++) {
        fileContent += String.fromCharCode(docdata[j]);
    }

   console.log("fileContent.length",fileContent.length)

    // Now all the file content is stored in 'fileContent' variable,
    // you can do something with it, such as print, fax...
}

Вот результат

File size:21489 #Slices: 1
fileContent.length 21489

Оригинальный пример из документации Microsoft (https://docs.microsoft.com/en-us/javascript/api/office/office.document)

// The following example gets the document in Office Open XML ("compressed") format in 65536 bytes (64 KB) slices.
// Note: The implementation of app.showNotification in this example is from the Visual Studio template for Office Add-ins.
function getDocumentAsCompressed() {
    Office.context.document.getFileAsync(Office.FileType.Compressed, { sliceSize: 65536 /*64 KB*/ }, 
        function (result) {
            if (result.status == "succeeded") {
            // If the getFileAsync call succeeded, then
            // result.value will return a valid File Object.
            var myFile = result.value;
            var sliceCount = myFile.sliceCount;
            var slicesReceived = 0, gotAllSlices = true, docdataSlices = [];
            app.showNotification("File size:" + myFile.size + " #Slices: " + sliceCount);

            // Get the file slices.
            getSliceAsync(myFile, 0, sliceCount, gotAllSlices, docdataSlices, slicesReceived);
            }
            else {
            app.showNotification("Error:", result.error.message);
            }
    });
}

function getSliceAsync(file, nextSlice, sliceCount, gotAllSlices, docdataSlices, slicesReceived) {
    file.getSliceAsync(nextSlice, function (sliceResult) {
        if (sliceResult.status == "succeeded") {
            if (!gotAllSlices) { // Failed to get all slices, no need to continue.
                return;
            }

            // Got one slice, store it in a temporary array.
            // (Or you can do something else, such as
            // send it to a third-party server.)
            docdataSlices[sliceResult.value.index] = sliceResult.value.data;
            if (++slicesReceived == sliceCount) {
              // All slices have been received.
              file.closeAsync();
              onGotAllSlices(docdataSlices);
            }
            else {
                getSliceAsync(file, ++nextSlice, sliceCount, gotAllSlices, docdataSlices, slicesReceived);
            }
        }
            else {
                gotAllSlices = false;
                file.closeAsync();
                app.showNotification("getSliceAsync Error:", sliceResult.error.message);
            }
    });
}

function onGotAllSlices(docdataSlices) {
    var docdata = [];
    for (var i = 0; i < docdataSlices.length; i++) {
        docdata = docdata.concat(docdataSlices[i]);
    }

    var fileContent = new String();
    for (var j = 0; j < docdata.length; j++) {
        fileContent += String.fromCharCode(docdata[j]);
    }

    // Now all the file content is stored in 'fileContent' variable,
    // you can do something with it, such as print, fax...
}

// The following example gets the document in PDF format.
Office.context.document.getFileAsync(Office.FileType.Pdf,
    function(result) {
        if (result.status == "succeeded") {
            var myFile = result.value;
            var sliceCount = myFile.sliceCount;
            app.showNotification("File size:" + myFile.size + " #Slices: " + sliceCount);
            // Now, you can call getSliceAsync to download the files,
            // as described in the previous code segment (compressed format).

            myFile.closeAsync();
        }
        else {
            app.showNotification("Error:", result.error.message);
        }
}
);

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Поскольку вы используете Excel, пробовали ли вы CreateWorkbork API ?Может быть хорошим решением, если в Document API есть ошибка, как указано ранее в Xuanzhou.

Вот фрагмент кода CreateDocument , который можно загрузить в Script Lab .В нем показано, как создать копию рабочей книги на основе существующего файла.

Надеюсь, что все это полезно.

0 голосов
/ 03 января 2019

У нас уже есть исправление для этого.Но исправить все же нужно некоторое время, чтобы перейти к производству.Пожалуйста, попробуйте через несколько дней и дайте мне знать, если проблема все еще существует.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...