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

点击按钮导出textarea文本为DOCX失败:mammoth.convertText未找到

问题:使用mammoth导出文本为DOCX时报错TypeError: mammoth.convertText is not a function

我需要实现点击按钮时,将textarea(outputTextElem)中的文本导出为DOCX文档,但现有代码无法正常运行。已引入mammoth.browser.min.js,执行时触发如下报错:

script.js:216 Error converting text to DOCX: TypeError: mammoth.convertText is not a function
    at HTMLButtonElement.<anonymous> (script.js:205:36)

相关代码

JavaScript实现代码

const downloadBtn = document.querySelector("#download-btn");
downloadBtn.addEventListener("click", async (e) => {
  const outputText = outputTextElem.value;
  const outputLanguage =
      outputLanguageDropdown.querySelector(".selected").dataset.value;

  if (outputText) {
    try {
      const result = await mammoth.convertText({ arrayBuffer: outputText }, {
        ignoreEmptyParagraphs: true
      });

      const blob = new Blob([result.value], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" });
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.download = `translated-to-${outputLanguage}.docx`;
      a.href = url;
      a.click();
    } catch (error) {
      console.error("Error converting text to DOCX:", error);
    }
  }
});

引入的脚本

<script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.4.2/mammoth.browser.min.js"></script>

问题原因

  1. mammoth库的用途理解错误:mammoth的核心功能是解析已有的DOCX文档,将其转换为HTML或纯文本,而非反向生成DOCX。mammoth.convertText这个方法根本不存在,属于误用API。
  2. DOCX格式认知错误:直接把纯文本包装成Blob并设置DOCX的MIME类型无效,DOCX是复杂的ZIP压缩包,内部包含特定结构的XML文件,不是简单的文本文件。

解决方案

要实现纯文本转DOCX,需要使用专门的生成类库,或手动构建符合DOCX规范的文件结构,以下是两种可行方案:

方案1:使用docx.js库生成DOCX

docx.js是专门用于生成DOCX文档的库,使用简单且功能完善:

  1. 引入docx.js库
<script src="https://unpkg.com/docx@8.5.0/build/index.js"></script>
  1. 修改JavaScript代码
const downloadBtn = document.querySelector("#download-btn");
downloadBtn.addEventListener("click", async (e) => {
  const outputText = outputTextElem.value;
  const outputLanguage = outputLanguageDropdown.querySelector(".selected").dataset.value;

  if (outputText) {
    try {
      // 创建DOCX文档实例,将文本拆分为段落
      const doc = new docx.Document({
        sections: [{
          children: outputText.split("\n").map(line => 
            new docx.Paragraph({
              children: [new docx.TextRun(line)],
              spacing: { after: 100 }
            })
          )
        }]
      });

      // 生成Blob并触发下载
      const blob = await docx.Packer.toBlob(doc);
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.download = `translated-to-${outputLanguage}.docx`;
      a.href = url;
      a.click();
      URL.revokeObjectURL(url); // 释放浏览器资源
    } catch (error) {
      console.error("Error converting text to DOCX:", error);
    }
  }
});

方案2:手动生成简单DOCX(依赖JSZip)

DOCX本质是ZIP压缩包,可通过构建基础XML结构并压缩实现:

  1. 引入JSZip库
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
  1. 修改JavaScript代码
const downloadBtn = document.querySelector("#download-btn");
downloadBtn.addEventListener("click", async (e) => {
  const outputText = outputTextElem.value;
  const outputLanguage = outputLanguageDropdown.querySelector(".selected").dataset.value;

  if (outputText) {
    try {
      const zip = new JSZip();
      
      // 添加DOCX必需的核心文件结构
      zip.file("[Content_Types].xml", `<?xml version="1.0" encoding="UTF-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="application/xml"/>
  <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
</Types>`);
      
      // 生成包含文本内容的文档XML
      const contentXml = `<?xml version="1.0" encoding="UTF-8"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:body>
    ${outputText.split("\n").map(line => `<w:p><w:r><w:t>${line}</w:t></w:r></w:p>`).join("")}
  </w:body>
</w:document>`;
      zip.folder("word").file("document.xml", contentXml);

      // 生成ZIP包并触发下载
      const blob = await zip.generateAsync({ type: "blob" });
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.download = `translated-to-${outputLanguage}.docx`;
      a.href = url;
      a.click();
      URL.revokeObjectURL(url);
    } catch (error) {
      console.error("Error converting text to DOCX:", error);
    }
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:49:57