微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jspdf中的嵌套表

如何解决jspdf中的嵌套表

我正在使用 jspdf 开发表格。 我尝试将 autotable 放在 autotable 中。 问题是表格的行没有动态调整到插入表格的高度。 然后它重叠到下一行。

这是我的代码

doc.autoTable({ html: '#table',theme:'grid',overflow: 'linebreak',bodyStyles: {lineColor:[0,0],textColor:[0,0]},startX: 15,startY: 50,styles:{font:'noto'},headStyles : { halign: 'center',textColor: [0,fillColor:[255,255,255],linewidth: 0.1,lineColor:[0,0]
                                                },didDrawCell: function (data) {
                        if (data.cell.section === 'body' && data.column.index === 1 && data.row.index === 9) {
                          
                          document.getElementsByClassName("confluenceTable")[0].id = 'confluenceTable';
                          console.log("------test----")
                          console.log(document.getElementById("confluenceTable"))
                          data.cell.text = "";
                          doc.autoTable({
                                          html: '#confluenceTable',0]
                                                      },startY: data.cell.y + 2,margin: {left: data.cell.x + data.cell.padding('left')},tableWidth: 'wrap',})
                        } 
                      },didParseCell: function (data) {
                        if (data.cell.section === 'body' && data.column.index === 1 && data.row.index === 9) {
                          data.cell.text = "";
                        }
                      },//,columnStyles: {0: {fillColor: [212,212,212]},tableLineColor: [0,0]}
                      });

这是我的结果

enter image description here

解决方法

在创建嵌套表格之前,您必须在 didParseCell 事件中设置父单元格的最小高度并清除内容。并在 didDrawCell 事件中添加嵌套表作为额外内容。

这是一个在一个单元格中包含一个 HTML 表格和嵌套表格的示例。计算的高度是假设行的高度都相等。 (打字稿)

...
  this.yPos = 0;
  this.createAutoTable(myTableNode,{ startY: this.yPos + 20 })
...
 
  /**
   * create the autotable with the plugin
   */
  private createAutoTable(tableNode,tableStyle = {}): void {
    this.autoTable(this.doc,{
      ...tableStyle,html: tableNode,// event that can be used to override content or styles for a specific cell
      didParseCell: data => {
        const rawNode = data.cell.raw as HTMLTableCellElement;
        const nestedTable = rawNode.querySelector('table');
        if (nestedTable) {
          this.prepareCellForNestedTable(data.cell,nestedTable);
        }
      },// event to add additional cell content
      didDrawCell: data => {
        const rawNode = data.cell.raw as HTMLTableCellElement;
        const nestedTable = rawNode.querySelector('table');
        // if there is a nested table draw that table
        if (nestedTable) {
          const subTableStyle = {
            html: nestedTable,startY: data.cell.y + 4,margin: { left: data.cell.x + 4 },tableWidth: data.cell.width - 4
          };
          this.createAutoTable(nestedTable,subTableStyle)
        }
    });

    // @ts-ignore
    this.yPos = this.doc.lastAutoTable.finalY + 10;
  }

  /**
   * if there is a nested table inside a cell then clear the content and set the height of the cell
   */
  private prepareCellForNestedTable(cell,nestedTable: HTMLTableElement) {
    cell.styles.minCellHeight = this.getTotalRows(nestedTable) * 11; // calc how many rows are needed?
    cell.text = [];
  }

  /**
   * Count total rows of nested table for calculating the height of primary table (assumption 1 row height cells)
   */
  private getTotalRows(table): number {
    return table.querySelectorAll('tr').length;
  }

这是html渲染: enter image description here

这是pdf结果: enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?