You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将context.application.createDocument()结果转为Blob实现JavaScript下载

解决Word JS API创建文档后下载显示[Object][Object]的问题

问题原因

  1. 语法错误:代码中Blod是拼写错误(应为Blob),且Blob构造函数的参数格式错误(缺少包裹配置对象的{})。
  2. 核心逻辑错误:myDoc.body是Office JS的Body对象,并非可直接序列化的文本/二进制内容,直接将其传入Blob会被转为字符串[Object][Object]。
  3. API调用规范问题:Office JS的createDocument是异步方法,且需确保传入的base64是有效的**Office Open XML(OOXML)**格式,而非普通文本的base64。

解决步骤与修正代码

1. 修正基础语法错误

  • 把Blod改为Blob
  • 修正Blob构造函数的配置参数格式:new Blob([内容], {type: 'MIME类型'})

2. 正确获取文档的OOXML内容

Word文档的内容基于OOXML格式,需通过Office JS的异步API获取文档的OOXML base64内容,再转成二进制Blob进行下载。

修正后的完整代码(基于传入OOXML base64创建文档)

// 确保此处的base64是有效的Office Open XML格式内容
const validOoxmlBase64 = "base64 format string of valid Office Open XML";

// 异步创建文档
context.application.createDocument(validOoxmlBase64).then(myDoc => {
    // 异步获取文档Body的OOXML内容
    myDoc.body.getOoxmlAsync(result => {
        if (result.status === Office.AsyncResultStatus.Succeeded) {
            const ooxmlContent = result.value;
            downloadDoc(ooxmlContent);
        } else {
            console.error("获取文档内容失败:", result.error);
        }
    });
});

function downloadDoc(ooxmlContent) {
    // 将OOXML的base64字符串转为二进制数组
    const byteChars = atob(ooxmlContent);
    const byteNumbers = Array.from(byteChars, char => char.charCodeAt(0));
    const byteArray = new Uint8Array(byteNumbers);

    // 创建Blob(使用docx格式的MIME类型,兼容性更好)
    const blob = new Blob([byteArray], { 
        type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' 
    });

    // 触发下载
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'myDocFile.docx';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    
    // 释放URL对象,避免内存泄漏
    window.URL.revokeObjectURL(url);
}

如果需要插入HTML内容再下载

如果你的需求是将带样式的HTML内容转为Word文档,可先插入内容到新文档,再获取OOXML:

// 创建空文档后插入HTML内容
context.application.createDocument().then(myDoc => {
    const styledHtml = "<h1>测试标题</h1><p style='color:red;'>带颜色的段落</p>";
    myDoc.body.insertHtml(styledHtml, Office.InsertLocation.start);
    
    // 同步文档变更
    context.sync().then(() => {
        myDoc.body.getOoxmlAsync(result => {
            if (result.status === Office.AsyncResultStatus.Succeeded) {
                downloadDoc(result.value);
            }
        });
    });
});

// 复用上面的downloadDoc函数

关键注意事项

  • 异步操作:Office JS的多数API是异步的,必须通过回调或Promise处理结果,不能同步直接获取对象属性。
  • OOXML格式:确保传入createDocument的base64是有效的OOXML,或通过insertHtml/insertText等API插入内容后再获取OOXML。
  • MIME类型:推荐使用docx格式的MIME类型(application/vnd.openxmlformats-officedocument.wordprocessingml.document),旧的doc格式兼容性较差。

内容的提问来源于stack exchange,提问作者chaitanya k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:15:26