这个例子展示了如何在Scriptlab中,让用户选择一个文件(本例为一个图片),然后将这个图片的内容读取到内存中,并且根据需要插入到文档的任意位置。
为了让用户能够选择文件,需要在界面上放一个选择文件的控件。这就是一个`input` 元素,并且设置为 `file` 这个类型,本例因为只允许接受图片,所以可以设置 `accept` 为对应的图片格式,可以用逗号分开多个格式。下面内容在scriptlab的 `HTML` 这个页面定义。.
<input type="file" id="uploadFile" accept=".png" />
<button id="run" class="ms-Button">
<span class="ms-Button-label">Run</span>
</button>
然后编写如下的代码。这里用到了 FileReader这个对象,然后需要将文件读取到内存,并且转换为Base64的字符串,最后通过addImage方法插入到文档中。
$("#run").click(() => tryCatch(run));
async function run() {
await Excel.run(async (context) => {
let reader = new FileReader();
let file = (document.getElementById("uploadFile") as HTMLInputElement).files[0];
const sheet = context.workbook.worksheets.getActiveWorksheet();
reader.readAsArrayBuffer(file);
reader.onload = async (e) => {
let result = convertToBase64(e.target.result as ArrayBuffer);
let picture = sheet.shapes.addImage(result);
picture.top = 100;
picture.left = 200;
await context.sync();
};
});
}
/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
try {
await callback();
} catch (error) {
// Note: In a production add-in, you'd want to notify the user through your add-in's UI.
console.error(error);
}
}
function convertToBase64(input: ArrayBuffer) {
const uInt8Array = new Uint8Array(input);
const count = uInt8Array.length;
// Allocate the necessary space up front.
const charCodeArray = new Array(count) as string[];
// Convert every entry in the array to a character.
for (let i = count; i >= 0; i--) {
charCodeArray[i] = String.fromCharCode(uInt8Array[i]);
}
// Convert the characters to base64.
const base64 = btoa(charCodeArray.join(""));
return base64;
}
运行效果如下
点击Choose File按钮,弹出对话框,选择文件后,点击 Run 这个按钮,很快就能看到图片被插入到了工作表中。