3

我遇到了一个非常奇怪的问题,当我第三次尝试将 word 文档提取为压缩文件以便在我的 MS Word 任务窗格 MVC 应用程序中进行处理时,它会爆炸。

这是代码:

Office.context.document.getFileAsync(Office.FileType.Compressed, function (result) {
if (result.status == "succeeded") {
    var file = result.value;

    file.getSliceAsync(0, function (resultSlice) {
        //DO SOMETHING
    });
} else {
    //TODO: Service fault handling?
}
});

出现的错误代码是 5001。我不知道如何解决这个问题。

如果您对此有任何想法,请告诉我。

额外细节:

在此处输入图像描述

4

4 回答 4

6

来自 MSDN:

内存中最多允许两个文档;否则 getFileAsync操作将失败。使用完文件后,使用该File.closeAsync方法关闭文件。

确保File.closeAsync在再次阅读文件之前致电 - 这可以解释您所看到的问题。

更多信息:https ://msdn.microsoft.com/en-us/library/office/jj715284.aspx

于 2015-02-26T13:26:45.073 回答
2

我有一个关于如何正确使用这个 API 的例子。实际上,MSDN 中的当前示例不是很正确。此代码在 Word 中进行了测试。

// Usually we encode the data in base64 format before sending it to server.
function encodeBase64(docData) {
    var s = "";
    for (var i = 0; i < docData.length; i++)
        s += String.fromCharCode(docData[i]);
    return window.btoa(s);
}

// Call getFileAsync() to start the retrieving file process.
function getFileAsyncInternal() {
    Office.context.document.getFileAsync("compressed", { sliceSize: 10240 }, function (asyncResult) {
        if (asyncResult.status == Office.AsyncResultStatus.Failed) {
            document.getElementById("log").textContent = JSON.stringify(asyncResult);
        }
        else {
            getAllSlices(asyncResult.value);
        }
    });
}

// Get all the slices of file from the host after "getFileAsync" is done.
function getAllSlices(file) {
    var sliceCount = file.sliceCount;
    var sliceIndex = 0;
    var docdata = [];
    var getSlice = function () {
        file.getSliceAsync(sliceIndex, function (asyncResult) {
            if (asyncResult.status == "succeeded") {
                docdata = docdata.concat(asyncResult.value.data);
                sliceIndex++;
                if (sliceIndex == sliceCount) {
                    file.closeAsync();
                    onGetAllSlicesSucceeded(docdata);
                }
                else {
                    getSlice();
                }
            }
            else {
                file.closeAsync();
                document.getElementById("log").textContent = JSON.stringify(asyncResult);

            }
        });
    };
    getSlice();
}

// Upload the docx file to server after obtaining all the bits from host.
function onGetAllSlicesSucceeded(docxData) {
    $.ajax({
        type: "POST",
        url: "Handler.ashx",
        data: encodeBase64(docxData),
        contentType: "application/json; charset=utf-8",
    }).done(function (data) {
        document.getElementById("documentXmlContent").textContent = data;
    }).fail(function (jqXHR, textStatus) {
    });
}

您可以从这里找到更多信息: https ://github.com/pkkj/AppForOfficeSample/tree/master/GetFileAsync

希望这会有所帮助。

于 2015-01-03T02:58:32.803 回答
0

除了 Keyjing Peng 的回答(我觉得这很有帮助,谢谢!)我想我会分享 encodeBase64 的一个变体,如果你通过 REST 上传到 SharePoint,你不想这样做。在这种情况下,您希望将字节数组转换为 Uint8Array。只有这样我才能将它放入 SharePoint 库而不会损坏文件。

var uArray = new Uint8Array(docdata);

希望这对某人有所帮助,在网上其他任何地方都找不到此信息...

于 2016-08-18T11:07:11.920 回答
-1

请参阅此链接 http://msdn.microsoft.com/en-us/library/office/jj715284(v=office.1501401).aspx

它包含这个示例方法:

var i = 0;
var slices = 0;

function getDocumentAsPDF() {

Office.context.document.getFileAsync("pdf",{sliceSize: 2097152}, function (result) {
    if (result.status == "succeeded") {
        // If the getFileAsync call succeeded, then
        // result.value will return a valid File Object.
         myFile = result.value;
         slices = myFile.sliceCount;
         document.getElementById("result").innerText = " File size:" + myFile.size + " #Slices: " + slices;

         // Iterate over the file slices.
         for ( i = 0; i < slices; i++) {
             var slice = myFile.getSliceAsync(i, function (result) {
                 if (result.status == "succeeded") {  
                     doSomethingWithChunk(result.value.data);
                     if (slices == i) // Means it's done traversing...
                     {
                         SendFileComplete();
                     }
                 }
                 else
                     document.getElementById("result").innerText = result.error.message;
                 });
         }
         myFile.closeAsync();
    }
    else
        document.getElementById("result2").innerText = result.error.message;
});

}

将“pdf”更改为“compressed”并且需要创建方法调用 doSomethingWithChunk() 并且可能应该执行以下操作:

function base64Encode(str) {
        return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
            return String.fromCharCode('0x' + p1);
        }));
    }

我使用此技术成功保存到 Azure blob 存储。

显然,您也应该重命名该方法。

于 2014-12-22T20:45:18.897 回答