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

如何在生成PDF所用的HTML字符串中正确传入列表变量渲染表格

问题原因

表格加载失败由两个核心问题导致:

  • 模板字符串中直接插值JS对象数组时,数组会被默认调用toString()方法转成字符串,最终插入脚本的内容为loadTableData([object Object],[object Object]...),属于非法JS语法,代码无法正常运行。
  • 绝大多数HTML转PDF的工具默认不会执行HTML内的<script>标签逻辑,即便脚本语法正确,填充表格的代码也不会被触发。
  • 原始代码还存在<body>标签闭合位置错误、重复写开标签的问题,会导致DOM结构异常。
修复方法

优先选择在拼接HTML字符串阶段直接生成完整表格内容,完全去掉内嵌脚本逻辑,从根源规避PDF渲染环境不执行JS的问题,兼容性最好:

let amountList= [
  { name: 'store Amount', amount: 0 },
  { name: 'reinventAmount', amount: 0 },
  { name: 'Cost Amount', amount: 90 },
  { name: 'Total Amount', amount: 90 }
];

// 预生成表格行HTML
const tableContent = amountList.map(row => `
  <tr>
    <td>${row.name}</td>
    <td>${row.amount}</td>
  </tr>
`).join('');

let htmlStringUsedforPdf= `<html>
<body>
  <table border="1" cellpadding="6" cellspacing="0">
      <thead>
        <tr>
          <th>款项名称</th>
          <th>金额</th>
        </tr>
     </thead>
     <tbody class="sub-text" id="testBody">
       ${tableContent}
     </tbody>
    </table>
</body>
</html>`

如果你使用的PDF生成工具明确开启了JS执行权限(比如wkhtmltopdf配置了--enable-javascript参数),也需要先将数组序列化为合法JSON字符串再做插值,同时把脚本放到</body>标签前,保证DOM加载完成后再执行:

// 脚本部分修改示例
`
<script>
  function loadTableData(items) {
    const table = document.getElementById("testBody");
    items.forEach( item => {
      let row = table.insertRow();
      let name= row.insertCell(0);
      name.innerHTML = item.name;
      let amount= row.insertCell(1);
      amount.innerHTML = item.amount;
    });
  }
  // 序列化后再插值,保证插入的是合法JS对象格式
  loadTableData(${JSON.stringify(amountList)});
</script>
`

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:18:17