html-docx-js 是最轻量靠谱的前端 HTML 转 Word 方案,纯前端生成 .docx blob,支持内联样式和 UTF-8 中文,但不支持 Flex/Grid、页眉页脚等高级特性。

用 document.execCommand('saveAs') 会失败,别试了
这个 API 在现代浏览器里基本被禁用了,Chrome 85+、Edge 89+、Firefox 也早就不支持,调用后直接静默失败,控制台可能连报错都没有。它只在 IE 或极老的 Electron 壳里能用,现在拿它导 Word 就是白忙活。
html-docx-js 是最轻量靠谱的选择
它不依赖后端,纯前端把 HTML 字符串转成 .docx 的二进制 blob,兼容性好,生成的 Word 文档能正常打开、编辑、带样式(内联 style、class 都认,但复杂 CSS Grid / Flex 会被忽略)。
- 必须传入完整的 HTML 字符串,不是 DOM 节点,所以得先用
element.outerHTML或new XMLSerializer().serializeToString(document.documentElement)拿到字符串 - 中文要加
encoding: 'UTF-8'配置项,否则 Word 里乱码(默认是 ASCII) - 图片只能转 base64 内嵌,不能用外链;如果 HTML 里有
<img src="https://..." alt="html怎么转换成word_html文档导出word格式【办公】" >,得提前 fetch 下来转成 data URL - 示例:
const html = '<h1>标题</h1><p>正文</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill12116" title="DeepBI DHTML 页面生成器"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20d3191a227.jpg" alt="DeepBI DHTML 页面生成器" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill12116" title="DeepBI DHTML 页面生成器">DeepBI DHTML 页面生成器</a> <p>生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur</p> </div> <a href="/xiazai/skill12116" title="DeepBI DHTML 页面生成器" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>';<br>const blob = htmlDocx.asBlob(html, { encoding: 'UTF-8' });<br>saveAs(blob, 'report.docx');
Word 样式塌陷的三个真实原因
导出后发现加粗没了、字体变了、段间距消失——不是库的问题,是 Word 对 HTML 解析太保守:
立即学习“前端免费学习笔记(深入)”;
- Word 不识别
margin,只认margin-top这种单边属性;写margin: 10px会被整个忽略 -
display: flex、position: absolute、@media全部失效,布局得退回 table 或 inline-block - 字体名要用英文全称,比如
font-family: 'Microsoft YaHei'可以,font-family: '微软雅黑'在部分系统上会 fallback 成宋体
需要页眉页脚或分栏?得切后端
html-docx-js 不支持页眉、页脚、目录、分节符、页码这些 Office 特性。真要这些,就得走服务端方案:
- Node.js 环境用
docxtemplater+ HTML 插件,但需预定义模板 .docx 文件 - Python 用
python-docx从零构建,或者weasyprint先转 PDF 再用 LibreOffice 命令行转 docx(soffice --headless --convert-to docx file.pdf) - 关键提醒:所有“HTML → Word”方案都绕不开语义降级——Word 不是浏览器,它只认它认的那一套 HTML 子集,想完全还原网页渲染效果,本身就是个伪需求


















