htmltodocx能保留格式是因为它逐节点解析html并把css单位换算为word支持的twip和半磅,写入标准ooxml结构;而复制粘贴仅传递渲染后文本,丢失table结构、style属性及语义信息。

HTMLtoDOCX 是唯一能直接把 HTML 字符串转成可打开 .docx 文件的轻量方案,不依赖 Word 进程、不走剪贴板、不上传服务器。复制粘贴或在线工具在表格、图片、内联样式上基本不可靠,别试了。
为什么 HTMLtoDOCX 能保留格式而复制粘贴不行
复制粘贴时浏览器只传“渲染后文本+极简样式”,Word 收不到 <table> 结构、<code>style 属性、background-color 或 border-collapse 等语义信息;HTMLtoDOCX 则逐节点解析 HTML,把 CSS 单位(如 px、em)换算成 Word 认的 twip 和 half-point,再写进 OOXML 标准结构里。
HTMLtoDOCX 的参数陷阱:字体和字号单位最容易错
-
font填'SimSun'或'Microsoft YaHei'就行,别用'sans-serif'——Word 不识别通用字体族名 -
fontSize单位是“半磅”,填22= 11 磅,填16= 8 磅;不是px,也不是rem -
margins单位是twip(1/1440 英寸),{ top: 1440 }= 上边距 1 英寸;填100会缩到看不见页眉 - 页脚要显示页码,必须同时设
footer: true和pageNumber: true,漏一个都不生效
图片和表格怎么不出错
本地图片(file://)路径不支持,只认 data:image/xxx;base64,... 或公网 URL;表格里 colspan/rowspan 没问题,但 display: grid 或 flex 容器里的表格会被当普通块级元素处理,结构会塌。
- 含图片的 HTML,确保
<img src="...">是 base64 或可公开访问的 URL - 避免用 CSS Grid/Flex 布局套表格;如果必须,先用
<div style="display: table"> 模拟 <li>表格边框丢失?检查是否用了 <code>border: none或border-style: hidden——HTMLtoDOCX不支持后者
Node.js 环境下生成文件的最小可靠写法
别省略 async/await,也别用 fs.writeFileSync 写 Promise 返回值;Buffer 必须等 HTMLtoDOCX resolve 后再写入。
const fs = require('fs');
const { HTMLtoDOCX } = require('html-to-docx');
const html = '<h1>测试文档</h1><p>含 <strong>加粗</strong> 和 @@##@@</p>';
(async () => {
try {
const buffer = await HTMLtoDOCX(html, null, {
font: 'Microsoft YaHei',
fontSize: 22, // 11pt
margins: { top: 1440, bottom: 1440, left: 1440, right: 1440 }
});
fs.writeFileSync('output.docx', buffer);
} catch (err) {
console.error('转换失败:', err.message);
}
})();
真正难的不是调用函数,而是你给它的 HTML 是否“足够 Word 友好”:语义清晰的标签、内联或 style 属性驱动的样式、避开现代布局 CSS——这些比选哪个库重要得多。











