我正在开发一个需要访问整个文档的Office任务窗格应用程序。我知道有一个API getFileAsync()
https://msdn.microsoft.com/en-us/library/office/jj220084.aspx
Office.context.document.getFileAsync(fileType [, options], callback);
但是,fileType
只能是三个值:compressed
,pdf
,text
。
compressed
将Office Open XML(OOXML)格式的整个文档(.pptx或.docx)作为字节数组返回。
pdf
以PDF格式返回整个文档作为字节数组。
text
仅以字符串形式返回文档的文本。 (仅限Word)
当它为compressed
时,返回的值是一个字节数组。
我如何获得OOXml字符串?
或是否有用于选择文档中所有内容的API,以便我可以使用getSelectedDataAsync()
API?
答案 0 :(得分:1)
如果有人找到这个帖子,我设法使用zip.js解决了这个问题。
var dataByteArray = [];
function getDocumentAsOoxml() {
Office.context.document.getFileAsync("compressed", { sliceSize: 100000 }, function (result) {
if (result.status == Office.AsyncResultStatus.Succeeded) {
// Get the File object from the result.
var myFile = result.value;
var state = {
file: myFile,
counter: 0,
sliceCount: myFile.sliceCount
};
getSlice(state);
}
});
}
function getSlice(state) {
state.file.getSliceAsync(state.counter, function (result) {
if (result.status == Office.AsyncResultStatus.Succeeded) {
readSlice(result.value, state);
}
});
}
function readSlice(slice, state) {
var data = slice.data;
// If the slice contains data, create an HTTP request.
if (data) {
dataByteArray = dataByteArray.concat(data);
state.counter++;
if (state.counter < state.sliceCount) {
getSlice(state);
} else {
closeFile(state);
}
}
}
function closeFile(state) {
// Close the file when you're done with it.
state.file.closeAsync(function (result) { });
// convert from byte array to blob that can bre read by zip.js
var byteArray = new Uint8Array(dataByteArray);
var blob = new Blob([byteArray]);
// Load zip.js library
$.getScript("/Scripts/zip.js/zip.js", function () {
zip.workerScriptsPath = "/Scripts/zip.js/";
// use a BlobReader to read the zip from a Blob object
zip.createReader(new zip.BlobReader(blob), function (reader) {
// get all entries from the zip file
reader.getEntries(function (entries) {
if (entries.length > 0) {
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
// find the file you are looking for
if (entry.filename == 'word/document.xml') {
entry.getData(new zip.TextWriter(), function (text) {
// text contains the entry data as a String
doSomethingWithText(text);
// close the zip reader
reader.close(function () {
// onclose callback
});
}, function (current, total) {
// onprogress callback
});
break;
}
}
}
});
}, function (error) {
// onerror callback
});
});
}
希望将来会有更简单的方法。
答案 1 :(得分:0)
这有点晚了。
我最近一直在使用Task Pane应用程序,事实证明,OOXML是原生压缩的(除非我非常误)。
我最好的建议是弄清楚字符串编码的编码,然后用该编码类型进行解码。我愿意打赌它是UTF-8。